搞了两年多java了,结果今天才发现,实在是羞愧得很呀

shangqiao 2004-12-17 01:24:58
public class Test {

public static void main(String[] args) {
Test test=new Test();
A a=new B();
B b=(B)a;
test.a(b);
test.a(a);

C c=new D();
D d=(D)c;
test.c(c);
test.c(d);
}
public void a(A a){
System.out.println("a(A)");
}
public void a(B b){
System.out.println("a(B)");
}
public void c(C c){
System.out.println("c(C)");
}
public void c(D d){
System.out.println("c(D)");
}
}
class A{

}
class B extends A{

}
interface C{

}
class D implements C{

}
运行结果是:
a(B)
a(A)
c(C)
c(D)
怎么在继承关系上没有重载的概念呢?搞了两年多java了,今天才发现
...全文
3250 102 打赏 收藏 转发到动态 举报
写回复
用AI写文章
102 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphi_cxz 2005-01-12
  • 打赏
  • 举报
回复
ding
mm7711 2005-01-12
  • 打赏
  • 举报
回复
不是明白 ,学习
nj_draker 2005-01-12
  • 打赏
  • 举报
回复
没有空行的代码是垃圾!如果还需要维护和讨论,那就是烦人的垃圾
yqj2065 2005-01-12
  • 打赏
  • 举报
回复
“怎么在继承关系上没有重载的概念呢?”
错误的。
jiangx123 2005-01-12
  • 打赏
  • 举报
回复
A,B,C,D根本没有重载或者重写
只有Test 类有重载

不知道楼主想证明什么

public void a(A a) {
a.method();
}

public void a(B b) {
b.method();
}

class A{
void method(){
System.out.println("methodA");
}

}
class B extends A{
void method(){
System.out.println("methodB");
}

}
yqj2065 2005-01-12
  • 打赏
  • 举报
回复
说两句:
楼主的问题涉及的:向上造型、重载方法的调用。
建议暂时不考虑override,否则问题更复杂。

最好研究这个例子:
class 人{}
class 中国人 extends 人{}
class 湖北人 extends 中国人{}
class 日本人 extends 人{}
class 广岛人 extends 日本人{}

public class H{
void 打(人 m, 日本人 jp){System.out.println(m+"打"+jp); }
void 打(中国人 c, 人 m ){System.out.println(c+"打"+m); }
void 打(湖北人 hb, 日本人 jp){System.out.println(hb+"打"+jp); }

public static void main(String[] args){
H hhh=new H();
hhh.打((new 人()), (new 日本人()));
hhh.打((new 湖北人()), (new 人()));
//hhh.打((new 人()), (new 人()));//编译出错
hhh.打((new 湖北人()), (new 广岛人()));
//hhh.打((new 中国人()), (new 日本人()));
}
}
lhj 2005-01-12
  • 打赏
  • 举报
回复
哈哈,不知道楼主希望得到什么样的结果,我认为结果是非常正确的。因为你定义的变量是A这种类型,所以调用A这种类型对应的方法,而不会管你A的实际引用类型是B。
我认为楼主对java是很精通的,对继承和重载的理解没有问题,同时我也建议楼主从编译原理的角度考虑一下,是不是更合理一些。
jiangx123 2005-01-12
  • 打赏
  • 举报
回复
楼主莫名其妙啊,好好补补基础知识吧
llhdf 2005-01-04
  • 打赏
  • 举报
回复
java编程思想. 将会帮助你.
wangsheng1028 2005-01-04
  • 打赏
  • 举报
回复
重载。。是overload。。。这个是所谓的编译前绑定(前绑定)
重写。。是override。。。这个是所谓的编译后绑定(后绑定)
两个完全不同的概念。。。

楼主说的是重载,编译前就已经决定了它的类型,当然会调用相应的方法!
lodestar51 2005-01-02
  • 打赏
  • 举报
回复
不是明白 ,学习
nwpulipeng 2005-01-02
  • 打赏
  • 举报
回复
哪是什么重载呀,楼主没有搞清楚概念吧
cly33 2005-01-02
  • 打赏
  • 举报
回复
哎,我刚学的java,
不过一下子就看出答案了,没什么好难的嘛,
大概你是没分清接口和所谓实例的概念吧
gietwgh 2005-01-02
  • 打赏
  • 举报
回复
悲哀啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
fireflyqt 2004-12-31
  • 打赏
  • 举报
回复
因为这种函数调用的参数绑定是在编译期进行的,而在编译期,编译器只能根据其声明的类型来进行判断,而不会理会它里面的实际内容为何,这与多态不同,因为多态是执行期进行的动态绑定。
楼主是不是想问这个
iceball 2004-12-31
  • 打赏
  • 举报
回复
回复人: sgdb(神天月晓) ( ) 信誉:121 2004-12-17 15:18:59 得分: 0

这里用的不是重载吧,这里是java的上溯特性
既然你声明了a,无论他的实例是什么类型,在编译的时候都认定是a;
楼主似乎把类型和对象实例搞混了

建议楼主好好想想这个大哥给你的解释!

uliyas 2004-12-31
  • 打赏
  • 举报
回复
和多态没有关系的。函数调用严格要求匹配的啊!
yuanetking 2004-12-31
  • 打赏
  • 举报
回复
please tell me what object type about your a, if u answer the A ,and congratulation u! so the out put is the a(A)
mahf 2004-12-31
  • 打赏
  • 举报
回复
恭喜
guojian_ren 2004-12-31
  • 打赏
  • 举报
回复
老天,以前还真没注意过。
加载更多回复(82)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