一文搞懂JAVA 修饰符

一文搞懂JAVA 修饰符

在Java中,修饰符(Modifier)是用来限制或者开放类、接口、方法和变量的访问权限;限制或者限制方法的继承或其他行为。Java中的修饰符分为以下几种:

  • 访问控制修饰符:public,private,protected和默认(即不写)四种修饰符。
  • 继承控制修饰符:final 和 abstract 两种修饰符。
  • 静态修饰符:static 修饰符。
  • 其他修饰符:synchronized 和 transient 等修饰符。

访问控制修饰符

public

public 是最常用的访问控制修饰符,它表示公开的、最高访问级别,可以在同名类或任意一个类中被访问到。例如:

public class Animal {
    public void eat(){
        System.out.println("Animal is eating...");
    }
}

public class Dog extends Animal {
    public void bark(){
        System.out.println("Dog is barking...");
    }
}

public class Test {
    public static void main(String[] args){
        Dog dog = new Dog();
        dog.eat();
        dog.bark();
    }
}

private

private 表示这个成员变量或方法只能在该类的内部可见,不能在外部被访问到。例如:

public class Animal {
    private String name;
    public Animal(String name){
        this.name = name;
    }
    private void printName(){
        System.out.println("Animal's name: " + name);
    }
}

public class Dog extends Animal {
    public Dog(String name){
        super(name);
    }
    public void printOwner(){
        System.out.println("My owner's name is: " + name);
    }
}

public class Test {
    public static void main(String[] args){
        Dog dog = new Dog("Lucy");
        dog.printName();// 编译错误,方法私有
        dog.printOwner();// 正常输出
    }
}

protected

protected 对该类和其子类可见,即同一个包内的其他类和该类的子类可以访问该成员。例如:

package com.demo;
public class Animal {
    protected String name;
    public Animal(String name){
        this.name = name;
    }
}

package com.demo;
public class Dog extends Animal {
    public Dog(String name){
        super(name);
        System.out.println(name); // animal's name
    }
}

package com.test;
import com.demo.Dog;
public class Test {
    public static void main(String[] args){
        Dog dog = new Dog("Lucy");
        dog.name;// 编译错误,不在同一个包内
    }
}

默认访问控制

如果一个类、方法或变量没有声明任何访问控制修饰符(即不加 public、private 或 protected 这些修饰符之一),则它具有默认访问控制,即在同一个包内可见。

继承控制修饰符

final

final 修饰的类不能被继承,修饰方法则不能被子类重写,修饰变量则表示该变量为常量。例如:

public final class Animal {
    public void eat(){
        System.out.println("Animal is eating...");
    }
}

public class Dog extends Animal { // 编译错误,final类不能继承
}

public class Cat extends Animal {
    public void eat(){
        System.out.println("Cat is eating fish...");
    }
}

public class Test {
    public static void main(String[] args){
        Cat cat = new Cat();
        cat.eat();//吃鱼
    }
}

abstract

abstract 修饰类表示该类是一个抽象类,不能被实例化,只能被继承。abstract 修饰方法表示该方法是一个抽象方法,没有实现。例如:

public abstract class Animal {
    public void eat(){ // 普通方法
        System.out.println("Animal is eating...");
    }
    public abstract void bark(); // 抽象方法
}

public class Dog extends Animal {
    public void bark(){
        System.out.println("Dog is barking...");
    }
}

public class Test {
    public static void main(String[] args){
        Animal animal = new Animal();// 编译错误,抽象类无法实例化
        Dog dog = new Dog();
        dog.eat(); // 吃
        dog.bark(); // 叫
    }
}

静态修饰符

static 修饰的方法或者变量是属于该类本身,不属于具体的实例,可以被该类的所有实例访问。例如:

public class Dog {
    private static String name;
    public Dog(String name){
        Dog.name = name;
    }
    public static void printName(){
        System.out.println(name);
    }
}

public class Test {
    public static void main(String[] args){
        Dog dog1 = new Dog("Lucy");
        Dog dog2 = new Dog("Lily");
        dog1.printName();//Lily,因为最后一次赋值为Lily,name被静态修饰
        dog2.printName();//Lily
    }
}

其他修饰符

synchronized

synchronized 修饰方法表示该方法为同步方法,同一时间只能有一个线程访问该方法。例如:

public class Animal {
    public synchronized void eat(){ // 同步方法
        System.out.println("Animal is eating...");
    }
}

public class Test {
    public static void main(String[] args){
        Animal animal = new Animal();
        new Thread(() -> animal.eat()).start();
        new Thread(() -> animal.eat()).start();
    }
}

transient

transient 修饰的变量表示该变量不会被序列化,即不会保存到输出流中。例如:

public class Animal implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private transient int age;
}

