为什么System.out.println(e.a)输出的是33,而不是3?求指导
public class A extends Base{
int a=3;
public void b(){
System.out.println(“A”);
}
public static void main(String[] args) {
Base e= new A();
System.out.println(e.a);
e.b();
}
}
class Base{
int a=33;
Base(){
b();
}
public void b(){
System.out.println(“base”);
}
}
public class A extends Base{
int a=3;
public void b(){
System.out.println(“A”);
}
public static void main(String[] args) {
Base e= new A();
System.out.println(e.a);
e.b();
}
}
class Base{
int a=33;
Base(){
b();
}
public void b(){
System.out.println(“base”);
}
}
解决方案
10
你这个例子举的不好,你验证的应该是java的重写。a对于A或Base都是成员变量(类变量),成员变量只能用对象访问。当然base对象访问a会输出33了。
20
A重写了Base的b()d当然会输出。你Base里面加个int b=6,A里面加个int c=6,然后看看,e.c是不存在的。到这你应该懂了吧!
10
本人来给你解释一下吧。
这里设计到了JAVA的多态问题。
这里的A继承了Base;
在导出类A中重写了基类Base的方法b()
所以在Base b=new A();
你把导出类上转型成基类的时候
b.b()会判断基类中的b()能否在A中被重写了。假如被重写了就调用导出类中的b()方法(输出A),反之调用父类的。
这里在多给你科普下吧。
假如基类Base中 的b()定义为private的时候
导出类一样无法覆盖基类的b()方法。
这个时候你调用b.b()的时候输出还是Base
此外多态还有个缺陷就是域的问题。
这里的成员变量是没有办法被重写的。
当你把导出类上转到基类的时候,在调用成员变量a的时候指向的就是基类的变量。33
当你直接通过导出类调用成员变量的时候用的就是自身的变量了。输出就是3
这里设计到了JAVA的多态问题。
这里的A继承了Base;
在导出类A中重写了基类Base的方法b()
所以在Base b=new A();
你把导出类上转型成基类的时候
b.b()会判断基类中的b()能否在A中被重写了。假如被重写了就调用导出类中的b()方法(输出A),反之调用父类的。
这里在多给你科普下吧。
假如基类Base中 的b()定义为private的时候
导出类一样无法覆盖基类的b()方法。
这个时候你调用b.b()的时候输出还是Base
此外多态还有个缺陷就是域的问题。
这里的成员变量是没有办法被重写的。
当你把导出类上转到基类的时候,在调用成员变量a的时候指向的就是基类的变量。33
当你直接通过导出类调用成员变量的时候用的就是自身的变量了。输出就是3