黑马程序员技术交流社区

标题: 【已解决】对抽象类抽象方法存在意义的疑惑 [打印本页]

作者: 郑文博    时间: 2012-6-7 10:54
标题: 【已解决】对抽象类抽象方法存在意义的疑惑
本帖最后由 郑文博 于 2012-6-7 13:25 编辑

做练习时的感受
  1. /*
  2.         抽象类练习
  3. */
  4. abstract class Employee
  5. {
  6.         private String name;
  7.         private String id;//员工id,包含部门信息故不用int
  8.         private double pay;

  9.         Employee(String name,String id,double pay)
  10.                 {
  11.                         this.name =name;
  12.                         this.id =id;
  13.                         this.pay =pay;
  14.                 }

  15.         public abstract void work();
  16. }

  17. class Manager extends Employee
  18. {
  19.         private int bonus;
  20.         Manager(String name,String id,double pay,int bonus)
  21.         {
  22.                 super(name,id,pay);
  23.                 this.bonus =bonus;
  24.         }
  25.         public void work()
  26.         {
  27.                 System.out.println("manager work");
  28.         }
  29. }
复制代码
第17行public abstract void work();作为抽象方法写入。而当Manager类继承这个抽象类时对 work() 方法必须要重新复写,那么就只在子类中写这个方法不就好了,为什么父类还要定义一个必须被复写的抽象方法呢?不明白它存在的意义啊。  
还有一个小问题是定义变量为字符串类型时 String 为什么要大写第一个字母,double,int型怎么就不用大写首字母呢?

------------------------------编辑后分隔---------------------------------

多谢大家了!
作者: 刘克方    时间: 2012-6-7 11:00
本帖最后由 刘克方 于 2012-6-7 11:06 编辑

抽象类定义的抽象方法,非抽象子类必须实现;抽象类是一些类共性的抽取,既然你继承该抽象类必须有这些共性,这是强制性的;也是抽象类的作用
至于String 首字母为什么大写,因为它是对象类型的数据,其他事基本类型,其他也有对应的对象数据类型如int 对象是Integer;大小写这是java的书写规范

作者: 姚玉鹏    时间: 2012-6-7 11:05
定义一个抽象方法 就是限定继承的子类一定要实现则个方法 如你的  public abstract void work();

double int 是基本类型 而String 属于类  跟Character Integer 一样
作者: 马林贺    时间: 2012-6-7 11:15
  我的理解   
  如果父类是抽象类,那么你继承了,就必须要覆写里面的抽象方法,

假如你定义了动物的抽象类, 动物都会 吃东西吧, 但是不同的动物吃的东西也会不一样,

所以你在定义 吃  这个方法的时候,你不能再 父类里面具体实现吧,只能是通过子类的覆写,类实现自己的 吃 的方法

为什么要定义在父类里面,因为是通过子类向上抽取的共同特点。
作者: 付信榕    时间: 2012-6-7 11:16
在父类定义抽象方法是强迫其子类去具有并实现这个方法。在这里如果没有父类中public abstract void work();  那么经理子类就可工作可不工作了,反正都是公司的员工了,不工作依然有工资。所以为了避免拿工资不干活的现象,父类就定义了public abstract void work();  想要成为经理员工必须干活,不然不要进入本公司。这就是它存在的意义。
double,int,boolean float byte char short long 八大基本类型和void都是小写,其他类按照类名书写不默认规定:每个单词开头大写来写。所以String就是这个样了。八大基本类型对应的包装类都是大写字母开头Double Integer Boolean Float Byte Character Short Long.
作者: 黄克帅    时间: 2012-6-7 12:38
本帖最后由 黄克帅 于 2012-6-7 12:47 编辑

其实 这也算是一个编程模式,即面向抽象编程,面向接口编程。
你操作的只是那个抽象类或接口(一般接口用的多),至于其子类是怎么实现的你不用不管。有助于程序的扩展性。

比如楼上说了动物吃东西,定义一个抽象的动物类,不同的动物,有不同的吃法。只要他们继承这个类,你就只需要操作这个抽象类就可以,具体怎么吃,你不用去管。如果还有一个动物加进来,你也只需要实现这个类,实现可以是别人写的,你完全可以不管,但是你操作的对象还是不变,还是那个抽象类。就有助于程序的扩展。

还没有  不知道你发现没有,我们要用到jdk提供的很多功能的时候,就需要去继承类或实现接口,他就是在里面定义了方法让你去重写,你具体怎么写的它不管,但是掉用的方式都一样,这样对程序的扩展有很大的帮助。还有很多标准也是类似这样定义的,一个接口,让使用的人去实现,具体怎么实现它不管。但是你要用,就得实现我这个接口。




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