一个未曾想到的问题

给代码吧。
接口:
1 package com.duduli.li;
2 
3 public interface AbstratImp {
4     public void display();
5 }
抽象类:
1 package com.duduli.li;
2 
3 public abstract class Abstrat {
4     public void display(){
5         System.out.println("welcome");
6     }
7 }
实现类:
1 package com.duduli.li;
2 
3 public class TestAbstrat extends Abstrat implements AbstratImp{
4     @Override
5     public void display() {
6         System.out.println("bye");
7     }
8 }
测试类:
 1 package com.duduli.li;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         Abstrat ta = new TestAbstrat();
 6         AbstratImp ti = new TestAbstrat();
 7         ta.display();
 8         ti.display();
 9     }
10 }
结果很容易知道是都是bye bye。
不过大家有没有想过,在实现类中的display方法有没有复写抽象类中的display方法,还是只是实现了接口中的display方法呢?
或是先复写了抽象类中的display,然后又在实现接口中的display方法,进而再复写了抽象类中的display方法了。
希望有高手能解答一下。

posted on 2009-03-02 22:37 duduli 阅读(1727) 评论(14)  编辑  收藏 所属分类: java

评论

# re: 一个未曾想到的问题[未登录] 2009-03-03 00:40 飘然

不知所云,你到底想表示什么?

”在实现类中的display方法有没有复写抽象类中的display方法,还是只是实现了接口中的display方法呢?“ 在你的想象中,java的method,interface,override是什么啊,怎么有这么莫名其妙的说法?  回复  更多评论   

# re: 一个未曾想到的问题 2009-03-03 09:36 duduli

其实也没没有想表示什么。只是以前并没有想过这样的问题。现在想想。当然你不明白也是很正常的,如果你把上面的例子运行一下或许就会知道的,为什么上面不会输出welcome。有没有这样想过呢?@飘然
  回复  更多评论   

# re: 一个未曾想到的问题 2009-03-03 12:19 ghyghost

应该是覆盖抽象类中的  回复  更多评论   

# re: 一个未曾想到的问题[未登录] 2009-03-03 12:22 蜗牛

其实 ta.display(); ti.display(); 都会调用实现类的方法而不是抽象类或者接口的。  回复  更多评论   

# re: 一个未曾想到的问题[未登录] 2009-03-03 12:22 蜗牛

尽管他们被接口类型或者抽象类型引用  回复  更多评论   

# re: 一个未曾想到的问题 2009-03-03 12:50 wanbing1986

public class TestAbstrat extends Abstrat implements AbstratImp{
@Override
public void display() {
System.out.println("bye");
}
}

@Override 这个单词是什么意思啊,我想应该是这个吧  回复  更多评论   

# re: 一个未曾想到的问题[未登录] 2009-03-03 15:28 ytl

@Override
表示重载父类的方法意思  回复  更多评论   

# re: 一个未曾想到的问题[未登录] 2009-03-03 15:50 飘然

有没有这样想过呢?

不是有没有想过,而且,这个东东,是java语言或者说是oo的最最基本的东西,犹如吃饭呼吸般自然,还需要你这么慎重其事的"想过"?

你不要告诉我你是新人刚接触java或者oo,第一次明白重载?

晕,这种帖子你也敢放首页?过家家啊?  回复  更多评论   

# re: 一个未曾想到的问题 2009-03-03 15:51 zy.weiliang@gmail.com

请注意一个问题,java在调用方法时,是以方法签名+类层次关系去寻找的,在调用时没有复写和实现这个概念
不要太被什么是重写,什么是实现这些概念搞了,  回复  更多评论   

# re: 一个未曾想到的问题 2009-03-03 16:14 po

动态绑定  回复  更多评论   

# re: 一个未曾想到的问题[未登录] 2009-03-05 00:32 Jonney

接口只是一个标示,标明这个类已经实现了指定名字和参数的方法。  回复  更多评论   

# re: 一个未曾想到的问题 2009-03-11 00:49 战神

@飘然

override叫重写,或者叫覆盖
是针对父类与子类之间的多态性而言的

overload才叫做重载
是一个类本身多态性的体现

飘然你自己都分不清override和重载,还来教训别人,讽刺~
  回复  更多评论   

# re: 一个未曾想到的问题 2009-03-11 01:45 战神

这个问题可以这样来看~

首先,一个类肯定是先继承某个类(Java中类的继承呈树状结构,最顶层是Object),之后才会可有可无的遵循某些接口~

回到问题中,TestAbstrat里面不要写任何方法,然后他继承Abstrat,他拥有一切Abstrat可继承的东西--他继承了Abstrat的display方法,完后,他发现他还需要实现AbstratImp的接口,而正好,他已经拥有了这个方法,因为他父类实现了,所以他也拥有了,好了,一切看似完美了,但TestAbstrat他发现挺不习惯父类的display,于是,他自己重写了一个,覆盖了父类的display方法

听懂了没?没懂?那好,我讲通俗点:

你是你老爸的儿子,你继承了你老爸特能吃的优良胃口(继承方法),你某天突然听到有人在说"人是铁饭是钢一顿不吃饿得慌"的人生法则(实现接口),你心说好险...幸好我老爸把能吃继承给我了~~好了,你长大了,翅膀硬了,特不习惯老爸用筷子东挑西拈那套--爷喜欢爽快,用手抓的(重写方法)

再回到问题,整个过程中,是TestAbstrat重写了Abstrat的方法,而碰巧这个方法正好遵循了AbstratImp某个接口~

你就算在TestAbstrat中不重写display方法,你会发现程序也不会报错
而你在教科书上看到的是怎么说的:类必须实现implements 接口中的签名方法
  回复  更多评论   

# re: 一个未曾想到的问题 2009-03-29 02:17 t4

注意一下:
TestAbstrat.display()在实现AbstratImp中的display()方法的同时,也重写了Abstrat中的方法。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

公告

welcome to my place.

常用链接

留言簿(5)

我参与的团队

随笔分类

随笔档案

新闻分类

石头JAVA摆地摊儿

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

@duduli