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关键字在这个子类方法中工作?
答案 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.type
和super.type
都引用了type
在基类Feline
中声明的字段。在您的示例中,this
和super
之间没有区别。
方法type = "c ";
中的语句go()
是不合格的,并且由于该名称没有局部变量或参数,因此它还引用基类{{1}的字段type
}。因此,Feline
,type
和this.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
的初始值。