黑马程序员技术交流社区

标题: 抽象类abstract的作用 [打印本页]

作者: Y_Y    时间: 2013-10-26 10:07
标题: 抽象类abstract的作用
   抽象类里没有方法体,要它干嘛?比如
abstract  class Student
{
    abstract  void study ();
}

class  BaseStudent  extends Student
{
void  study()
{
system.out.println("best study");
}
}
就直接BestStudent类嘛  干嘛还要去写抽象Student类!
作者: 奋斗@zbt    时间: 2013-10-26 10:27
BestStudent类是继承Student类里的方法Study(),因为student可以有很多种方法,在这里定义的是study方法,抽象类是通过定义方法体而不实现,来制约、规范要实现它的子类们应该具有和包含的类结构,从而使得面向对象的思想得以贯彻。这样做是java多态的一种表现形式。
作者: 呆萌    时间: 2013-10-26 10:28
举个类似的例子:
父类:学生(学习方法)
子类:快班学生(快速学习方法)、慢班学生(慢速学习方法)
要先明确父类中学生的学习方法是子类对象向上抽取出来的,并且因为子类实现学习功能时进行了不同的复写,所以父类学习方法是抽象的!——这句解释为什么有学习方法并且是抽象的。
类中有抽象方法,那么这个类也是抽象的。——这句解释为什么类是抽象的。

PS:不要单独理解为什么要继承抽象类,复写抽象类的方法。要知道抽象类和方法是如何来的,就能理解为什么这样继承了。
作者: 1961993790    时间: 2013-10-26 10:51
这里需要说明一下:抽象类和一般类的异同点。
相同点:
抽象类和一般类都是用来描述事物的,都在内部定了成员。
不同:
1,一般类有足够的信息描述事物。
抽象类描述事物的信息有可能不足。
2,一般类中不能定义抽象方法,只能定非抽象方法。
抽象类中可定义抽象方法,同时也可以定义非抽象方法。
3,一般类可以被实例化。
抽象类不可以被实例化。

干嘛还要去写抽象Student类呢?楼主问的很好,
答案如下:
1,很简单,抽象类不象具体类那样描述一类具体事物,它是提取多种具有相似性的具体事物的共同特征而产生的。
2.子类继承了抽象类,可以实现代码的复用,把相同的信息抽取出来成为一个抽象类,这样,子类继承抽象类就拥有了这些属性,
如果多个子类,这就更体现了,抽象类的好处。
3.java继承体系中也是这个体现,它们一步一步的抽取,最后就抽取到最上层object类就作为基类。
希望对您学习有帮助。
作者: 麦子    时间: 2013-10-26 12:32
哥么要从本质上去理解抽象类的由来:当多个类中出现相同的功能,但功能的主题却不同,这是便可以向上抽取,只抽取功能的定义,而不抽取功能的主体,这样的变成方式更简练高效。
至于抽象类中可以不定义抽象方法:它有一个应用,因为抽象类不可以用new关键字创建对象,故可应用于不让该类创建对象

好好学习哦,不懂可以问我
作者: 月夜之鬼魅    时间: 2013-10-26 19:29
理解抽象类  
  abstract class在Java语言中是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?  
  在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是 这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领 域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。  
  比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形 这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题 领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。  
  在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行 为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可 以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读 者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。  

作者: 云水禅心    时间: 2013-10-26 20:41
抽象类是指不允许被实例化的类;抽象方法是没有方法体的方法。
1、抽象类可以不包括抽象方法,它反正不会去实例化,里面的方法是不是抽象的没有本质影响。
2、但是含有抽象方法的类绝不能被实例化,否则执行这个方法的时候,怎么办?
3、如果子类是非抽象的,那么它就必须实现父类中的抽象方法;否则,它继承来的抽象方法仍然没有方法体,也是个抽象方法,此时就与“含有抽象方法的类必须是抽象类”相矛盾了。
作者: wuchuang1992    时间: 2013-10-27 12:41

  1. abstract class A {
  2.     public abstract void doSomething();
  3. }

  4. class B extends A {
  5.     public void doSomething() {
  6.         System.out.println("do B");
  7.     }
  8. }

  9. class C extends A {
  10.     public void doSomething() {
  11.         System.out.println("do C");
  12.     }
  13. }

  14. public class Test {
  15.     public static void main(Stringp[] args) {
  16.         A a1 = new B();
  17.         A a2 = new C();
  18.         B b = new B();
  19.         C c = new C();
  20.         doSomething(a1); //这里
  21.         doSomething(a2); //这里
  22.          doSomething(b); //这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题?
  23.          doSomething(c); //这里
  24.     }

  25.     public static void doSometing(A a) {//这里,用抽象类
  26.         a.doSomething();
  27.     }
  28. }
复制代码

作者: To    时间: 2013-10-27 16:41
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2