java接口继承接口有啥意义?

千里8 2014-04-11 08:45:28
java接口继承接口有意义吗?比如
interface People{
void id();

}

interface User extends People{
void id();
void name();

}

继承不是就是为了代码的重构重用性吗?这样继承后,子接口还是要重写了父接口的方法,这样不是违背了继承的原则性和性了吗?看了jdk源码,但人家就是这么干的,到底有什么意义或作用?????
...全文
24624 41 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
nantong-xiaosong 2016-11-23
  • 打赏
  • 举报
回复
继承:你爸挣了200万,那么你出生时就有了两百万,你爸帮你挣的,要用钱,直接问你爸要,是不是。继承就是这关系。父类有的,直接用,不够用了,或是用得不爽就复写,跟你用你爸钱一样,你爸的钱只有200万,你小子想要300万,还差100万,那就得自己去挣了,明白不。 接口:还是把继承先理清楚吧,接口是一种抽象的思想。
  • 打赏
  • 举报
回复
历史遗留案件,楼主居然还没结帖,估计是忘了账号密码了把
cuixiuqin1954 2016-11-20
  • 打赏
  • 举报
回复
有意思,一个老贴还在追答
qq_18620509 2016-11-19
  • 打赏
  • 举报
回复
你应该这样理解,接口的作用在于定义规范。 list重写Collection的方法,其实就是在重新定义方法的规则。比如list的add方法需要将元素加到最后一个,Collection却没有定义这种规范,你可以随意加到每一个位置。覆盖方法只是给继承者一个提醒,表明我有我自己独特的规则。效果上是没有实际作用的。
zhangcaiqi888 2014-06-11
  • 打赏
  • 举报
回复
和类继承一样
千里8 2014-06-10
  • 打赏
  • 举报
回复
引用 33 楼 yangweihong20110929 的回复:
[quote=引用 31 楼 hazel_81 的回复:] interface People{ void id(); } interface User extends People{ void id(); void name(); } 你的例子是接口继承了接口,他并没有重用,只是说明人有一个id号,而用户是一个人,用户也有id号,并且用户要多一个用户名。 如果把你的例子里面的两个interface改为class的话,意思就可以这么写。 abstract class People{ int id(){ return 1; } } class User extends People{ void name(); } 这个时候意思虽然没变,但是当你用User customer=new User();的时候,如果 int i=customer.id(); 就可以得到1,你没有在User类里面写过int id()方法,但是你还是得到id值,这不是一种重用吗?如果People类是别人写的,而User类是你写的,你不是很省力的得到了别人写的People的全部功能,而你只是写了User类,给它添加了一个返回名字的方法,这样你不用改变别人写的People类。 那么再回到刚才的Interfac继承的问题,为了要Interface继承呢,如果另外一个类里面有一个方法 int GetId(People p);而且它在很多地方地方都用到People这个接口,如果项目拿到你手里收,客户说User是一个带用户名的People类,那么你可以去改People接口,增加一个Name方法,但是这样做不太好,你可以继承People这个接口,写这个你给我看的User接口,然后去写一个具体的User类实现User接口,这样所有int GetId(People p)的地方都需要改动,因为以前写的类只到People只有一个id方法,但是其实你的People功能已经不止这么点了,但是你改了以后,以前的代码不用动,而只需要在新的代码里增加String getName(User user);这样的办法。 老外比较喜欢这么写,这样写看起来很啰嗦,开始写程序的时候不需要追求这些,但是这条路是必经的,早晚写着写着就追求这样的境界了,慢慢来。
这个说的挺好,接口化的编程,我比较喜欢,现实中很多人尤其是新手,可能不太喜欢这么干,而且觉得接口这东西有什么用呢?甚至一个项目中一个接口都看不到,这样子的写的项目维护起来累死人。[/quote] 对,我也是这个没认为
千里8 2014-06-10
  • 打赏
  • 举报
