继承中的混淆 - 在构造函数中打印时"this"的值

The*_*ind 12 java inheritance

我有以下代码.

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
Run Code Online (Sandbox Code Playgroud)

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

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

T.J*_*der 10

当我执行程序并打印"this"的值时,在超类构造函数和子类构造函数中,这个值(地址位置)......

的输出System.out.println(this)与默认Object#toString不是在内存中实例的地址.它只是类的名称和实例的哈希码,仅此而已.从文档:

toStringObject类的方法返回一个字符串,该字符串由对象为实例的类的名称,at符号字符"@"和对象的哈希码的无符号十六进制表示组成.换句话说,此方法返回一个等于值的字符串:

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

hashCode文档说的确如此

这通常通过将对象的内部地址转换为整数来实现...

但它也说

...但是Java TM编程语言不需要这种实现技术.

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


...当我在超类中打印"this"的值时,为什么我不能得到Test的值,即Test @ someVal(Super class).

一个例子.该实例属于子类.当你这样做时System.out.println(this),无论你是在基类还是子类中都这样做,它仍然是你正在使用的同一个对象实例.这个对象具有从子类获取的特性,并且还具有从超类继承的特征,但是没有两个单独的实例; 有一个具有组合功能的实例.super它不是一个对象引用,虽然看起来有点像一个; 它是一种语法机制,专门要求编译器使用实例从超类继承而不是实例的等效特性(如果它们不同).