使用super vs创建Object类的新对象

时间:2013-01-02 17:04:09

标签: java protected

为什么我们可以使用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();
        }
    }

}

1 个答案:

答案 0 :(得分:4)

protected表示只能由子类(或同一个包中的类)访问。因此,您可以使用thissuper或任何内容在子类中访问它,但不是另一个例子。

您的示例已编译,但无法运行。

    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