0

我正在努力理解在超类构造函数中使用时如何准确计算出“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 1

狗 0 1

狗 1 1

因此,当我在 Animal 构造函数中调用 this.toString() 时,this 指的是 rover(狗)。但是,当我在 Animal 构造函数中执行 this.x++ 时,它会增加 Animal 中的 x 而不是 Dog 中的 x。

那是对的吗?为什么 this.x++ 不增加流动站的 x?

4

3 回答 3

4

通过在 Animal 的子类中声明变量 x,您实际上是在遮蔽 Animal 的变量 x,所以 Mammal 中的 this.x 指的是 Mammal 中的 x,它遮蔽了 Animal 的 x。当然,在 Animal 构造函数中,x 指的是 Animal 中的 x,因为 Animal 类不知道任何子类。

我不知道你为什么要隐藏 x,在 Animal 的所有子类中删除 public int x 应该会导致你期望的行为。然后,Animal 的所有子类将引用在 Animal 中声明的 x。

在这里可以找到更多关于阴影的详细信息: http ://www.xyzws.com/Javafaq/what-is-variable-hiding-and-shadowing/15

希望我能帮上忙

于 2013-06-01T12:16:22.960 回答
0

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

它对于区分实例变量和局部变量(包括参数)很有用,但它本身可以用来简单地引用成员变量和方法,调用其他构造函数重载,或者简单地引用实例。

于 2013-06-01T12:04:17.310 回答
0

当你this.x同时拥有xsuper classsub class。子类中的引用this.x是指子类中的变量,而不是超类中的变量。这非常直观,因为您正在扩展超类以根据您的需要对其进行修改,并且在 OOP 中,通常会编写子类重新声明(我的意思是声明具有相同名称的变量以自定义或类似的东西)一些变量。如果您想要来自 的变量或方法super class,特别是您的服务中总是有super关键字。

于 2013-06-01T12:23:47.237 回答