JAVA中的protected(详解),以及和clone()方法有关的一些问题
来源:互联网 发布:linux wc l 少一行 编辑:程序博客网 时间:2024/05/16 00:44
很多的有关介绍JAVA语言的书籍,都对protected介绍的比较的简单,就是被protected修饰的成员或方法,对于本包和其子类可见,这里说的并不是完全的正确。
对于protected的成员或方法,要分子类和超类是否在同一个包中。
与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类实例本身的受保护成员。
* Class SubB
has access only to the inherited from Base
protected elements, i.e. its own elements, but the protecteddata of other Base
instances is not accessible from SubB
.
下面是借用别人的一些例子,相信你看完了,你也就彻底了解了protected
ex1:
class MyObject {}
public class Test {
public static void main(String[] args) {
MyObject obj = new MyObject();
obj.clone(); // Compile error.
}
}
虽然MyObject与Test属于同一个包,但受保护的clone方法来自java.lang.Object类型,而在Test中,其基类Object的受保护方法是不可见的。
ex2:
class MyObject2 {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Test2 {
public static void main(String[] args) throws CloneNotSupportedException {
MyObject2 obj = new MyObject2();
obj.clone(); // Compile OK.
}
}
MyObject与Test在同一个包中,受保护的clone方法来自MyObject本身,所以它对Test而言是可见的。另外在这个示例中,还说明了super关键字对于基类受保护成员的调用是个语言设计之中的“例外”。ex3:
package 1
class MyObject3 {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package 2
public class Test3 extends MyObject3 {
public static void main(String args[]) {
MyObject3 obj = new MyObject3();
obj.clone(); // Compile error.
Test3 tobj = new Test3();
tobj.clone();// Complie OK.
}
}
企图跨越不同的包,从子类中调用基类实例的受保护方法。明显不行。ex4:
class MyObject extends Test{}
public class Test {
public static void main(String[] args) {
MyObject obj = new MyObject();
obj.clone(); // Compile ok.
}
}
public class Test {
public static void main(String[] args) {
MyObject obj = new MyObject();
obj.clone(); // Compile ok.
}
}
为什么可见呢?因为MyObject的clone方法继承自Test,而Test做为相对于Object的子类,是可以访问继承而来的属于它自己的受保护方法的。
ex5:
package 1
class MyObject extends Test {
}
package 2
public class Test {
public static void main(String args[]) {
MyObject obj = new MyObject();
obj.clone(); // Compile OK
}
}
虽然处于不同的包,但子类的受保护方法实际上继承自父类,父类的自己的受保护方法对自己可见,其原理同示例4.
ex6:
class MyObject extends Test {
}
package 2
public class Test {
public static void main(String args[]) {
MyObject obj = new MyObject();
obj.clone(); // Compile OK
}
}
虽然处于不同的包,但子类的受保护方法实际上继承自父类,父类的自己的受保护方法对自己可见,其原理同示例4.
ex6:
package 1
class MyObject extends Test {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package 2
public class Test {
public static void main(String args[]) {
MyObject obj = new MyObject();
obj.clone(); // Compile error!
}
}
不同包中子类本身的受保护方法当然不可能对父类可见
class MyObject extends Test {
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package 2
public class Test {
public static void main(String args[]) {
MyObject obj = new MyObject();
obj.clone(); // Compile error!
}
}
不同包中子类本身的受保护方法当然不可能对父类可见
ex7:
package a;
class MyObject extends Test {
public static void main(String[] args) {
Test test = new Test();
test.clone(); // Compile error.
}
}
package a;
public class Test {
}
同一个包中,父类实例的clone方法在子类中依然不可见,原理同示例1,就是因为父类的clone方法,实际上来自java.lang.Object。
class MyObject extends Test {
public static void main(String[] args) {
Test test = new Test();
test.clone(); // Compile error.
}
}
package a;
public class Test {
}
同一个包中,父类实例的clone方法在子类中依然不可见,原理同示例1,就是因为父类的clone方法,实际上来自java.lang.Object。
- JAVA中的protected(详解),以及和clone()方法有关的一些问题
- JAVA中的protected(详解),以及和clone()方法有关的一些问题
- Java 中 Object.clone() 方法以及protected 的一点思考
- Java-Object的clone方法 protected的相关问题。
- 详解Java中的clone方法
- 详解Java中的clone方法
- Java中的clone方法详解
- Java中的clone方法详解
- 详解Java中的clone方法
- 详解Java中的clone方法
- java 中的clone方法 ,详解
- 详解Java中的clone方法
- 详解java中的clone方法
- 详解Java中的clone方法
- JAVA中的clone()方法详解
- 详解Java中的clone方法
- 详解Java中的clone方法
- 详解Java中的clone方法
- 主机序和网络序
- 入职一月
- 例题8.3.5
- Jquery插件Thickbox的使用总结及自定义设置
- wildmagic 内存连续的多维数组申请与释放
- JAVA中的protected(详解),以及和clone()方法有关的一些问题
- 原创视频《我是程序yuan》,属于程序yuan的快乐和精彩
- Portal
- VIM基本操作和设置
- zoj1955-Quadtree
- Linux下适合开发者的七款编辑器
- java文件操作
- 码畜、码奴、码农、IT民工和IT其他工种的划分定义
- 系统广播详解之开机自动运行程序