class exam{
public static void main(String[] args){
Y v2=new Y();
X v3=(X)v2;
System.out.println(v3.x);
System.out.println(v3.retv());
}
}
class X{
int x=10;
int retv(){
return x;
}
}
class Y extends X{
int y=20;
int x=30;
int retv(){
return x;
}
}
----------------------------------------------
输出结果:
10
30
为什么是这个结果?
怎么不是30 30 啊?
public static void main(String[] args){
Y v2=new Y();
X v3=(X)v2;
System.out.println(v3.x);
System.out.println(v3.retv());
}
}
class X{
int x=10;
int retv(){
return x;
}
}
class Y extends X{
int y=20;
int x=30;
int retv(){
return x;
}
}
----------------------------------------------
输出结果:
10
30
为什么是这个结果?
怎么不是30 30 啊?
jvm处理的时候,每个类都有自己的常量池。呵呵。就是这么一回事情而已。 而方法也有方法存放的表,子类重载是覆盖父类方法的话,该方法在该表中还是原先位置,只是把引用空间指向了新得函数体而已。
v2.x v2类型是Y,所以是Y.x (JVM中指令为getfield)v3.retv() //根据v3的真实类型调用方法,也就new 对象类型()时的“对象类型”,也就Y;
(JVM中指令为invokevirtual)
class exam{
public static void main(String[] args){
Y v2=new Y();
X v3=(X)v2;
System.out.println(v3.retv());
System.out.println(v3.x); }
}
class X{
int x=10;
int retv(){
return x;
}
}
class Y extends X{
int y=20; int retv(){
x=30;
return x;
}
}
输出结果:
30
30
这个例子好像在thinking in java上面讲过!
Why the result is (30,30) in my case?
重新给它赋值了啊,如果你不调用子类的retv()方法,x的值肯定还是10啊
在你第一个例子中,子类中的x有自己的定义啊,
和父类中的x是两个不同的变量啊,当然不能重载了哦,它们应该有不同的内存地址的啊
可以把类Y里面的变量x改称其他名字来考虑
public static void main(String[] args){
Y v2=new Y();
X v3=(X)v2;
System.out.println(v3.x);
System.out.println(v3.retvxx());
}
}
class X{
int x=10;
int retv(){
return x;
}
}
class Y extends X{
int y=20;
int x=30;
int retvxx(){
return x;
}
}试一试 你就什么都明白了