super和this关键字如何在子类方法中工作

时间:2017-08-20 07:14:29

标签: java

class Feline {
    public String type = "f ";

    public Feline() {
        System.out.print("feline ");
    }
}

public class Cougar extends Feline {

    public Cougar() {
        System.out.print("cougar ");
    }
    void go() {
        type = "c ";
        System.out.print(this.type + super.type);
    }
    public static void main(String[] args) {
        new Cougar().go();
    }
}

在此代码中输出为feline cougar c c,当我将子类变量更改为String Type = "c"时,意味着分配新的字符串类型,然后答案将作为feline cougar f f,请告诉我这是怎么回事super关键字在这个子类方法中工作?

2 个答案:

答案 0 :(得分:1)

现在我明白了。 您的Cougar课程缺失"类型"变量即可。我检查了我的代码,this.type和super.type是同一个变量。设置类型=" c"等于this.type =" c"和super.type =" c"因为他们指向相同的领域。

编辑:写这样的东西

class Cougar extends Feline {
    public String type = "c ";
    ....
} 

答案 1 :(得分:1)

type是一个非限定名称,指的是本地变量参数字段this.type指的是当前类可以访问的字段
super.type指的是 base 类可以访问的字段

由于子类Cougar没有名为type字段this.typesuper.type都引用了type在基类Feline中声明的字段。在您的示例中,thissuper之间没有区别。

方法type = "c ";中的语句go()是不合格的,并且由于该名称没有局部变量或参数,因此它还引用基类{{1}的字段type }。因此,Felinetypethis.type都引用了唯一一个名为super.type的字段。

如果方法type中的语句更改为go(),则它定义了一个名称不同的局部变量。请记住,Java名称区分大小写,因此String Type = "c";Type的名称不同。因此,字段type会保留type的初始值。

如果您打算将方法"f "中的语句更改为go(),则会定义并初始化名为String type = "c";本地变量。从本质上讲,它无法更新 field type,因为初始化程序适用于新声明的本地变量。因此,字段type会保留type的初始值。

如果您首先使用"f "在方法go()中声明局部变量,然后像原始代码使用String type;那样分配它,那么非限定名称是指 local该名称的变量,而不是字段。局部变量是hiding同名字段。因此,字段type = "c";再次保留type的初始值。