ProtectedClass p;
p = new ProtectedClass();
// 同一包中可以直接访问ProtectedClass中的方法 printX()
p.printX();
}
}
同一包中保护访问级别与默认访问级别一样,可以直接访问ProtectedClass的printX()方法,上述代码可以编译通过。
在不同的包中调用ProtectedClass类代码如下:
// 默认包中HelloWorld.java文件
import com.Kevin.ProtectedClass;
public class HelloWorld {
public static void main(String[] args) {
ProtectedClass p;
p = new ProtectedClass();
// 编译错误,不同包中不能直接访问保护方法printX()
p.printX();
}
}
该HelloWorld.java文件与ProtectedClass类不在同一个包中,不同包中不能直接访问保护方法printX(),所以p.printX()方法无法编译通过。
在不同的包中继承ProtectedClass类代码如下:
// 默认包中SubClass.java文件
import com.Kevin.ProtectedClass;
public class SubClass extends ProtectedClass {
void display() {
//printX()方法是从父类继承过来
printX();
//x实例变量是从父类继承过来
System.out.println(x);
}
}
不同包中SubClass从ProtectedClass类继承了printX()方法和x实例变量。代码第8行是调用从父类继承下来的方法,代码第10行是调用从父类继承下来的实例变量。
提示 访问成员有两种方式:一种是调用,即通过类或对象调用它的成员,如p.printX()语句;另一种是继承,即子类继承父类的成员变量和方法。
公有访问级别任何情况下两种方式都可以;
默认访问级别在同一包中两种访问方式都可以,不能在包之外访问;
保护访问级别在同一包中与默认访问级别一样,两种访问方式都可以。但是在不同包之外只能继承访问;
私有访问级别只能在本类中通过调用方法访问,不能继承访问。
提示 访问类成员时,在能满足使用的前提下,应尽量限制类中成员的可见性,访问级别顺序是:私有级别→默认级别→保护级别→公有级别。