回复
引用 31 楼 hazel_81 的回复:
interface People{ void id(); } interface User extends People{ void id(); void name(); } 你的例子是接口继承了接口,他并没有重用,只是说明人有一个id号,而用户是一个人,用户也有id号,并且用户要多一个用户名。 如果把你的例子里面的两个interface改为class的话,意思就可以这么写。 abstract class People{ int id(){ return 1; } } class User extends People{ void name(); } 这个时候意思虽然没变,但是当你用User customer=new User();的时候,如果 int i=customer.id(); 就可以得到1,你没有在User类里面写过int id()方法,但是你还是得到id值,这不是一种重用吗?如果People类是别人写的,而User类是你写的,你不是很省力的得到了别人写的People的全部功能,而你只是写了User类,给它添加了一个返回名字的方法,这样你不用改变别人写的People类。 那么再回到刚才的Interfac继承的问题,为了要Interface继承呢,如果另外一个类里面有一个方法 int GetId(People p);而且它在很多地方地方都用到People这个接口,如果项目拿到你手里收,客户说User是一个带用户名的People类,那么你可以去改People接口,增加一个Name方法,但是这样做不太好,你可以继承People这个接口,写这个你给我看的User接口,然后去写一个具体的User类实现User接口,这样所有int GetId(People p)的地方都需要改动,因为以前写的类只到People只有一个id方法,但是其实你的People功能已经不止这么点了,但是你改了以后,以前的代码不用动,而只需要在新的代码里增加String getName(User user);这样的办法。 老外比较喜欢这么写,这样写看起来很啰嗦,开始写程序的时候不需要追求这些,但是这条路是必经的,早晚写着写着就追求这样的境界了,慢慢来。
谢谢
千里8 2014-06-10
  • 打赏
  • 举报
回复
引用 楼主 u014542482 的回复:
java接口继承接口有意义吗?比如 interface People{ void id(); } interface User extends People{ void id(); void name(); } 继承不是就是为了代码的重构重用性吗?这样继承后,子接口还是要重写了父接口的方法,这样不是违背了继承的原则性和性了吗?看了jdk源码,但人家就是这么干的,到底有什么意义或作用?????
谢谢指点
hazel_81 2014-04-14
  • 打赏
  • 举报
回复
interface People{ void id(); } interface User extends People{ void id(); void name(); } 你的例子是接口继承了接口,他并没有重用,只是说明人有一个id号,而用户是一个人,用户也有id号,并且用户要多一个用户名。 如果把你的例子里面的两个interface改为class的话,意思就可以这么写。 abstract class People{ int id(){ return 1; } } class User extends People{ void name(); } 这个时候意思虽然没变,但是当你用User customer=new User();的时候,如果 int i=customer.id(); 就可以得到1,你没有在User类里面写过int id()方法,但是你还是得到id值,这不是一种重用吗?如果People类是别人写的,而User类是你写的,你不是很省力的得到了别人写的People的全部功能,而你只是写了User类,给它添加了一个返回名字的方法,这样你不用改变别人写的People类。 那么再回到刚才的Interfac继承的问题,为了要Interface继承呢,如果另外一个类里面有一个方法 int GetId(People p);而且它在很多地方地方都用到People这个接口,如果项目拿到你手里收,客户说User是一个带用户名的People类,那么你可以去改People接口,增加一个Name方法,但是这样做不太好,你可以继承People这个接口,写这个你给我看的User接口,然后去写一个具体的User类实现User接口,这样所有int GetId(People p)的地方都需要改动,因为以前写的类只到People只有一个id方法,但是其实你的People功能已经不止这么点了,但是你改了以后,以前的代码不用动,而只需要在新的代码里增加String getName(User user);这样的办法。 老外比较喜欢这么写,这样写看起来很啰嗦,开始写程序的时候不需要追求这些,但是这条路是必经的,早晚写着写着就追求这样的境界了,慢慢来。
_serendipity_ 2014-04-14
  • 打赏
  • 举报
回复
引用 28 楼 yys79 的回复:
帖子讨论很热烈啊,楼上诸位说的有道理,基本就那么回事。不过另外一个重要的作用是方便编写Mock类,做单元测试非常方便。比如maven直接默认支持一个test的源代码文件夹,单元测试越来越重要了。
是啊,接口对单元测试来说太重要了。
_serendipity_ 2014-04-14
  • 打赏
  • 举报
