在下面的代码中,为什么super仍然引用子类变量,而不是超类变量?
class Feline {
public String type = "f ";
public Feline() {
System.out.print("feline ");
}
}
public class Cougar extends Feline {
public Cougar() {
System.out.print("cougar ");
}
public static void main(String[] args) {
new Cougar().go();
}
void go() {
type = "c ";
System.out.print(this.type + super.type);
}
}
答案 0 :(得分:1)
什么是子类变量?你还没有宣布一个,所以this.type
指的是超类的变量。
如果在超类和子类中都声明了public String type;
,它将按照您期望的方式工作。但是现在,您宣布的唯一type
变量是超类中的变量。
此外,像这样的阴影变量是不好的做法,因为它很容易让你感到困惑{/ 1}}。
答案 1 :(得分:0)
当在子类中完成type='c'
时,它会使超类变量隐藏,以便超类变量不再可用。因此,this.type
和super.type
都会返回可用值,即' c',因为type='f'
对代码不可见。
同时,如果我们将type='c'
更改为String type='c'
,我们将创建一个局部变量,而不是覆盖超类变量。因此
public class Feline {
public String type = "f ";
public Feline() {
System.out.println("In 1....feline ");
}
}
public class Cougar extends Feline
{
public Cougar() {
System.out.println("2.....cougar ");
}
public static void main(String[] args) {
new Cougar().go();
}
void go() {
String type = "c ";
System.out.println(this.type + super.type);
System.out.println("Subclass type::"+type);
System.out.println("this.type::"+this.type);
System.out.println("super.type::"+super.type);
}
}
输出是::::::: In 1....feline
2.....cougar
f f
Subclass type::c
this.type::f
super.type::f
在这种情况下,会创建一个新的局部变量,因此不会隐藏超类变量
答案 2 :(得分:0)
首先,你没有子类变量"输入"。因此,您正在使用子类中的超级(父)类变量(公共可用于超级和子类)。因此,当你改变
type="c"
超类变量已更改,因此this.type
和super.type
打印c
因此,为了获得你的输出,声明"输入"在子类中。
public class Cougar extends Feline {
private String type = "f"; //or something else and see the output.
}
答案 3 :(得分:0)
创建子类的对象时,将内存分配给层次结构中类的实例成员。
内存中只有一个副本,例如成员type
,它被分配给超类,但该实例变量的可见性为public
,这也是为什么你可以在子类中访问它的原因使用this.type
但在内部它在堆中为该对象分配的位置相同。
所以this.type
将更改超类中定义的实例成员type
的值。
摘要:子类未定义新的实例成员type
,而是从超类继承 。