java – 在继承中的混淆 – 在构造函数中打印时,“this”的值

我有以下代码

class Test {
    int i = 0;

    Test() {
        System.out.println(this);
        System.out.println(this.i);
    }

}

public class Demo extends Test {
    int i = 10;

    Demo() {
        super();
        System.out.println("calling super");
        System.out.println(this);
        System.out.println(this.i);    
    }

    public static void main(String[] args) throws IOException {    
        Demo d = new Demo();    
    }
}

O/P : Demo@2e6e1408
0
calling super
Demo@2e6e1408
10

当我执行程序并打印“this”的值时,在超类构造函数以及子类构造函数中,这个(地址位置)的值显示为childClassName @ someValue ..我的问题是,为什么不得到Test的值,即Test @ someVal(Super class)当我在超级类中打印“this”值时.ASAIK,超级类也将在内存中有一个位置/位置,所以为什么我没有得到测试@someValue在第一个SOP …

PS:我知道基于引用类型(LHS)引用变量,并且基于对象类型(RHS)调用方法.

When I execute the program and print the value of “this”, in both super class constructor as well as in child class constructor, the value of this (address location)…

System.out.println(this)与默认Object#toString的输出不是内存中实例的地址.它只是类的名称和实例的哈希码,没有更多.从the documentation

The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@’, and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

getClass().getName() + '@' + Integer.toHexString(hashCode())

hashCode documentation说的确是这样

This is typically implemented by converting the internal address of the object into an integer…

但它也说

…but this implementation technique is not required by the JavaTM programming language.

…当然,JVM可以根据需要自由地在内存中移动实例,但不允许更改hashCode.

…why dont I get the value of Test i.e, Test@someVal (Super class) when I print value of “this” in the super class.

有一个例子.该实例是子类.当您执行System.out.println(this)时,无论您是在基类还是子类中执行此操作,它仍然与您正在使用的对象实例相同.那个对象具有它从子类获得的特征,并且它还具有从超类继承的特征,但是没有两个单独的实例;有一个具有组合功能的实例.超级不是一个对象引用,虽然它看起来有点像一个;它是一种语法机制,专门要求编译器使用实例从超类继承的功能,而不是实例的等效功能(如果它们不同).

翻译自:https://stackoverflow.com/questions/20834598/confusion-in-inheritance-value-of-this-when-printed-in-constructor

转载注明原文:java – 在继承中的混淆 – 在构造函数中打印时,“this”的值