0

为什么我们可以clone()使用super.符号访问方法,但不能通过创建 Object 类型的新对象来访问它。例如,如果我做类似的事情

Object obj = new Object();

然后(使用 Eclipse)我无法clone()使用点运算符查看方法,这表明 obj 无法查看Object类的受保护成员(只有公共方法可见)。

现在,如果我使用super关键字 ie use 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();
        }
    }

}
4

1 回答 1

4

protected表示只能由子类(或同一包中的类)访问,因此您可以在子类中使用thisorsuper或 nothing 访问它,但不能访问另一个实例。

您的示例可以编译,但不会运行。

    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();
    }

顺便说一句:我知道这只是一个例子,但是在它的构造函数中克隆一个对象是个坏主意。


它必须受到保护,以便您可以在实现Cloneable. 但是,并非所有对象都是可克隆的,因此通常无法访问。

使用super可以访问受保护的方法。使用引用来创建一个方法需要该方法是可访问的,例如公共的或本地包并且在同一个包中。

AFAIK,通常认为 clone()/Cloneable API 已损坏,应避免使用(原始数组除外),例如 Cloneable 接口没有Object clone();将其公开的方法,它返回Object必须强制转换的方法。

于 2013-01-02T17:13:45.110 回答