Java访问修饰符

作者ChihMinh,原作链接https://chihminh.github.io/2016/08/28/modifier/,转载请注明出处

根据Java文档

Access level modifiers determine whether other classes can use a particular field or invoke a particular method. There are two levels of access control:

  • At the top level—public, or package-private (no explicit modifier).
  • At the member level—public, private, protected, or package-private (no explicit modifier).

即访问修饰符决定一个类能够调用别的类的特定域或者方法,分顶级修饰符和成员修饰符。 顶级访问修饰符修饰类名或者接口名,默认无修饰符是包内访问。
以下是成员级别的访问修饰符的控制范围

注意访问修饰符是基于类的控制权限,不是对象级别的,比如说一个方法可以访问所属类的所有对象的私有方法,参考《Java核心技术 卷一》

下面按照普通类、抽象类、接口来总结。

普通类

所有访问修饰符可修饰成员变量、成员方法、构造器。
类名只能由public修饰,或者默认没有(只能从包内访问类)。

接口

成员变量默认是public static final 修饰,不用显示修饰。
方法默认是public abstract修饰。
接口 由public修饰或者默认没有(只能包内访问)。

抽象类

成员变量任意
方法可以有非抽象方法(任意)。
抽象方法,不能private修饰,不然无法重写。
抽象类是指包含抽象方法的类,抽象方法示例“abstract void f(int a);”必须有abstract修饰,没有方法体抽象类必须有abstract修饰。而实际上抽象类可以没有抽象方法,只需有abstract修饰 class即可,但这样抽象类有什么意思?

总结

请注意以下方法继承的规则:

  • 父类中声明为public的方法在子类中也必须为public。(访问权更强)
  • 父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。(访问权更强)
  • 父类中默认修饰符声明的方法,能够在子类中声明为private。
  • 父类中声明为private的方法,不能够被继承。