[英]Why is this program printing 25? (Java inheritance)
在这个程序中
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 should print”,但是我们从sublcass获取输出“ this not print”
类b继承了类A,因此,当您调用x.aa时,它正在调用类a的方法aa。 类a的成员a用25初始化,因此它输出25。类a不知道类b的成员a。
字段不能被覆盖,并且不是虚拟的。 Ba
*独立于Aa
,以至于它们实际上可以具有不同的类型。 B
无法使A
代替Aa
来意识到Ba
。 B
实例实际上将有两个名为a
字段,但一个被另一个隐藏(“阴影”)。 (如果需要的话,代码B
可以参考它Aa
通过写入字段((A)this).a
,这是因为相应的a
基于的类型被选择((A)this)
,它是A
,而不是运行时类型的实例,这将是B
或的子类型B
)。
*注意:我已经将您的类重命名为A
和B
:按照Java命名约定,类名以大写字母开头。
b x=new b();
在执行此操作时,这将打印出构造函数的内容作为其给定值,因为它清楚地使b类成为对象,而在该类中的类A的情况下, b()作为方法,因此在您使用时不会调用使b类成为对象。
而在
b x=new b();
x.aa();
默认情况下,它将调用继承,并在获取输出时打印。 还有一件事。
public void aa()
{
System.out.println(a);
}
在这种情况下,它将使用该特定类的局部变量,因此它将打印您在该类上定义的任何内容。 在您的情况下为a = 25;
顺便问一个好问题。
方法aa()是类a的成员。 因此,方法aa()可以查看/访问类a的实例成员。 现在,您已经继承了类a到b。 这意味着类b的对象可以访问/调用aa()。 但是,这并不意味着允许aa()访问类b的变量a。 这就是为什么方法aa()打印自己类的变量a并打印25。
现在有关您的第二个程序。 在类b中,您将重写方法b()。 在调用重写的方法时,方法的选择(无论是从子类还是从超类)是基于调用对象(分别是子类还是超类)的实例进行的。 您已经使用类b的实例调用方法aa(),这就是为什么要调用类b的方法b()的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.