Java 就像超类成员一样,超类构造函数是否构成子类对象状态的一部分?
请允许我解释我的理解Java 就像超类成员一样,超类构造函数是否构成子类对象状态的一部分?,java,oop,inheritance,nested,subclass,Java,Oop,Inheritance,Nested,Subclass,请允许我解释我的理解 class P { P() { System.out.println("hi "+this); /*which object of P is currently executing this constructor? Is "this" here object referenced by q or some other object?*/ } } class Q extends P { Q(
class P
{
P()
{
System.out.println("hi "+this);
/*which object of P is currently executing this constructor?
Is "this" here object referenced by q or some other object?*/
}
}
class Q extends P
{
Q()
{
super();
/*constructor of superclass called on this object(referenced by q) */
}
}
class R
{
public static void main(String args[])
{
Q q = new Q(); //constructor Q() invoked on object referenced by q
}
}
因此,我的疑问是:
1.在P的哪个对象上调用super()(因为不存在)。
2.P()中的“this”指的是什么?它和q是同一个物体吗?换句话说,这是不是=q?代码(包括系数)没有定义“对象状态”。一组实例字段可以。而且,在后台,子类实例确实包含其超类的
private
字段,但是javac
确保它们只能通过调用超类方法(包括构造函数)直接或间接地访问
关于你的最新问题:
class Q extends P
{
Q()
{
super(); /*constructor of superclass called on this object(referenced by q) */
}
}
这里Q扩展了p,因此super()
调用p的ctor。在执行P的ctor时,此
允许引用属于P及其超类型(例如,对象
)的字段和方法,以及访问修饰符施加的限制(我的意思是您只能访问公共
和受保护的和子类型的“包私有”成员),但不适用于P的子类型
关于“无法访问p的子类型”规则,还有一个扭曲:如果您从p的ctor调用p的非私有(可重写)方法,则该方法有可能在某一天在Q
或其他子类型中被重写,并且您突然开始调用一些不可预见的代码!因此,P中的this
允许显式引用P的子类型方法,但不允许引用P的子类型字段(尽管P的子类型方法可以隐式访问P的字段)
举个例子——将下面代码中的f()
从private
更改为“package local”,并通过下面的执行链Derived#Derived()->Base#Base()->Derived#f()->NPE见证NPE代码>:
class Base {
private Integer base = 1;
Base() {
f();
}
private void f() {
System.out.println(base);
}
}
class Derived extends Base {
private Integer derived;
Derived() {
super();
derived = 2;
f();
}
private void f() {
System.out.println(derived.intValue());
}
}
构造函数不会继承到子类。使用super()
可以调用超级类构造函数。无法从子类访问超类的私有变量/属性。此外,超类的私有成员也不会继承到它的子类 构造函数在java中不被继承
根据:
子类继承所有成员(字段、方法和嵌套
类)从其超类。构造函数不是成员,所以它们是
不是由子类继承的,而是由超类的构造函数继承的
可以从子类调用
调用super()
时,只需调用父构造函数,它可以访问它所属类的私有成员
至于你问题的最新版本:
class Q extends P
{
Q()
{
super(); /*constructor of superclass called on this object(referenced by q) */
}
}
如上所述,super()
只调用父构造函数。它不会在任何对象上调用,因为构造函数不是类的成员
构造函数中的p
将引用正在构造的子类(Q
)的实例
编辑:
关于2。这可以通过在main
方法中输出参考q
来轻松验证。它应该与System.out.println(this)
调用P
构造函数完全相同
public class R
{
public static void main(String args[])
{
Q q = new Q(); //constructor Q() invoked on object referenced by q
System.out.println(q);
}
}
如果你问super()
是否调用它自己的超类super()
,那么答案是肯定的(直到超类是Object
)。我已经编辑了我的问题。两天前,你问了一个非常类似的问题。你一再坚持没有P
的例子(除了你以前问这个问题时称之为A
)。一、 其他人解释说,有一个P
的实例,因为Q
的任何实例也是P
的实例。为什么你仍然坚持认为没有P
?问了一个问题后,你没有阅读答案和评论吗?这意味着多态性在这里起作用…因为我们可以使用子类引用访问超类构造函数(当然也是超类引用)?你提到super()可以访问私有实例成员。但实例成员始终与对象关联。因此,当我们从构造函数访问实例成员时,我们正在访问哪个对象的实例成员?@user3678484访问私有实例成员的不是super(),而是父构造函数。然而,如果从构造函数中调用虚拟(非私有)方法,那么调用将是多态的。由于私有方法不会被继承,因此对私有方法的调用只会从定义构造函数的类中调用该方法。希望这有意义。。。