在这个程序中
class a
{
int a=25;
public void aa()
{
System.out.println(a);
}
}
class b extends a
{
int a=2;
public static void main(String[] args) {
b x=new b();
x.aa();
}
}为什么"x.aa()“打印25个ans,为什么不打印2个?背后的原因是什么?
class a
{
int a=25;
public void aa()
{
System.out.println(a);
b();
}
public void b()
{
System.out.println("this should print");
}
}
class b extends a
{
int a=2;
public static void main(String[] args) {
b x=new b();
x.aa();
}
public void b()
{
System.out.println("this should not print");
}
}如果我们考虑上面的输出,那么在这里上面的b()的输出应该打印"this we print“,但我们从sublcass得到的输出是"this not print”。
发布于 2014-10-20 12:57:34
类b继承了类A,所以当你调用x.aa时,它调用的是类a的方法aa。a类的成员a被初始化为25,所以它输出25。类A不知道类b的成员A。
发布于 2014-10-20 13:09:06
字段不能被重写,并且不是虚拟字段。B.a*独立于A.a,以至于它们实际上可以有不同的类型。B没有办法让A意识到B.a而不是A.a。B的实例实际上有两个名为a的字段,但其中一个被另一个隐藏(“隐藏”)。(如果需要,代码B可以通过编写((A)this).a来引用其A.a字段。这是因为选择适当的a是基于((A)this)的类型,即A,而不是实例的运行时类型,即B或B的子类型。)
*注意:我已经将您的类重命名为A和B:根据Java命名约定,类名称以大写字母开头。
发布于 2014-10-20 13:14:13
b x=new b();当你要这样做的时候,这将打印出构造函数的输出,因为它显然是构造b类的对象,而在那个类中的A类中,b()充当方法,所以当你创建b类的对象时,它不会调用。
而在这种情况下
b x=new b();
x.aa();这将在默认情况下调用继承,并在您获得输出时打印出来。还有一件事。
public void aa()
{
System.out.println(a);
}在这种情况下,它将使用该特定类的局部变量,因此它将打印您在该类上定义的任何内容。在您的例子中,就是a=25;
顺便说一句,问得好。
https://stackoverflow.com/questions/26458756
复制相似问题