Java 修饰符(public、protected、default、private、static、final、abstract)
1、对类的访问修饰符
class前面只能使用public和默认default。
public对所有类可见,default对包内类可见。
2、对属性和方法的访问修饰符
Java访问控制符_初尘19的博客-CSDN博客 总结得很简练。
protected的规则有点麻烦,后面会单独整理一下。
这四种访问控制规则,在后面添加了final、static等非访问修饰符时,可见的形式可能会发生变化(比如static方法可以通过“类名.方法名”直接调用),但是否可见不会发生变化(private的static方法,依然不能被其他类调用)。
3、final
用于修饰类、属性、方法、局部变量
- 修饰类:类不能被继承(抽象类就无法使用final)
- 修饰属性/局部变量:不能被修改,相当于常量,被 final 修饰的实例变量必须显式指定初始值。
- 修饰方法:该方法可以被继承,但不能被重写
4、static
参考 [java]static关键字的四种用法 - dotgua - 博客园 (cnblogs.com)
static不能修饰一个外部类
用于修饰内部类(静态内部类的内容后续补充)、属性、方法、代码块、局部变量
- 修饰属性:将对象的属性变成了类的属性,每个类只有唯一的这一个属性,该类的对象共享该类的一个静态属性。这个特性导致静态变量可能涉及到并发的问题。
- 修饰方法:不用先创建对象再调用方法,直接用 类名.静态方法名 调用该方法
- 修饰代码块:静态代码块在该类加载的时候就会运行,普通代码块在创建实例的时候才会运行
- 修饰内部类:只能修饰内部类,叫做静态内部类。static修饰外部类会报语法错误
有几点需要注意:
- 静态成员不能访问非静态成员
- 静态方法不能被重写(语法错误,过不了编译),只能被覆盖/重载。具体原理可以参考 Java 静态方法不能被重写
- 静态内部类不会在外部类加载的时候就加载,而是在调用的时候才会被加载。这种懒加载的特性被用在单例模式中
5、abstract
用于修饰类、方法
- 修饰类。抽象类一般用于设计,抽象类存储一些未实现的方法,子类通过继承来实现这些方法
- 修饰方法。抽象方法没有方法体(没有'{}'及其中的内容),格式和C语言的函数声明一样
注意:
- 一个类只要有abstract修饰,就是抽象类,哪怕它没有任何的抽象方法。如果子类未实现所有抽象方法,则需要显式声明为抽象类
- 抽象类不能实例化(即使所有方法都有方法体),除此之外拥有类的其他功能,可以包含成员、非抽象方法、构造器、静态属性、具有方法体的静态方法等
- 一个实现了所有方法的类仍可以用abstract修饰,但一个有方法体的方法不能用abstract修饰。
- 抽象方法不能被声明成 final 和 static。声明成final,则子类无法继承该方法并实现该方法,声明成static则该抽象方法本身无方法体,不可被调用,子类继承并重写该静态方法后,只能调用子类的静态方法,无法体现出父类的静态方法的特点(实际上,静态方法不能被重写)