Java 使用关键字';这';

Java 使用关键字';这';,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我很难理解当在超类构造函数中使用“this”时,如何准确地计算出它指的是什么 我有三门课: public class Animal { public int x; public Animal() { this.x++; System.out.println(this); System.out.println(this.x); System.out.prin

我很难理解当在超类构造函数中使用“this”时,如何准确地计算出它指的是什么

我有三门课:

     public class Animal {

        public int x;

        public Animal() {
            this.x++;
            System.out.println(this);
            System.out.println(this.x);
            System.out.println();
        }

        public String toString() {
            return "Animal";
        }
    }

public class Mammal extends Animal{

    public int x;

    public Mammal() {
        this.x++;
        System.out.println(this);
        System.out.println(this.x);
        System.out.println();
    }

    public String toString() {
        return "Mammal";
    }

}

public class Dog extends Mammal{
    public int x;

    public Dog() {
        this.x++;
        System.out.println(this);
        System.out.println(this.x);
        System.out.println();
    }

    public String toString() {
        return "Dog " + x;
    }

    public static void main(String[] args) {
        Dog rover = new Dog();
    }

}
调用Dog构造函数的结果是:

狗0 一,

狗0 一,

狗1 一,

所以当我在Animal Constructor中调用这个.toString()时,它指的是罗孚(狗)。但是当我在Animal构造函数中执行此操作时,它是在Animal而不是在Dog中递增x


对吗?为什么这个.x++不增加rover的x?

在实例方法或构造函数中,这是对当前对象的引用,即调用其方法或构造函数的对象。您可以使用以下方法从实例方法或构造函数中引用当前对象的任何成员


它有助于从局部变量(包括参数)中消除实例变量的歧义,但它本身可以用来简单地引用成员变量和方法,调用其他构造函数重载,或者简单地引用实例

在实例方法或构造函数中,这是对当前对象的引用,即调用其方法或构造函数的对象。您可以使用以下方法从实例方法或构造函数中引用当前对象的任何成员


它有助于从局部变量(包括参数)中消除实例变量的歧义,但它本身可以用来简单地引用成员变量和方法,调用其他构造函数重载,或者简单地引用实例

通过在动物的子类中声明变量x,实际上是在隐藏动物的变量x,所以这个.x在哺乳动物中指的是哺乳动物中的x,它隐藏了动物的x。当然,在Animal构造函数中,x指的是Animal中的x,因为Animal类不知道任何子类

我不知道你为什么要跟踪x,移除动物所有子类中的公共int x应该会导致你期望的行为。动物的所有子类将引用动物中声明的x

有关阴影的详细信息,请参见:


希望我能通过在动物的子类中声明变量x来帮助你,你实际上是在隐藏动物的变量x,所以这个.x在哺乳动物中指的是哺乳动物中的x,它隐藏了动物的x。当然,在Animal构造函数中,x指的是Animal中的x,因为Animal类不知道任何子类

我不知道你为什么要跟踪x,移除动物所有子类中的公共int x应该会导致你期望的行为。动物的所有子类将引用动物中声明的x

有关阴影的详细信息,请参见:


希望我能帮你当你有
这个.x
而你有
x
超级类和
子类中。子类中的引用
this.x
指的是子类中的变量,而不是超类中的变量。这非常直观,因为您正在扩展超类来修改它以满足您的需要,在OOP中,编写子类来重新声明(我的意思是用相同的名称声明变量以自定义或类似的方式)一些变量是很常见的。如果您希望变量或方法来自
超级类
,尤其是在您的服务中总是有
超级
关键字。

当您有
这个.x
时,而
超级类
子类
中都有
x
。子类中的引用
this.x
指的是子类中的变量,而不是超类中的变量。这非常直观,因为您正在扩展超类来修改它以满足您的需要,在OOP中,编写子类来重新声明(我的意思是用相同的名称声明变量以自定义或类似的方式)一些变量是很常见的。如果您希望变量或方法来自
super类
,尤其是在您的服务中总是有
super
关键字。

但我认为在这种情况下,当前对象将是rover?那么这是怎么回事呢?x不是指路虎的x?但我认为在这种情况下,当前的物体应该是路虎?那么,为什么这个.x不是指路虎的x呢?