package p1;
public class Father1 {
protected void f() {
} // 父类Father1中的protected方法
}
package p1;
public class Son1 extends Father1 {
}
package p2;
public class Son2 extends Father1{
}
package p1;
public class Test {
public static void main(String[] args) {
Son1 son1 = new Son1();
son1.f(); // Compile OK ----(1)
son1.clone(); // Compile Error ----(2)
Son2 son = new Son2();
son2.f(); // Compile OK ----(3)
son2.clone(); // Compile Error ----(4)
Test t = new Test();
t.clone; // Compile OK
// 测试类test只可以使用test类的继承Object类而来的test.clone()方法
}
}
package P1;
public class Test {
public static void main(String args[]) throws CloneNotSupportedException {
MyObject obj = new MyObject();
obj.clone(); // Compile OK ------(1)
}
}
package P2;
public class MyObject extends Test {
}
package P1;
public class MyObject {
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
MyObject obj = new MyObject();
obj.clone(); // Compile OK ----(1)
}
}
package p1;
class MyObject extends Test{
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
MyObject obj = new MyObject();
obj.clone(); // Compile OK -------(1)
}
}
package p1;
public class Test {
}
class MyObject extends Test {
public static void main(String[] args) {
Test test = new Test();
test.clone(); // Compile Error ----- (1)
}
}
package A;
public class Animal {
protected void crowl(String c){
System.out.println(c);
}
}
package B;
import A.Animal;
class Cat extends Animal
{
}
public class Rat extends Animal{
public void crowl(){
this.crowl("zhi zhi"); //没有问题,继承了Animal中的protected方法——crowl(String)
Animal ani = new Animal();
ani.crowl("animail jiaojiao"); //wrong, The method crowl(String) from the type Animal is not visible
Cat cat=new Cat();
cat.crowl("miao miao"); //wrong, The method crowl(String) from the type Animal is not visible
}
}
若子类与基类不在同一包中,子类不能访问基类实例的protected方法。
若子类与基类不在同一包中,子类不能访问亲兄弟实例所继承的protected修饰的方法。
例子9
package a;
public class A {
protected void m(){
System.out.println("A m~~~");
}
}
package b;
import a.A;
public class B extends A {
void callM() {
m(); // ok
super.m(); // ok
B b = new B(); // ok
b.m(); // ok
}
}
package b;
import a.A;
public class C extends A {
void callM() {
m(); // ok
super.m(); // ok
B b = new B(); // ok
b.m(); //The method m() from type A is not visible
}
}