为什么super不能引用超类中的变量?

时间:2014-10-08 15:54:50

标签: java super

在下面的代码中,为什么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);
    }
}

4 个答案:

答案 0 :(得分:1)

什么是子类变量?你还没有宣布一个,所以this.type指的是超类的变量。

如果在超类和子类中都声明了public String type;,它将按照您期望的方式工作。但是现在,您宣布的唯一type变量是超类中的变量。

此外,像这样的阴影变量是不好的做法,因为它很容易让你感到困惑{/ 1}}。

答案 1 :(得分:0)

当在子类中完成type='c'时,它会使超类变量隐藏,以便超类变量不再可用。因此,this.typesuper.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.typesuper.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,而是从超类继承

阅读What is purpose of using inheritance?