Java protected 详解
可见性有以下两点:
- 被protected修饰的成员对本包内的成员及其子类可见
- 若基类和子类不在同一包中,那么在子类中:子类实例可以访问从基类继承来的protected()方法,子类中的基类实例不能访问protected()方法。
例题1
首先要了解一下:clone()方法是Object类的protected方法
接下来看例题
package p2;
class Seefirst{
//重写了clone()方法
protected Object clone() throws CloneNotSupportedException{
retrun super.clone();
}
}
package p22;
public class Test2 extends Seefirst {
public static void main(String args[]){
Seefirst obj=new Seefirst();
obj.clone();
/*Compile Error -----子类实例才能继承protected的方法
* 该obj是Seefirst类的基类实例,所以会出现编译错误
*/
Test2 tobj=new Test2();
tobj.clone();
//Compile OK -----tobj是Test2类,也就是Seefirst类的子类实例,可以编译成功
}
}
}
例题2
package p3;
class Seefirst3 extends Test3 {
}
package p33;
public class Test3 {
public static void main(String args[]) {
Seefirst3 obj = new Seefirst3();
obj.clone();
/*Compile OK ------clone()方法其可见性为包p33及其子类Seefirst3,这里的obj属于子类实例,
编译通过。*/
}
}
例题3
package p1;
public class Father1 {
protected void f() {} // 父类Father1中的protected方法
}
package p1;
public class Son1 extends Father1 {}
package p11;
public class Son11 extends Father1{}
package p1;
public class Test1 {
public static void main(String[] args) {
Son1 son1 = new Son1();
son1.f(); // Compile OK ----(1)
son1.clone(); // Compile Error ----(2)
Son11 son = new Son11();
son11.f(); // Compile OK ----(3)
son11.clone(); // Compile Error ----(4)
}
}
首先看(1)(3),其中的f()方法从类Father1继承而来,其可见性是包p1及其子类Son1和Son11,而由于调用f()方法的类Test1所在的包也是p1,因此(1)(3)处编译通过。其次看(2)(4),其中的clone()方法的可见性是java.lang包及其所有子类,对于语句"son1.clone();“和"son11.clone();”,二者的clone()在类Son1、Son11中是可见的,但对Test1是不可见的,因此(2)(4)处编译不通过。