回复
引用 27 楼 wlwlwlwl015 的回复:
[quote=引用 26 楼 u013734720 的回复:] [quote=引用 12 楼 wlwlwlwl015 的回复:] [quote=引用 11 楼 u014542482 的回复:] [quote=引用 9 楼 wlwlwlwl015 的回复:] [quote=引用 7 楼 u014542482 的回复:] [quote=引用 3 楼 wlwlwlwl015 的回复:] 比如在项目中需要N个接口,他们都要实现一些常用的功能,这样你就可以只写一个接口,然后让你的其他接口都这个接口。通常IBaseDao就是这样的。定义一个泛型接口,然后让其他接口去继承它并定义各自的泛型类,这样就方便很多。
继承IBaseDao接口的接口不是还要重写IBaseDao接口中的的抽象方法吗?对吧!继承后还要重写父接口的方法,岂不是起不到代码重用的作用。应该这样做只是为了层次分明吧!![/quote] 重写是根据需求来的,也可以不重写啊谁说一定要重写了?我在IbaseDao定义了所有常用接口。。我继承之后接口就可以用。。一般是我的接口继承IBaseDao,我的类实现IbasezDao并继承IBaseDao的实现类。。这一点在继承泛型对象时特别方便方法调用。可以说我的dao的接口和实现类不需要写任何代码就可以使用父类接口的方法了。[/quote] 我知道不用一定要重写,但你肯定会重写父接口一个方法吧!那么这时候是不是违法了继承的原则性。继承就是为了不用再去重写父接口的东西,才起着意义。[/quote] 为什么要重写父接口的方法,我继承之后什么都不用写,直接用。不知道你哪里不理解,给你看个栗子:

public interface IBaseDao<T>
{
	public T add(T t);

	public void update(T t);

	public void delete(int id);

        ……  等等省略
    

public interface YdAccountDao extends IBaseDao<YdAccount>{
        //这里什么都不写.如果有需求可以继续写自己的业务方法
}
[/quote] 还是不理解这段代码有什么意义。接口就是功能定义的集合,可以用来定义规范。这段代码既没有增加新功能,也没有描述新规范,有什么存在的必要呢?[/quote] public T add(T t); public void update(T t); public void delete(int id); 这些不是功能吗?你还要什么功能?[/quote] 抱歉没表达清楚,我指的是YdAccountDao。
loveunittesting 2014-04-14
  • 打赏
  • 举报
回复
帖子讨论很热烈啊,楼上诸位说的有道理,基本就那么回事。不过另外一个重要的作用是方便编写Mock类,做单元测试非常方便。比如maven直接默认支持一个test的源代码文件夹,单元测试越来越重要了。
小灯光环 2014-04-14
  • 打赏
  • 举报
回复
引用 26 楼 u013734720 的回复:
[quote=引用 12 楼 wlwlwlwl015 的回复:] [quote=引用 11 楼 u014542482 的回复:] [quote=引用 9 楼 wlwlwlwl015 的回复:] [quote=引用 7 楼 u014542482 的回复:] [quote=引用 3 楼 wlwlwlwl015 的回复:] 比如在项目中需要N个接口,他们都要实现一些常用的功能,这样你就可以只写一个接口,然后让你的其他接口都这个接口。通常IBaseDao就是这样的。定义一个泛型接口,然后让其他接口去继承它并定义各自的泛型类,这样就方便很多。
继承IBaseDao接口的接口不是还要重写IBaseDao接口中的的抽象方法吗?对吧!继承后还要重写父接口的方法,岂不是起不到代码重用的作用。应该这样做只是为了层次分明吧!![/quote] 重写是根据需求来的,也可以不重写啊谁说一定要重写了?我在IbaseDao定义了所有常用接口。。我继承之后接口就可以用。。一般是我的接口继承IBaseDao,我的类实现IbasezDao并继承IBaseDao的实现类。。这一点在继承泛型对象时特别方便方法调用。可以说我的dao的接口和实现类不需要写任何代码就可以使用父类接口的方法了。[/quote] 我知道不用一定要重写,但你肯定会重写父接口一个方法吧!那么这时候是不是违法了继承的原则性。继承就是为了不用再去重写父接口的东西,才起着意义。[/quote] 为什么要重写父接口的方法,我继承之后什么都不用写,直接用。不知道你哪里不理解,给你看个栗子:

public interface IBaseDao<T>
{
	public T add(T t);

