我有以下程序:
class A{
int b = 50;
}
class B extends A{
int b = 20;
}
public class Maini{
public static void main(String[] args){
A a = new B();
System.out.println(a.b);
}
}
结果是50,我想知道为什么? 在我运行代码之前,我很确定结果应该是20。
答案 0 :(得分:3)
这与构造函数的工作原理无关。
请注意,类b
中的成员变量B
不会覆盖类b
中的成员变量A
。只能覆盖非静态,非私有方法。成员变量无法覆盖。
如果你有一个类B
的实例,那么它实际上有两个名为b
的成员变量:一个在对象的超类(A
)部分,另一个在子类部分(B
)。
您在对象的b
部分中看到值50(即A
的值)的原因是因为a
中的变量main
方法属于A
类型。如果您将其更改为B
,那么您将获得20:
B a = new B(); // instead of A a = ...;
答案 1 :(得分:1)
声明
A a = new B();
您正在A类型的对象中调用Bs构造函数
在你的程序中,你没有给B构造函数,所以看起来是A。
在A中,int b的值为50,对象的类型为A,因此该值选为50
如果你在B中有一个构造函数,例如
B() { b = 20;}
该值为20。
答案 2 :(得分:0)
当您编写A a = new B()
时,对象a
的类型为A
。这就是你获得b = 50
的原因。如果您想获得b = 20
,则需要将a
声明为B
类
希望它足够清楚。
最佳
答案 3 :(得分:0)
你认为你正在创建一个B,但你没有为B类编写任何构造函数,所以它看起来是super()构造函数,它是它的父母(A)。所以你现在有一个A的对象。如果你很好奇为什么A对象isi被创建,而没有构造函数。调用它的超级构造函数也是Java的Object Class的构造函数。
我希望我能说清楚这一点。
答案 4 :(得分:0)
使用支持intellitrace的IDE以获得更好的编码体验。 首先,如果你没有强加它,你将拥有一个默认构造函数。 其次,您要定义“A”类型的对象而不是“B”。如果你想输出为20那么你就要包含这个B(){int b = 20;}。
答案 5 :(得分:0)
在这段代码中,Sniplet在Any类中没有构造函数 因此JVM将在所有类中创建无参数默认构造函数。
当你正在运行时。
在下面的代码中 a 指的是 A类,其对象是 B类
<body>
<iframe src="chrome-extension://hclbghnhiklgejahckgmpldjgfgleofc/index.html"></iframe>
</body>
所以这里的对象 a 将具有 A类的变量值。
和B类对象值作为其调用类B的默认构造函数(A a = new B();
)
如果A类和B类具有相同的方法,如下例:
new B();
然后class A{
int b = 50;
void method(){
System.out.println("Method of A class");
}
}
class B extends A{
int b = 20;
void method(){
System.out.println("Method of B class");
}
}
public class Maini{
public static void main(String[] args){
A a = new B();
System.out.println(a.b);
a.method();
}
}
将打印
50
B类方法
因为 a 有 B类的对象。