class A
{
}
class B extends A
{
public static int a=3;
}
public class hh
{
public static void main(String args[])
{
A xx = new B();
System.out.println("a="+xx.a);
System.out.println("");
}
}
以的我理解new B()的时候已经给a分配了内存空间了.
但A 对于B对象的引用居然还访问不了它.怪哉
{
}
class B extends A
{
public static int a=3;
}
public class hh
{
public static void main(String args[])
{
A xx = new B();
System.out.println("a="+xx.a);
System.out.println("");
}
}
以的我理解new B()的时候已经给a分配了内存空间了.
但A 对于B对象的引用居然还访问不了它.怪哉
楼主【sure2003】截止到2008-07-24 15:02:42的历史汇总数据(不包括此帖):
发帖的总数量:263 发帖的总分数:10903 每贴平均分数:41
回帖的总数量:225 得分贴总数量:7 回帖的得分率:3%
结贴的总数量:257 结贴的总分数:10713
无满意结贴数:2 无满意结贴分:50
未结的帖子数:6 未结的总分数:190
结贴的百分比:97.72 % 结分的百分比:98.26 %
无满意结贴率:0.78 % 无满意结分率:0.47 %
值得尊敬
System.out.println("a="+xx.a);
xx这个引用的类型是A,A没有定义a这个属性,编译会发现错误,不会允许你通过编译.
1.method可以覆盖,动态绑定
2.fields不能覆盖,可以被隐藏
3.static的不能被覆盖.
但如果
A xx = new B();
改成
B xx = new B();编译就正确了.这又是为何?
xx的类型是A,A没有定义a,当然错误了.注意
A xx=new B();
xx是一个引用,它是A类型的,但是指向一个B类的对象.
一点也没用,可是又很难理解.....
这样编译通不过是因为 编译器 认为 xx 中并不存在 a这个成员,虽然在运行过程中是存在的因为编译器在编译 xx.a 只会认为 xx 是类 A的对象,而不可能知道 xx 真正的对象是什么,
感觉这个还是很有用的。比如很多类实现一个接口的时候,要制造一个对象但是并不确定它是属于确定的哪个类型就可以用上面那种情况。运行时的动态绑定。
当然LZ的问题只是xx是一个A类型的引用,B继承A时继承的是它的方法。也就是A的成员变量还是A的。所以A的引用不用使用B的成员变量。
只是你自己觉得没有用罢了,实际上这个功能才是面向对象的重要用处!例如我在写一个方法中,我只需要知道参数是一个List,至于它是ArrayList还是LinkedList都和我无关。
A xx = new B();实际上A一般都是抽象类,而且成员、方法都是有的(可能是抽象的或非抽象的),那样的才能用xx.来使用B里面的东西。这个跟类的引用没很大关系吧。汗~~~~~
{
}
class B extends A
{
public static int a=3;
}
public class C
{
public static void main(String args[])
{
A xx = new B();
System.out.println("a=" + ((B) xx).a);
}
}这样就可以啦!
c="hhh";
a=c;这也叫引用吗?
String 可也是类的