修饰符
Java中存在很多修饰符,包括访问修饰符和非访问修饰符。
我们在这里重点讲一下访问修饰符。
访问修饰符包括public,protected,default,private。
public:: 对所有类可见。使用对象:类、接口、变量(成员变量)、方法。
protected:对同一包内的类和子类可见。使用对象:变量(成员变量),方法。(不能够外部类和接口)。
default(默认,什么都不写):对同一包内的类可见,不使用任何修饰符时默认为default。使用对象:类,接口,方法。
private:在同一类内可见。使用对象:变量(成员变量),方法。(不能修饰外部类和接口)。
说明:子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
例:
package TestPackage2;
import TestPackage.Test;
public class TestClass extends Test { //TestClass类继承了不同包中的Test类
public static void main(String[] args) {
Test test = new Test();
TestClass testClass = new TestClass();
test.method(); //这里会报错,不能访问基类实例的protected方法
testClass.method(); //可以访问子类从基类继承而来的protected方法
}
}
如以上代码所示,test.method()不能成功编译,testclass.method()可以编译并且成功运行。
public
public被称为公有访问修饰符。
被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。
如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
Java 程序的 main() 方法必须设置成公有的,否则,Java 解释器将不能运行该类。
protected
protected被称为受保护的访问控制符。
protected 需要从以下两个个点来分析说明:
子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
在接口中,接口的成员和方法不能被定义为protected。
default
default即默认,什么也不写。
什么也不写的话,只在同一个包内可见。
default不能在类中刻意的写出来,无论是修饰成员还是方法,刻意把default写出来会报错,
default在定义接口的时候可以写出来修饰接口中的方法,被default修饰的接口中的方法可以拥有方法体。
default修饰的目的是让接口可以拥有具体的方法,让接口内部包含了一些默认的方法实现。
被default修饰的方法是接口的默认方法。既只要实现该接口的类,都具有这么一个默认方法,默认方法也可以被重写。
我们可以想象这么一个场景,既实现某个接口的类都具有某个同样的功能,如果像Java8以前的版本,那么每个实现类都需要写一段重复的代码去实现那个功能,显得没有必要。这就是存在的意义。
private
私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。
Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据。