JAVA中的protected(详解),以及和clone()方法有关的一些问题
来源:互联网 发布:淘宝上在哪申请信用卡 编辑:程序博客网 时间:2024/06/04 19:36
http://blog.csdn.net/ciawow/article/details/8262609
********************************************************
很多的有关介绍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。
0 0
- 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方法
- 线性支持向量机中最优参数b
- ImageLoder画圆
- Android中解析数据集合的写法
- iOS生命周期
- 多态继承的运行时绑定
- JAVA中的protected(详解),以及和clone()方法有关的一些问题
- android控件weight
- android端通过接口获取数据库中数据
- 堆栈分析
- android 百度定位
- DOMchildNOdes
- jQuery零碎相关
- xListview
- Nyist 915 +-字符串