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

© 陆鹏 中级黑马   /  2012-7-13 08:25  /  2813 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

都是抽象,为什么要这样分?能举些例子吗,通俗好理解一点。

7 个回复

倒序浏览
抽象类可以有具体方法和抽象方法,这是和接口的区别,也因为这个区别抽象类和接口有不同的应用场景。
例如“动物”你是用接口来描述还是抽象类来描述?都可以,如果你的需求中“动物”的子类有很多共性的方法,那么你可以用抽象类来描述。如果你的需求中“动物”的子类没有共性方法,那么就用过接口定义不同的方法让子类去实现就可以了。
抽象类和接口的使用:
      1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
      2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
      3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。  
      4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
以下是我在网上看到的几个形象比喻,真的非常不错,呵呵:

   1>飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
   2> 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
抽象类和接口有什么区别?
简单来说,
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的.
另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

接口和抽象类的区别,我觉得主要是两点,一个是抽象类里还可以有非抽象的方法,虽然抽象类仍无法实例化,但是其子类可以,也就是说这些非抽象函数仍可以被多态调用,这也是抽象类为什么没有完全被接口取代的原因。接口就是相反了,不过接口也有一个优势是抽象类无法比拟,就是类可以继承多个接口,而抽象类和普通类一样,只能继承一个,所以接口可以解决多重继承问题。

抽象类可以只实现部分方法,接口则必须实现其全部方法;抽象类的方法可以有抽象方法,也可以有普通方法,接口里的方法必须是抽象方法;抽象类的方法的访问权限可以多种,接口的方法的访问权限只能是public;抽象类的子类只能继承一个抽象类,而实现接口的类可以同时实现多个接口.

笼统点说:
接口 = 定义了要做的所有事情,但自己啥也不干
抽象类 = 做了部分共做,剩下的他不干了,等后来人继续完成
这就是区别!

抽象类的成员可以具有访问级别,而接口的成员全部public级别
抽象类可以包含字段,而接口不可以,
抽象类可以继承接口,而接口不能继承抽象类
抽象类的成员可以具有具体实现,而接口不行
抽象的子类可以选择性实现其基类的抽象方法,而接口的子类必须全部实现  

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
抽象类:
抽象类要用abstract修饰,抽象类不可以被实例化,因为调用抽象方法没有意义,
1、而抽象类是可以有私有方法或私有变量的,实现抽象类可以有选择地重写需要用到的方法,但是必须实现里面所有的抽象方法。

2、抽象类在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。

3、抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法。

4、抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

接口特征总结:

1, Java接口中的成员变量默认都是public static final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)

2, Java接口中的方法默认都是public abstract类型的(都可省略),没有方法体,不能被实例化  

public interface A   
{      int CONST = 1; //合法,CONST默认为public,static,final类型   
        void method(); //合法,method()默认为public,abstract类型      
        public abstract void method2(); //method2()显示声明为public,abstract类型     
}
public interface A   
{     int var; //错,var是常量,必须显示初始化
      void method(){...};   //错,接口中只能包含抽象方法
     protected void method2(); //错,接口中的方法必须是public类型
     static void method3(){...};   //错,接口中不能包含静态方法   
}
3,接口中没有构造方法,不能被实例化

public interface A    {     public A(){...}; //错,接口中不能包含构造方法
     void method();    }
4, 一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
public interface A   {    void methodA();   }
   public interface B   {    void methodB();   }
   public interface C extends A, B   //C称为复合接口   {    void methodC();   }
   public interface C implements A{...}   //错
5, Java接口必须通过类来实现它的抽象方法

public class A implements B{...}

6, 当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的

7, 不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

public class B implements A{}     A a = new B(); //引用变量a被定义为A接口类型,引用了B实例
     A a = new A(); //错误,接口不允许实例化
8, 一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.

public class A extends B implements C, D{...} //B为class,C,D为interface

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先我说一下抽象类和接口之间的区别。让你能够更加清楚之间的关系。
1.一个类可以实现众多个接口,但是只能继承一个抽象类。可以说接口是取消程序语言中的继承机制的一个衍生物,但也不完全如此。
2.抽象类可以有非抽象方法,即可以有已经实现的方法,继承它的子类可以对方法进行覆写,而接口中定义的方法必须全部为抽象方法。
3.在抽象类中定义的方法,他们的修饰符可以使public ,private ,也可以是默认值,但是在接口中定义的方法全是public的。
4.抽象类可以有构造函数,接口不能。两者都不能实例化,但是对你通过它们来存放子类对象或是实现类的对象。可以说它们都可以实现多态。
回复 使用道具 举报
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意。

其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理.
abstract class和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是 这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领 域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形 这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题 领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行 为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可 以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读 者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下:



java 代码
abstract class Demo {     
   
abstract void method1();     
   
abstract void method2();     
   
…     
   
}     




使用interface的方式定义Demo抽象类的方式如下:



java 代码
interface Demo {     
   
void method1();     
   
void method2();     

   
…     
   
}     

总的来说:
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类要被子类继承,接口要被类实现。

3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现

4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。

7、抽象类里可以没有抽象方法

8、如果一个类里有抽象方法,那么这个类只能是抽象类

9、抽象方法要被实现,所以不能是静态的,也不能是私有的。

10、接口可继承接口,并可多继承接口,但类只能单根继承。

  特别是对于公用的实现代码,抽象类有它的优点。抽象类能够保证实现的层次关系,避免代码重复。然而,即使在使用抽 象类的场合,也不要忽视通过接口定义行为模型的原则。从实践的角度来看,如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能 够更有效地分离行为与实现,为代码的维护和修改带来方便。

希望对你有帮助。
回复 使用道具 举报
谢谢大家
回复 使用道具 举报
你们真他妈狠,我就不相信这些都是自己写出来的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马