为什么我们可以使用clone()
表示法访问super.
方法,但无法通过创建Object类型的新对象来访问它。例如,如果我做了像
Object obj = new Object();
然后(使用Eclipse)我无法使用点运算符查看clone()
方法,这表明obj无法查看Object
类的受保护成员(只有公共方法可见)。 / p>
现在,如果我使用super
关键字,即使用super.
,我也可以查看受保护的方法。
所以我的问题是在一个没有显式继承(扩展)其他类的类中 - 我知道它给Object类构造函数一个隐式调用,即Object类是它的超类 - 为什么可以使用super关键字访问Object类的受保护成员,但是通过创建Object类的实例不能实现(只有公共成员对Object类的实例可见)?
这里有更清晰的代码(虽然没有意义但是第一部分符合而其他部分没有):
public class temp {
public temp() {
// TODO Auto-generated constructor stub
TestBikes t1 = new TestBikes();
Object ob1 = new Object();
try {
t1 = (TestBikes)super.clone(); //SUPER KEYWORD IS ABLE TO ACCESS
//PROTECTED MEMBERS OF Object
//CLASS
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
t1 = (TestBikes)ob1.clone(); // HERE IS THE ERROR SAYING clone()
// FROM Object CLASS IS NOT VISIBLE
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:4)
protected
表示只能由子类(或同一个包中的类)访问。因此,您可以使用this
或super
或任何内容在子类中访问它,但不是另一个例子。
您的示例已编译,但无法运行。
try {
t1 = (TestBikes)super.clone(); // creates a clone of temp, not a TestBikes
t1 = (TestBikes)this.clone(); // does the same thing
t1 = (TestBikes)clone(); // does the same thing
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BTW:我知道这只是一个例子,但在它的构造函数中克隆一个对象是一个坏主意。
必须对其进行保护,以便您可以在实现Cloneable
的子类中访问它。但是,并非所有对象都是可复制的,因此通常无法访问。
使用super
可以访问受保护的方法。使用引用来制作方法要求该方法是可访问的,例如公共或包裹本地和包在同一个包中。
AFAIK,一般认为clone()/ Cloneable API已被破坏,应该避免(基本数组除外),例如: Cloneable接口没有Object clone();
方法使其公开,并返回必须强制转换的Object
。