有段程序如下:
class A{
void Callme()
{
System.out.println("Inside A's Callme method");
}
}
class B extends A{
void Callme()
{
System.out.println("Inside B's Callme method");
}
}
class C extends A{
void Callme()
{
System.out.println("Inside C's Callme method");
}
}
class Dispatch
{
public static void main(String[] args)
{
A a = new A();
B b = new B();
C c = new C();
A r;
r = a;
r.callme();
r = b;
r.callme();
r = c;
r.callme();
}
}
结果:
Inside A's callme method
Inside B's callme method
Inside C's callme method这里想问的是关于:”父类引用变量可以引用子类对象“的问题,
在一些资料里看到的描述提出“这个引用可以访问的是父类中的内容”
这里为什么结果不一样呢?按我理解应该是使用父类中的方法。难道是因为方法的重写?
请高手具体的说一下这里的关系,对于动态方法分配和“父类引用变量可以引用子类对象”我现在有些糊涂了,“父类引用变量可以引用子类对象”这有什么 好处吗?
这是我的处女帖,望大家支持
class A{
void Callme()
{
System.out.println("Inside A's Callme method");
}
}
class B extends A{
void Callme()
{
System.out.println("Inside B's Callme method");
}
}
class C extends A{
void Callme()
{
System.out.println("Inside C's Callme method");
}
}
class Dispatch
{
public static void main(String[] args)
{
A a = new A();
B b = new B();
C c = new C();
A r;
r = a;
r.callme();
r = b;
r.callme();
r = c;
r.callme();
}
}
结果:
Inside A's callme method
Inside B's callme method
Inside C's callme method这里想问的是关于:”父类引用变量可以引用子类对象“的问题,
在一些资料里看到的描述提出“这个引用可以访问的是父类中的内容”
这里为什么结果不一样呢?按我理解应该是使用父类中的方法。难道是因为方法的重写?
请高手具体的说一下这里的关系,对于动态方法分配和“父类引用变量可以引用子类对象”我现在有些糊涂了,“父类引用变量可以引用子类对象”这有什么 好处吗?
这是我的处女帖,望大家支持
解决方案 »
- JAVA正则表达式
- 父类构造方法没有运行竟然就加载完了?
- 做简历,100分求几个项目文档(对项目的描述和责任描述以及主要模块),谢谢
- 在ComboBox里面怎么加入动态图片(例如动态聊天表情)
- 求源码:JXL将一个文件的sheet拷贝到另一文件
- Vector反序列化问题。
- RTFEditorKit读中文rtf文件失败
- 当浏览器从图标恢复成窗口时start()怎么没有多次执行啊?
- 一个疑问:用java德有多少人关心过内存的使用情况,我发现java程序员只会new Object()没有人使用像c里面的析构函数。不明白,清高人指
- 用什么方法可以让JAVA生成N多个乱七八糟的而且有些还带$符号的CLASS文件呢?
- 关于JAVA执行 LINUX 下 命令的问题,Runtime.getRuntime().exec(cmd) 的问题
- 想写一个java对象池,有无代码可参考
r指向b这个对象
r=B,r指向B,而非A。此时r会屏蔽B类有而A类不存在的变量或方法。
另外子类中新增的方法此时不可见(如你在C类中增加一个方法F(),则r=c后,r.F()将出错)A r;
B b = new B();
r = b;此时r为A类型的引用,但它指向的对象是B类的对象,也就是子类对象至于好处,你可以看看书,多态的用处
举个经典的例子吧:
Class Shape{
public void draw()
{
}
}
Class A1 extends Shape
{
public void draw()
{
}
}
Class A2 extends Shape
{
public void draw()
{
}
}每种形状都可以画,如三角形,正方形等等,但每种形状的画法又不一样
有如下方法
public void drawShape(Shape shape)
{
shape.draw();
}
则该方法可以根据你实际传进来的对象调用相应的方法
比如:drawShape(new A1()),此时shape指向A1对象,则shape.draw()调用A1中的draw()
drawShape(new A2()),此时shape指向A2对象, 则shape.draw()调用A2中的draw()如果A1 A2中没有重写draw(),都将调用Shape中的 draw()第一次回答这么长,好象有点乱,不知道你能看懂不
希望对你有所帮助!!!
a b c 3个对象是3个引用啊,分别指向 不同的内存堆里的地址虽然你把a b c 赋给他超类的变量,但是引用是不会变的。do you understand?