Java继承:为什么引用超类变量

时间:2012-12-09 18:32:05

标签: java

我有一个超级“Sam”和一个子类“SubSam”

 public class Sam {

String msg;
String msg1;

Sam(String mm, String mm1) {
    msg = mm;
    msg1 = mm1;
}

@Override
public String toString() {
    return this.msg + "  " + this.msg1;
    }
}

class SubSam extends Sam {

String msg1="C";

public static void main(String[] args) throws Exception {
    SubSam obj = new SubSam();
    System.out.println(obj);
}

SubSam() {
    super("A", "B");
}
}

输出结果为:

A  B

为什么“toString()”引用“Sam”的实例字段而不是“SubSam”。输出应为:A C

我现在正在思考它,但没有得到它?

3 个答案:

答案 0 :(得分:4)

因为Java中的实例变量没有被覆盖,所以非常简单。子类可以定义一个与其超类中定义的变量同名的变量,但它可以作为所有意图和目的的单独变量。

例如,请考虑以下代码:

public class A {
    public String var;
}

public class B extends A {
    public int var;
}

鉴于这些定义,B的实例将包含两个变量,一个是String类型,另一个是int,但两者都将被命名为var。它们仍然是单独的变量,可以独立分配和读取,Java不会认为这有任何问题。

如果要根据需要覆盖行为,则需要使用方法。例如,你可以这样做:

public class A {
    public String msg;
    private String msg1;

    public A(String mm, String mm1) {
        this.msg  = mm;
        this.msg1 = mm1;
    }

    public String msg1() {
        return(this.msg1);
    }

    @Override
    public String toString() {
        return(this.msg + " " + msg1());
    }
}

public class B extends A {
    public B() {
        super("A", "B");
    }

    @Override
    public String msg1() {
        return("C");
    }
}

现在,如果您致电System.out.println(new B());,则会打印A C

答案 1 :(得分:1)

您没有覆盖toString,因此调用了超类的toString方法。它为超类打印msg和msg1,而不是为子类打印。

答案 2 :(得分:0)

你在子类中设置msg1,但是在它的传递中你传递

super("A","B");

此时,super中正在初始化的变量(即主类的构造函数)是使用this方法中的toString关键字使用的主类变量