public class Test {
    public static void main(String[] args) throws Exception {
        Animal animal = new Animal();
        animal.name = "Lucy";
        animal.age = 3;
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("animal.txt")));
        oo.writeObject(animal);
        oo.close();
        ObjectInputStream oi = new ObjectInputStream(new FileInputStream(new File("animal.txt")));
        Animal newAnimal = (Animal) oi.readObject();
        oi.close();
        System.out.println(newAnimal.name);//Lucy
        System.out.println(newAnimal.age);//0,因为age属性被transient修饰了,不会被序列化
    }
}

总结

本文介绍了Java中修饰符的应用,涉及到访问控制修饰符、继承控制修饰符、静态修饰符和其他修饰符。看完本文,相信大家对Java中的修饰符会有更深刻的理解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂JAVA 修饰符 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • vueappend()方法

    Vue.append()方法是Vue.js框架中的一个实例方法,用于将一个组件实例添加到指定的DOM元素中。以下是一个完整攻略,介绍了如何使用Vue.append()方法。 步骤1:创建Vue组件实例 首先,需要创建一个Vue组件实例。以下是一个示例: var MyComponent = Vue.extend({ template: ‘<div>…

    other 2023年5月6日
    00
  • 值得收藏的五个种子搜索引擎&磁力搜索引擎

    种子搜索引擎和磁力搜索引擎是用于搜索和下载种子文件和磁力链接的工具。本文将介绍五个值得收藏的子搜索引擎和磁力搜索引擎,并提供两个示例说明。 1. BT Kitty BT Kitty是一个功能强大的子搜索引,可以搜索各种类型的种子文件和磁力链接。它的搜索结果非常准确,而且速度非常快。以下使用BT Kitty搜索影的示例: 打开BT Kitty网站(https:…

    other 2023年5月7日
    00
  • 如何利用adb卸载手机预装软件(系统软件)

    如何利用adb卸载手机预装软件(系统软件) 以下是利用adb卸载手机预装软件的完整攻略: 步骤1:启用开发者选项和USB调试模式 在手机的设置中,找到“关于手机”或“关于设备”选项,连续点击“版本号”或“构建号”多次,直到开启开发者选项。然后返回到设置主界面,找到“开发者选项”,进入并启用“USB调试”模式。 步骤2:连接手机到电脑 使用USB数据线将手机连…

    other 2023年10月13日
    00
  • 详解SpringBoot程序启动时执行初始化代码

    我们来详细讲解一下如何在SpringBoot程序启动时执行初始化代码的完整攻略。 什么是SpringBoot SpringBoot是一个开箱即用的轻量级框架,它可以帮助我们快速的构建一个基于Spring的Web应用程序,简化了Spring的配置,提供了自动化配置,是一个优秀的快速开发框架。 在SpringBoot程序启动时执行初始化代码的两种方案 方案1:使…

    other 2023年6月20日
    00
  • android-富文本编辑器

    Android富文本编辑器攻略 在Android应用程序中,富文本编辑器是一种非常有用的工具,它允许用户创建和编辑富文本内容,包括文本样、图片、链接等。在本攻略中,我们将介绍如何在Android应用程序中使用富文本编辑器。 步骤1:添加依赖项 要使用富文本编辑器,我们需要添加相应的依赖项。以下是一个示例: dependencies { implementat…

    other 2023年5月9日
    00
  • Vue脚手架编写试卷页面功能

    Vue脚手架编写试卷页面功能攻略 本攻略将详细介绍如何使用Vue脚手架编写试卷页面功能。Vue脚手架是一个用于快速搭建Vue项目的工具,它提供了一套基础的项目结构和配置,使得开发者可以更加高效地开发Vue应用。 步骤一:创建Vue项目 首先,我们需要使用Vue脚手架创建一个新的Vue项目。请确保你已经安装了Node.js和Vue脚手架。 打开终端,执行以下命…

    other 2023年8月3日
    00
  • 如何解决应用程序或dll 为无效的windows映像的问题

    问题描述: 当你尝试启动程序或应用程序时,你可能会收到一个错误提示,如“应用程序或dll文件不是Windows映像”,这意味着你尝试运行的程序或应用所依赖的dll文件被损坏或缺失,导致Windows无法正确加载该文件。这是一个常见的问题,下面我将为您提供解决此问题的完整攻略。 解决步骤如下: 步骤1:卸载并重新安装有问题的程序 首先,你应该尝试卸载有问题的程…

    other 2023年6月25日
    00
  • java子类怎样创建

    介绍Java子类创建的完整攻略,包括以下几个方面: 什么是Java子类 创建Java子类的步骤 如何继承父类实例变量和方法 如何调用超类的构造器 创建Java子类的示例 具体说明如下: 什么是Java子类 Java子类是指在一个已有Java类的基础上,派生出一个新类,新类继承了原有Java类的属性和方法。在Java中,子类通过继承父类的成员来继承父类的属性和…

    其他 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部