	public void update(T t);

	public void delete(int id);

        ……  等等省略
    

public interface YdAccountDao extends IBaseDao<YdAccount>{
        //这里什么都不写.如果有需求可以继续写自己的业务方法
}
[/quote] 还是不理解这段代码有什么意义。接口就是功能定义的集合,可以用来定义规范。这段代码既没有增加新功能,也没有描述新规范,有什么存在的必要呢?[/quote] public T add(T t); public void update(T t); public void delete(int id); 这些不是功能吗?你还要什么功能?
草原的雨夜 2014-04-14
  • 打赏
  • 举报
回复
引用 31 楼 hazel_81 的回复:
interface People{ void id(); } interface User extends People{ void id(); void name(); } 你的例子是接口继承了接口,他并没有重用,只是说明人有一个id号,而用户是一个人,用户也有id号,并且用户要多一个用户名。 如果把你的例子里面的两个interface改为class的话,意思就可以这么写。 abstract class People{ int id(){ return 1; } } class User extends People{ void name(); } 这个时候意思虽然没变,但是当你用User customer=new User();的时候,如果 int i=customer.id(); 就可以得到1,你没有在User类里面写过int id()方法,但是你还是得到id值,这不是一种重用吗?如果People类是别人写的,而User类是你写的,你不是很省力的得到了别人写的People的全部功能,而你只是写了User类,给它添加了一个返回名字的方法,这样你不用改变别人写的People类。 那么再回到刚才的Interfac继承的问题,为了要Interface继承呢,如果另外一个类里面有一个方法 int GetId(People p);而且它在很多地方地方都用到People这个接口,如果项目拿到你手里收,客户说User是一个带用户名的People类,那么你可以去改People接口,增加一个Name方法,但是这样做不太好,你可以继承People这个接口,写这个你给我看的User接口,然后去写一个具体的User类实现User接口,这样所有int GetId(People p)的地方都需要改动,因为以前写的类只到People只有一个id方法,但是其实你的People功能已经不止这么点了,但是你改了以后,以前的代码不用动,而只需要在新的代码里增加String getName(User user);这样的办法。 老外比较喜欢这么写,这样写看起来很啰嗦,开始写程序的时候不需要追求这些,但是这条路是必经的,早晚写着写着就追求这样的境界了,慢慢来。
这个说的挺好,接口化的编程,我比较喜欢,现实中很多人尤其是新手,可能不太喜欢这么干,而且觉得接口这东西有什么用呢?甚至一个项目中一个接口都看不到,这样子的写的项目维护起来累死人。
小灯光环 2014-04-14
  • 打赏
  • 举报
回复
引用 29 楼 u013734720 的回复:
[quote=引用 27 楼 wlwlwlwl015 的回复:] [quote=引用 26 楼 u013734720 的回复:] [quote=引用 12 楼 wlwlwlwl015 的回复:] [quote=引用 11 楼 u014542482 的回复:] [quote=引用 9 楼 wlwlwlwl015 的回复:] [quote=引用 7 楼 u014542482 的回复:] [quote=引用 3 楼 wlwlwlwl015 的回复:] 比如在项目中需要N个接口,他们都要实现一些常用的功能,这样你就可以只写一个接口,然后让你的其他接口都这个接口。通常IBaseDao就是这样的。定义一个泛型接口,然后让其他接口去继承它并定义各自的泛型类,这样就方便很多。
继承IBaseDao接口的接口不是还要重写IBaseDao接口中的的抽象方法吗?对吧!继承后还要重写父接口的方法,岂不是起不到代码重用的作用。应该这样做只是为了层次分明吧!![/quote] 重写是根据需求来的,也可以不重写啊谁说一定要重写了?我在IbaseDao定义了所有常用接口。。我继承之后接口就可以用。。一般是我的接口继承IBaseDao,我的类实现IbasezDao并继承IBaseDao的实现类。。这一点在继承泛型对象时特别方便方法调用。可以说我的dao的接口和实现类不需要写任何代码就可以使用父类接口的方法了。[/quote] 我知道不用一定要重写,但你肯定会重写父接口一个方法吧!那么这时候是不是违法了继承的原则性。继承就是为了不用再去重写父接口的东西,才起着意义。[/quote] 为什么要重写父接口的方法,我继承之后什么都不用写,直接用。不知道你哪里不理解,给你看个栗子:

public interface IBaseDao<T>
{
	public T add(T t);

