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(),而是父构造函数。然而,如果从构造函数中调用虚拟(非私有)方法,那么调用将是多态的。由于私有方法不会被继承,因此对私有方法的调用只会从定义构造函数的类中调用该方法。希望这有意义。。。