Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用超级vs创建对象类的新对象_Java_Protected - Fatal编程技术网

Java 使用超级vs创建对象类的新对象

Java 使用超级vs创建对象类的新对象,java,protected,Java,Protected,为什么我们可以使用super.符号访问clone()方法,但不能通过创建object类型的新对象来访问它。例如,如果我做了类似的事情 Object obj = new Object(); 然后(使用Eclipse),我无法使用点运算符查看clone()方法,这表明obj无法查看Object类的受保护成员(只有公共方法可见) 现在,如果我使用super关键字,即使用super.我也可以查看受保护的方法 所以我的问题是,在一个没有显式继承(扩展)其他类的类中——我知道它会隐式调用对象类构造函数,也

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

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

现在,如果我使用
super
关键字,即使用
super.
我也可以查看受保护的方法

所以我的问题是,在一个没有显式继承(扩展)其他类的类中——我知道它会隐式调用对象类构造函数,也就是说,对象类是它的超类——为什么super关键字可以访问对象类的受保护成员,但创建对象类的实例却不能做到这一点(只有公共成员对对象类的实例可见)

下面是更清晰的代码(虽然没有意义,但第一部分符合,其他部分不符合):


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();
    }
顺便说一句:我知道这只是一个例子,但在它的构造函数中克隆一个对象是个坏主意


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

使用
super
可以访问受保护的方法。使用引用使方法可访问,例如,公共或包本地且在同一包中


好的,一般认为clone()/Cloneable API是坏的,应该避免使用(原语数组除外),例如Cloneable接口没有公开的
对象clone();
方法,它返回必须强制转换的
对象。

受保护的
意味着只能由子类访问(或同一软件包中的类),因此您可以使用
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();
    }
顺便说一句:我知道这只是一个例子,但在它的构造函数中克隆一个对象是个坏主意


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

使用
super
可以访问受保护的方法。使用引用使方法可访问,例如,公共或包本地且在同一包中


好的,一般认为clone()/Cloneable API是坏的,应该避免使用(原语数组除外),例如Cloneable接口没有
对象clone();
方法将其公开,并返回必须强制转换的
对象。

这很混乱,您可以发布示例代码吗?我建议您研究private、protected和public之间的区别这种行为的原因是我确实研究了oracle教程中的访问修饰符,但根据它们“protected”类型允许访问类、包和子类。但由于对象类是所有类的超类,为什么对象类的实例无法查看其自身的受保护成员?这很令人困惑,您可以发布示例代码吗?我建议您研究private、protected和Public之间的区别这种行为的原因是我研究了访问权限oracle教程中的修改器,但根据其“受保护”类型允许访问类、包和子类。但由于对象类是所有类的超类,为什么对象类的实例无法查看其自身的受保护成员?当OP尝试访问和使用克隆时,我认为问题是真正试图理解为什么他在调用new when时无法访问类的受保护成员在派生类型的子类中实例化对象。虽然有点不清楚,但问题似乎是“new和super之间有什么区别”。这一切归结为为什么“super”能够访问对象类的受保护方法,但同样的方法不适用于从对象类创建的对象。很抱歉,问题不清楚(我尽了最大努力:P)
protected
表示只能由子类(或同一包中的类)访问因此,您可以在子类中使用
this
super
或什么都不访问它,但不能访问另一个实例。@PeterLawrey-spot-on,您无法更好地解释。如果OP仍然不理解,那是因为对OOP和封装/访问修饰符缺乏理解。“不是另一个实例”有点误导。你可以在
this
类型的其他实例上调用受保护的方法。例如,类
temp
中的方法可以在
temp
的另一个实例上调用受保护的方法。它只是不能在其他类的实例上调用受保护的方法。当OP尝试访问和使用克隆时,我认为问题是,当在派生类型的子类中实例化对象时,为什么他在调用new时不能访问类的受保护成员。这个问题似乎在问“new和super之间有什么区别”,尽管有点不清楚。这一切归结为为什么“super”能够访问对象类的受保护方法,但同样的方法不适用于从对象类创建的对象。很抱歉,问题不清楚(我尽了最大努力:P)
protected
表示只能由子类(或同一包中的类)访问因此,您可以使用
this
super
在子类中访问它,或者不使用任何内容,但不使用