	public void update(T t);

	public void delete(int id);

        ……  等等省略
    

public interface YdAccountDao extends IBaseDao<YdAccount>{
        //这里什么都不写.如果有需求可以继续写自己的业务方法
}
[/quote] 还是不理解这段代码有什么意义。接口就是功能定义的集合,可以用来定义规范。这段代码既没有增加新功能,也没有描述新规范,有什么存在的必要呢?[/quote] public T add(T t); public void update(T t); public void delete(int id); 这些不是功能吗?你还要什么功能?[/quote] 抱歉没表达清楚,我指的是YdAccountDao。[/quote] 我在YdAccountDao的实现类中就可以通过IBaseDao定义的方法对我的泛型类进行操作了,我在 IBaseDao的实现类中封装了一些常用操作的实现。
_serendipity_ 2014-04-13
  • 打赏
  • 举报
回复
引用 12 楼 wlwlwlwl015 的回复:
[quote=引用 11 楼 u014542482 的回复:] [quote=引用 9 楼 wlwlwlwl015 的回复:] [quote=引用 7 楼 u014542482 的回复:] [quote=引用 3 楼 wlwlwlwl015 的回复:] 比如在项目中需要N个接口,他们都要实现一些常用的功能,这样你就可以只写一个接口,然后让你的其他接口都这个接口。通常IBaseDao就是这样的。定义一个泛型接口,然后让其他接口去继承它并定义各自的泛型类,这样就方便很多。
继承IBaseDao接口的接口不是还要重写IBaseDao接口中的的抽象方法吗?对吧!继承后还要重写父接口的方法,岂不是起不到代码重用的作用。应该这样做只是为了层次分明吧!![/quote] 重写是根据需求来的,也可以不重写啊谁说一定要重写了?我在IbaseDao定义了所有常用接口。。我继承之后接口就可以用。。一般是我的接口继承IBaseDao,我的类实现IbasezDao并继承IBaseDao的实现类。。这一点在继承泛型对象时特别方便方法调用。可以说我的dao的接口和实现类不需要写任何代码就可以使用父类接口的方法了。[/quote] 我知道不用一定要重写,但你肯定会重写父接口一个方法吧!那么这时候是不是违法了继承的原则性。继承就是为了不用再去重写父接口的东西,才起着意义。[/quote] 为什么要重写父接口的方法,我继承之后什么都不用写,直接用。不知道你哪里不理解,给你看个栗子:

public interface IBaseDao<T>
{
	public T add(T t);

	public void update(T t);

	public void delete(int id);

        ……  等等省略
    

public interface YdAccountDao extends IBaseDao<YdAccount>{
        //这里什么都不写.如果有需求可以继续写自己的业务方法
}
[/quote] 还是不理解这段代码有什么意义。接口就是功能定义的集合,可以用来定义规范。这段代码既没有增加新功能,也没有描述新规范,有什么存在的必要呢?
_serendipity_ 2014-04-13
  • 打赏
  • 举报
回复
引用 20 楼 csb_tom_new 的回复:
接口的继承实际上是一个接口功能增加的过程,有些应用只需要简单的接口。通过继承,可以在简单的接口上得到适合自己需要的复杂接口
同意这个观点。
dokia123 2014-04-13
  • 打赏
  • 举报
回复
引用 19 楼 bobo928843007 的回复:
我对Java的接口也不理解,没有代码的实现,起不到什么重用作用,还多余写了代码。只是如果一个类要实现接口,就要强制实现它的方法。c++就没有接口
接口主要起到规范的作用啊,用来限制实现类的行为,其中的一个应用模式就是多态,多态应用场合挺多的。楼主可以去了解了解多态,就好理解了。
xxdxjq 2014-04-13
  • 打赏
  • 举报
回复
xxdxjq 2014-04-13
  • 打赏
  • 举报
回复
加载更多回复(21)

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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