我有一个超级“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
我现在正在思考它,但没有得到它?
答案 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
关键字使用的主类变量