使用关键字'this'

时间:2013-06-01 12:00:53

标签: 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.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 constuctor中调用this.toString()时,这指的是漫游者(狗)。但是当我在Animal构造函数中执行this.x ++时,它会在Animal中增加x而不是Dog。

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

3 个答案:

答案 0 :(得分:4)

通过在Animal的子类中声明变量x实际上是阴影动物的变量x,因此哺乳动物中的this.x指的是哺乳动物中的x,它影响动物的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

希望我能帮忙

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

this.xx super class sub classthis.x。子类中的引用super class引用子类中的变量,但不是超类中的变量。这是非常直观的,因为你正在扩展超类来修改它以满足你的需要,而在OOP中,通常会编写子类重新声明(我的意思是声明具有相同名称的变量来定制或类似的东西)一些变量。如果您需要super中的变量或方法,特别是您的服务中始终有{{1}}个关键字。