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
在子类中访问它,或者不使用任何内容,但不使用