A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 成果 黑马帝   /  2012-2-7 16:41  /  4535 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么时候用继承什么时候用接口方便。感觉差不多啊。有啥技巧咧。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1 请把求助改成已解决 谢谢合作

查看全部评分

16 个回复

倒序浏览
这个没有规定说什么时候得用继承什么时候得用接口,要看设计的需要;继承的话,更多的是一种“is-a”关系,形式单一;接口的话就接口,只是定义了规范,更像是一种框架,对外提供一组标准,个人见解

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
两者存在关系就用继承。能不能实现某个功能就用接口,接口约束的是行为。
LZ问的应该是什么时候用接口?什么时候用抽象类吧?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题加分!

查看全部评分

回复 使用道具 举报
本帖最后由 杨扬 于 2012-2-7 16:56 编辑

举个简单的例子...
定义一个线程的两种种方法.继承java.lang.Thread类.重写run()方法..和实现java.lang.Runnable接口.

如果你用第一种继承的方法定义线程后,你不能在继承其他的类了,这样导致了程序的扩展性大大降低,

剩下楼下补充{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
个人理解,使用接口,抽象类都是为了多态,让一个类有一些共同的属性,方法,方便向上转型。说明白了,这实际上是为了消除类型之间的差异,比如Jeep, Bus, Car类都可以继承Automobile类,那么可以使用Automobile的引用引用任何继承了Automobile的类,这样Jeep,Bus,Car的差异消除了,在我们眼里他们的差异消除了。
接口实际上可以说是更加完全的抽象类,因为抽象类可以用方法的实现,接口完全不可以。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
首先楼主应该明白使用继承的目的:
使用继承主要是为了不必重新开发,并且在不必了解实现细节的情况下拥有了父类我所需要的特征。但是很多时候,一个子类并不需要父类的所有特征,它可能只是需要其中的某些特征,但是由于通过继承,父类所有的特征都有了,需要的和不需要的特征同时具备了。而那些子类实际上不需要用到的,有时候甚至是极力避免使用的特征也可以随便使用,这就是继承的副作用。特别是允许多重继承的OO语言中,很容易引起不容易发现的错误。这个时候如果使用接口,就会避免继承的副作用。
希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
这个问题其实写程序多了,自然领悟就会越来越深,我觉得实际上是对面向对象中封装的理解问题。
一个类继承另一个类为的是使用父类的成员变量和方法,当父类完全可以满足子类需求时使用继承就可以了,举个例子:不管你是轿车卡车公汽,但是你核心都是由发动机轮子方向盘.....构成的,那么汽车这个类就满足了大方向上的需求,即大家都可以叫汽车.那么当生产轿车卡车公汽时为了效率先继承汽车类就好了,然后增加各自特有用的功能
至于接口,一个是为了弥补一个类只能继承一个类的缺点,另一个是为了实现封装吧,方便代码复写,因为接口只是定义了一个规范,提供了一个要实现的框架,它可以在不暴露对象类的前提下,暴露对象的编程接口,大大提供编程效率,适用于没有什么关联的类实现名称相同的功能,举个例子:电视,钓鱼竿,马桶 都有开关,但是开关原理都不一样,那我们就可以定义一个开关的接口,生产电视,钓鱼竿,马桶时让他们都实现开关接口,而他们开关的原理就各自实现就行了
反正感觉这个不好说完 还有待继续领悟啊

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
接口扩展了类的功能,它支持多重继承,同时又不会破坏类的继承体系,相当于在原有体系的基础上扩展出更多的功能。接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。继承则体现了代码的重用,体现了模块化的软件思想。假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个基类,让所有的Servlet都继承这个基类,在基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码        伪代码如下:
        public abstract class BaseServlet extends HttpServlet
        {
                        public final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException
                        {
                                记录访问日志
                                进行权限判断
        if(具有权限)
        {
                try
                {
                        doService(request,response);
        }
                catch(Excetpion e)
                {
                                记录异常信息
                }
        }
                        }
                        protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException;  
        //注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的
        }
       
        public class MyServlet1 extends BaseServlet
        {
        protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException
                        {
                                本Servlet只处理的具体业务逻辑代码
                        }
       
        }因此继承机制实现了代码重用,同时如果私自使用继承会使类的继承体系发生改变,因为java只支持单继承。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
使用继承,主要是不必要重新开发,功能重用,不必考虑太多的实现细节而拥有父类
的特征属性和方法;而接口是一种特殊的类,它表示一种能力,它只定义所有要完
成的任务,而不实现任何方法和属性;一般实际开发中使用接口胜过继承,因为继承
是单继承,而一个类可以实现多个接口,接口中只有静态常量和抽象方法,所以
在调用的时候只会调用实现类的方法,不会产生歧义。楼上的同学说的也很好,继承
与实现接口应在具体情况下具体分析和使用。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
个人理解,使用接口,抽象类都是为了多态,让一个类有一些共同的属性,方法,方便向上转型。说明白了,这实际上是为了消除类型之间的差异,比如Jeep, Bus, Car类都可以继承Automobile类,那么可以使用Automobile的引用引用任何继承了Automobile的类,这样Jeep,Bus,Car的差异消除了,在我们眼里他们的差异消除了。

接口实际上可以说是更加完全的抽象类,因为抽象类可以用方法的实现,接口完全不可以。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
两个其实差不多,当你需要用到多继承的时候, 就可以实行继承一个父类,实现多个接口!

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题加分!

查看全部评分

回复 使用道具 举报
小白 黑马帝 2012-2-10 18:14:23
12#
java中没有多继承,而接口可以弥补这个问题!在java当你需要实现像c语言中的多继承时就可以用接口来实现!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
倘若我们要实现多个类的方法,我们使用接口,接口是java中的多继承,而单继承只实用一个类,此外还有很多区别,自己可以下去了解
回复 使用道具 举报
一个对象只能继承一个类,但可以实现多个接口
注意:接口中所有定义的方法都要实现。
回复 使用道具 举报
maochong 黑马帝 2012-2-13 00:56:00
15#
Java中没有多继承,即一个类不能同时继承多个类。但一个类可以同时实现多个接口,如下:
public class F implements Father1,Father2,Father3{ }

     接口有利于代码功能的扩展(增加新的功能)。而继承则有利于代码功能的修改(把旧的功能改成新的功能)。这里旧功能的修改和新功能的增加前提是保留旧类源码,旧的功能仍然可以使用。

接着上面的继承举例:上面例子中的子类我们统称为一代子类

一. 用继承修改旧的功能

     现在如果一代子类F1的功能——“打孩子”,也就是方法hitChild()里边的功能实现有问题,我们要把具体实现修改掉,那么我们可以重新写一个新的二代子类F11继承自一代子类F1,并重写其hitChild()方法。

//二代子类
public class Son11 extends Son1{
   //重写父类“打孩子”方法
   public void hitChild(){
      System.out.println("我是二代子类对此方法的新实现");
   }
}

二. 用接口实现增加新的功能

     类F1已经有了“打孩子”功能,而我们有了新的需求,要给它增加一个新功能“宠孩子”(新方法pet()),而旧的代码不能动。那么我们可以定义一个新的接口(PetInterFace),接口里定义这个方法pet()的声明。再重新写一个二代子类F11,让它先继承类F1,同时实现接口 PetInterFace,并实现接口里的 pet()方法。
//新接口
public interface PetInterFace{
   //新方法
   public void petChild();
}
//二代子类
public class F11 extends F1 implements PetInterFace{
   //实现接口方法
   public void petChild(){
      System.out.println("父亲很爱我!");
   }
}
     这样这个二代子类F11即有了老的功能hitChild(),又有了新的功能petChild()。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
继承特点:
1.提高了代码的复用性。
2.让类与类之间产生了关系,有了这个关系,才有了多态的特性。
java只支持单继承,不支持多继承。因为多继承容易带来安全隐患,比如,当多个父类中定义了相同功能,但功能内容部分不同时,子类不知该执行哪个。但是java保留了这种机制,并用另一种体现形式来完成表示,即多实现。
接口可以被类多实现,也是对多继承不支持的转换形式。

java只有在接口与接口之间才存在多继承。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
继承是使用已存在的类的定义,作为基础建立新类的技术,新类的定义增加新的数据或新的功能,也可以用弗雷德功能,但不能选择性的继承父类..通过父类盒子类,我们实现了类的层次,可以从一般的类开始,逐步特殊化,定义一系列的子类.
                  
java中的接口是一些列方法的圣明,是一些方法特征的集合,接口只有方法的特征没有方法的实现先,因此这些方法可以再不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能).
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马