黑马程序员技术交流社区

标题: 为什么在父类中定义抽象类? [打印本页]

作者: yekong262    时间: 2014-2-24 15:21
标题: 为什么在父类中定义抽象类?
本帖最后由 yekong262 于 2014-2-25 14:10 编辑

不在父类中定义抽象类功能,直接在子类中创建子类特有功能,这样不是一样么。?
作者: ghhryr    时间: 2014-2-24 15:26
我觉得有三点:
1.在子类中来实现功能,比在父类中实现更具有扩展性 一个父类可以被多个子类继承,我们就可以定义不同的实现功能的方式,更具有灵活性
2.这个可以参照模板设计模式的思想
3.体现了java的编程思想,我自己不做,交给别人去做      
作者: 菠萝鱼    时间: 2014-2-24 15:41
这个就是java的编程思想,java是面对对象编程的。这个和java多态的特性相结合,可以减少代码的耦合性。
作者: 丶小天    时间: 2014-2-24 16:30
抽象类与接口紧密相关。然接口又比抽象类更抽象,这主要体现在它们的差别上:
1)类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
2)抽象类当中可以存在非抽象的方法,可接口不能且它里面的方法只是一个声名必须用public来修饰没有具体实现的方法。
3)抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static fainl)。4)这一点也是最重要的一点本质的一点"抽象类是对象的抽象,然接口是一种行为规范"。
作者: yekong262    时间: 2014-2-24 20:23
ghhryr 发表于 2014-2-24 15:26
我觉得有三点:
1.在子类中来实现功能,比在父类中实现更具有扩展性 一个父类可以被多个子类继承,我们就可 ...

我想问的是。  在子类中定义了一个show()方法,为什么还在父类中定义了一个抽象的show()方法,  这样既然是子类对象特有的功能 为什么还在父类中定义

作者: 张继鲁    时间: 2014-2-25 10:31
比如说一个公司有很多部门,那么部门所干的工作都是不一样的,让不同的员工干部同的工作:

  1. abstract class Employee
  2. {
  3.     public String name;
  4.     public String id;
  5.     public double pay;

  6.     Employee(String name,String id,double pay){
  7.         this.name = name;
  8.         this.id = id;
  9.         this.pay = pay;
  10.     }

  11.     public abstract void work();//因为普通员工与经理干的工作不一样,所以这里定义一个抽象类,让不同的员工干不同的工作。

  12. }

  13. class Pro extends Employee
  14. {
  15.     Pro(String name,String id,double pay){
  16.         super(name,id,pay);
  17.     }

  18.     public void work(){
  19.         System.out.println("Pro Work:"+super.name+";id="+super.id+";工资:"+super.pay);
  20.     }
  21. }

  22. class Manager extends Employee
  23. {
  24.     private double bonus;

  25.     Manager(String name,String id,double pay,double bonus){
  26.         super(name,id,pay);
  27.         this.bonus = bonus;
  28.     }

  29.     public void work(){
  30.         System.out.println("Manager Work");
  31.     }
  32. }
  33. class AbstractTest
  34. {
  35.     public static void main(String[] args)
  36.     {
  37.         Pro p = new Pro("zhangsan","123",234.90);
  38.         p.work();
  39.     }
  40. }
复制代码

作者: 薛旻    时间: 2014-2-25 12:18
本帖最后由 薛旻 于 2014-2-25 12:31 编辑

只从功能上来讲是一样的,没有什么区别。从面向对象的角度分析,这么做确实有他的实在意义:
        1. 所谓一切皆对象,在通过对象描述世界的时候,为了更好的描述一类事物,你就得抽象出这类事物的共性的东西,也就是说,有了这些共性,你的类才有了自身的特点。继承该的类的子类,只有实现了这些方法,这种继承关系才有意义,描述也就会更贴近现实。       2. 从编码角度,这样做就更为严谨,只要子类继承了父类,那么子类就必须去实现父类抽象出的该类应该有的功能,只有实现了,该子类才具有继承的意义,换句话说就是这样可以将复杂的关系明确梳理,而且可以提高代码复用。






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