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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾玉锋 高级黑马   /  2012-7-22 10:08  /  2208 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在网上查了一些关于接口和抽象类的区别,具体特点就不在这里说了。鉴于抽象类的种种限制和不方便,我想知道抽象类的应用范围在哪里?什么时候必须要用到抽象类,而不用实体类和接口来代替?我想,应该有很多同学也有一样的疑惑,求高手指点!当然,如果可以举一个实际的有意义的例子就更好了!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

倒序浏览
接口是一种协定,抽象类则相当于类模板。
使用抽象类,而不要使用接口来分离协定与实现。
如果需要提供多态层次结构的值类型,使用接口。
如果一个类型必须实现多个协定,或者协定适用于多种类型,使用接口。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 徐帅 于 2012-7-22 11:26 编辑

1. 抽象类和一般类
抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物,只不过, 该事物出现了一些看不懂的东西。
这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体。通过抽象方法来表示。抽象类比一般类多
个了抽象函数。就是在类中可以定义抽象方法。
       2.接口的应用特点:
       1> 接口是对外暴露的规则。
       2> 接口是功能的扩展。
       3> 接口的出现降低了耦合性。
            4> 接口型引用指向子类对象(多态)提高的程序扩展性,呈现多态
2 抽象类和接口异同:
       相同点:
    1> 都可以在内部定义抽象方法。
              2> 通常都在顶层。
              3> 都不可以实例化,都需要子类来实现。
       不同点:
              1> 抽象类中可以定义抽象方法和非抽象方法,
                而接口中只能定义抽象方法。
              2> 接口的出现可以多实现。抽象类只能单继承。
            也就是说:接口的出现避免了单继承的局限性。
        3> 继承和实现的关系不一致。继承:is a,实现:like a
          !!! 基本功能定义在类中,扩展功能定义在接口中

电脑的例子,各个厂商按照规则生产不同的主板和声卡,网卡等各种卡,主板为后期可能产生的各种卡提供了扩展的接口,
              只要符合这个接口的规则就可以使用,依赖性降低,提高了扩展性,而有些卡是扩展的功能,前期不一定知道
              会有这种功能。只要提供了规则就可以,所以降低了耦合性,而抽象类则提供了一般的功能,如果继承则将必须实现所有的抽象方法,
              有的抽象类中还有非抽象方法,这样继承则可能出现冗杂性,而且具有但继承的局限性,java通过多实现来多实现方法来体现多继承的特性
              以下是实例,
interface PCI
{
        public void open();
        public void close();
}

class MainBoard
{
        public void run()
        {
                System.out.println("mainboard run ");
        }
        public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。
        {
                if(p!=null)
                {
                        p.open();
                        p.close();
                        
                }
        }
}

class NetCard implements PCI
{
        public void open()
        {
                System.out.println("netcard open");
        }
        public void close()
        {
                System.out.println("netcard close");
                method();
        }
        
}
class SoundCard implements PCI
{
        public void open()
        {
                System.out.println("SoundCard open");
        }
        public void close()
        {
                System.out.println("SoundCard close");
        }
}

class DuoTaiDemo5
{
        public static void main(String[] args)
        {
                MainBoard mb = new MainBoard();
                mb.run();
                mb.usePCI(null);
                mb.usePCI(new NetCard());
                mb.usePCI(new SoundCard());
               
        }
}
希望可以帮到你,有些表达不是很好,呵呵。


评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
王超 发表于 2012-7-22 11:14
接口是一种协定,抽象类则相当于类模板。
使用抽象类,而不要使用接口来分离协定与实现。
如果需要提供多态 ...

谢谢你!不过,其他的都看理解,但是这句话"使用抽象类,而不要使用接口来分离协定与实现" 有点不懂。
回复 使用道具 举报
抽象类特点:
1、抽象方法一定在抽象类中。
2、抽象类和抽象方法必须被abstract关键字修饰
3、抽象类不可以用new创建对象,因为调用方法没意义
4、抽象类方法中要被使用,必须由子类复写所有抽象方法,建立子类对象调用
     如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类

接口的特点: 1、不可以创建对象,因为有抽象方法,需要被子类实现。
                          子类对接口中的抽象方法全部覆盖,子类才可以实例化。
                          否则子类是一个抽象类
                      2、对外暴露原则(比如暴露给用户一些功能,方便交互)                     
                      3、程序功能的扩展(比如软件总会面临更新换代,接口可以进行新功能的扩展)
                      4、接口可以用来多实现(因为类与类之间不能多继承,因为可能会引发安全问题。接口的多实现因为都是抽象的正好弥补了这一点,不会出现安全问题)
                      5、类与接口是实现关系,而且类可以继承一个类的同时实现多个接口(很强大的!!!!)
                      6、接口与接口之间可以有继承关系

注意:还有一点是抽象类中可以含有非抽象方法,但是接口中方法必须全是抽象的
总结之:用抽象类的继承一般是子类与抽象类是所属关系,用接口实现一般是用于程序的扩展

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
1, 抽象类是用来继承的,只能单继承。
接口是用来实现的,可以多实现,避免了单继承的局限性。
2, 抽象类可以定义抽象方法,抽象类中也可以定义非抽象内容,直接提供给子类使用。它可以用于定义体系的基本共性的内容。
接口中只能定义抽象方法,需要子类全部实现。 它主要用于对象的功能的扩展。
3, 抽象类存在着继承关系,是is a关系。
接口的实现关系,是 like a 关系。
  4, 抽象类中的成员修饰符都是自定义的
      接口中的修饰符都是固定的。
共同点:
        它们都是不断抽取而来的。
注意事项:
记住: 类里面都是定义的一些基础内容,接口里面都是定义一些特性内容,这样做方便了对其进行扩展。
   不要把接口狭义的理解为interface,应该理解广义些,就是对外提供的规则,凡是对外暴露的都可以是接口。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
当描述事物时,没有足够的信息对该事物进行描述,那么该描述对应的类就是一个抽象类。

抽象类的特点:
1,没有方法体的方法是抽象方法,一定定义在抽象类中。
2,抽象类和抽象方法必须用abstract关键字所修饰。
3,抽象类不可以被实例化。为啥?因为调用抽象方法没有意义。
4,抽象类必须由其子类覆盖掉所有的抽象方法后,其子类才可以进行实例化。否则,该子类还是一个抽象类。

它的应用就是不能使用在具体的事物上,比如公司的员工,那么多的公司员工只能用一个整体来表示,这样就用到了抽象类。在比如80万大军,你不可能知道他们的名字
但是可以用禁军教头林冲代表80万大军,而林冲就相当于抽象类(这是我自己总结比喻的)

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
罗京雨 发表于 2012-7-22 18:36
当描述事物时,没有足够的信息对该事物进行描述,那么该描述对应的类就是一个抽象类。

抽象类的特点:

恩,明白了,谢谢。也就是说,抽象类就是一种特殊的基类吧。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马