引子
- 我们都知道Object类中的clone方法是一个protected方法:
protected native Object clone() throws CloneNotSupportedException;
复制代码
-
protected修饰符的含义:以前一直认为protected修饰的方法变量是对同一包和其子类可见的。
-
疑惑:Object是所有类的父类,那么应该其他类都可以直接访问clone()方法,为什么结果不行呢?
package com.txl;
import com.example.Son;
public class Test4 {
public static void main(String[] args) throws CloneNotSupportedException {
Son son = new Son();
son.method1(5);
son.clone();//编译报错:'clone()' has protected access in 'java.lang.Object'
}
}
复制代码
案例1:
- 看1个案例:
- com.txl包下的Father类,其中有一个protected方法
package com.txl;
public class Father类{
protected void method1(int a){
System.out.println(a);
}
}
复制代码
- com.example包下的Son类继承Father类且和Father类不在同一个包下
package com.example;
import com.txl.Father;
public class Son extends Father {
}
复制代码
- com.example包下的Test5类。
package com.example;
public class Test5 {
public static void main(String[] args) {
Son son = new Son();
son.method1();//编译报错:'method1(int)' has protected access in
}
}
复制代码
- 现象
-
Father在com.txl包下, Son类和Test5类在com.example包下。Son继承了Father类,那么也继承了Father类中的protected方法method1(int a)。但是在com.example包下的Test5类中通过Son实例调用该方法时son.method1();却编译不通过。
-
原因:当Test4类和protected方法所在类的包不在同一个包时,不能在一个子类Test4中访问另一个子类Son继承的protected方法。
-
可以的情况:1. com.txl包下通过Son实例调用该方法,2. 或者在Son类里面调用该方法(此时在该类中调用,相当于直接调用继承的父类的protectd方法)。
- 可以调用protected方法的例子:
-
- 在Son类里面调用protected方法:注意此时父类Father是com.txl包,子类Son是com.example包,还是不在用一个包。
package com.example;
import com.txl.Father;
public class Son extends Father {
public static void main(String[] args) throws CloneNotSupportedException {
new Son().method1(12);
new Son().clone();
}
}
复制代码
-
- 在Father包下:可以在该包下的任意一个类中调用protected方法。此时protected修饰符相当于public
-
注意:在com.txl;包下的Test4类中调用son.method1(5);此时也是可以编译通过的。
package com.txl;
import com.example.Son;
public class Test4 {
public static void main(String[] args) throws CloneNotSupportedException {
Son son = new Son();
//这里为什么能在Test4类中访问Son继承自Father的protected方法呢?因为Test4类和Father在同一个包
son.method1(5);
Test4 test4 = new Test4();
//在Test4本类里面,可以通过对象调用从Object继承过来的clone()方法。当然会报错,因为该类没有实现Cloneable接口
test4.clone();
}
}
复制代码
小结
-
- protected修饰的方法或者变量:可以在同一个包下(protected修饰的方法或者变量所在的包)的任意位置访问,此时protected相当于public。
-
- 当子类继承了父类中的protected方法或者变量时,也要满足小结1,可以在protected方法所在包下调用。除了该规则也可以在本类中调用该protected方法或者变量。
-
-
主要还是包规则:protected修饰的方法变量只能在本报下访问,或者在子类内部访问。
-
© 版权声明
THE END
暂无评论内容