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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. abstract class Student{
  2.         abstract public void stu();
  3. }
  4. class  Yu extends Student{
  5.         public void stu(){   //继承了抽象类  复写   
  6.                 System.out.println("dsf");
  7.         }
  8. }
复制代码
public void stu(){   //继承了抽象类  复写    如果不继承 没有上面的抽象类   不是一样写吗? 代码也减少了   这里有点想不通,建立抽象类,抽象方法有什么好处??? 好处仅仅是不让该类建立对象  吗 ??????
    赐教    谢谢

17 个回复

倒序浏览
public void stu(){   //继承了抽象类  复写    如果不继承 没有上面的抽象类   不是一样写吗? 代码也减少了   这里有点想不通,建立抽象类,抽象方法有什么好处??? 好处仅仅是不能建立该类对象  吗 ??????
    赐教    谢谢
回复 使用道具 举报
对象的多态性就是靠这玩意,,,,  你说这玩意干嘛的   你说有用不?
回复 使用道具 举报
抽象类内中还有很多其他成员啊,不仅仅是像你上面小代码的包含一个抽象方法,还可以有一些成员属性的,在子类继承后可以一起使用啊,老师上课时有举到一个员工的抽象类例子,可以去看看啊,Employee抽象类里面的name,id,pay,子类继承复写抽象方法后都可以用啊。这里就不上代码了
回复 使用道具 举报
谢 谢{:soso_e100:}
回复 使用道具 举报
本帖最后由 冯越 于 2012-5-16 12:08 编辑

首先,我们来看一下抽象类的概念,java编程思想中说“万物皆对象”,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类是表征我们对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。好比,我们都知道三角形是一个形状,世界上有三角形这样具体的东西,但是确没有形状这样具体的东西,我们要描述这个形状的概念就要用到抽象类。因此在java中抽象类是不允许被实例化的。
抽象类即是不能被实例化的类,而且你不能够在自己的程序里通过这种类来生成一个对象。 你也许会认为不能被实例化的类是没多大用处的。事实上,在某些环境下,   抽象类是非常有用的。你可以把它作为一个基础类以此为基类创建新的类。   在对功能要求不高的环境下生成的类,会向你提供一个规定的启始点,通过这个点你可以推导出非抽象类。在此假设一个要用抽象类的程序设计。假设图形程序提供了大量的drawing类:比如圆,三角,曲线等等。所有这些作drawing类都有某个共同的特性,比如位置,大小,色彩,删除等属性。其它的类成员,比如描绘图形的方法就不同于每个单独的类。因此,这样为利用抽象类创造了一个理想的环境 。我们就可以创建一个叫 形状 的抽象类。在里面定义一些那些类属于形状的公有特性。以后我们如果要创建圆,三角啊什么的时候,我们就可以直接继承这个抽象类了。然后再根据我们具体的类型去具体实现方法。那些公有的东西我们就不需要在写了。这在很大程度上避免了代码的冗余。
回复 使用道具 举报
荣天 中级黑马 2012-5-16 12:03:56
7#
冯越 发表于 2012-5-16 11:53
首先,我们来看一下抽象类的概念,java编程思想中说“万物皆对象”,我们知道所有的对象都是通过类来描绘的 ...

谢  :)谢
回复 使用道具 举报
荣天 中级黑马 2012-5-16 12:04:26
8#
冯越 发表于 2012-5-16 11:53
首先,我们来看一下抽象类的概念,java编程思想中说“万物皆对象”,我们知道所有的对象都是通过类来描绘的 ...

谢 :)谢:)
回复 使用道具 举报
田林 中级黑马 2012-5-16 12:09:32
9#
抽象类只是定义一种规则,因为不同的情况子类对象应该有不同的实现方法。抽象类就是告诉子类必须实现哪些方法。这样有利于整体构架的建立,比如一个项目的所有抽象方法都写好了,整体的构架就出来了,剩下的就是实现了。
回复 使用道具 举报
我的理解是
父类抽象功能的定义 方便子类进行复写 不仅可以让子类非常方便的使用与父类共有的方法
尤其在共有的方法太多、某些方法被静态修饰时 表现得更明显 同时也方便子类覆盖 实现它特有方法
总之它不仅仅简化代码  也提高了复用性!
嘿嘿 {:soso_e130:}
回复 使用道具 举报
首先你在一个抽象类中定义一些抽取的共性抽象方法,当你要描述的对象不同时,你只需要复写这些抽象方法即可,从而,你就可以用该抽象类描述更多的事物。
回复 使用道具 举报
你可以想一下,当你做出一个类来的时候后期如果有别的子类继承的话,如果你的这个类中有一个方法对于每个实现它的子类大部分
都需要有新的实现方式,那么一般情况下子类们都需要重写这个方法,那么这个时候是不是需要提醒一下你的子类呢?我们索性就让
每个子类都去重写这个方法吧,免的出错。这个时候我们就把这个方法及这个类定义成抽象的,让子类们强制去重写它,如果不重写
就不让它编译通过,这样是不是避免了很多可能出现的问题啊。
回复 使用道具 举报
实现多态啊..

最简单的一个作用,实现模板.

所有继承抽象类的子类,必须强制实现抽象类的抽象方法.如果没有抽象方法,则子类可有,可没有该方法.定义一个抽象方法后,所有子类就必须实现了.

另外,抽象类通常用于指向子类的实例:
比如:
抽象类 实例 = new 子类();
实例.抽象方法();

如果你不定义抽象方法,如何使用子类的方法呢??
回复 使用道具 举报
呵呵呵,哥们,抽象和接口是将共有的属性抽取出来,这样就不需要一一去new  然后调用相应对象了,去看看毕老师的视频吧,真的能学到很多
这里给你上个代码让你明白为什么要那玩意
  1. public class AbstractTest {
  2.         public static void main(String[] args){
  3.                 //封装在一起了  就只要通过Study 这个逻辑类来调用后抽象类Student中的stu方法就可以了  大大降低了代码耦合度
  4.                 Study study = new Study();
  5.                 study.study(new Zhangsan());
  6.                 study.study(new LiSi());
  7.                 study.study(new WangWu());
  8.                
  9.                 //如果没有抽取相同的属性  那么需要:
  10.                 Zhangsan zhangsan = new Zhangsan();
  11.                 zhangsan.stu();
  12.                
  13.                 LiSi lisi = new LiSi();
  14.                 lisi.stu();
  15.                 //.....这样是不是添加了代码复杂性   同时降低了代码的耦合性
  16.         }
  17. }
  18. class Study{
  19.         public void study(Student stu){
  20.                 stu.stu();//在业务逻辑这一块在调用的时候就不需要明白到底是哪个学生了  只要传一个Student 就可以直接执行stu方法
  21.                           //这样是不是使得你的代码更加封装化,各个模块不需要知道别的模块到底是什么了呢?只需要拿抽象的对象的方法执行就OK
  22.         }
  23. }
  24. abstract class Student{
  25.     abstract public void stu();
  26. }
  27. class  Zhangsan extends Student{
  28.     public void stu(){   //继承了抽象类  复写   
  29.             System.out.println("学JAVA");
  30.     }
  31. }
  32. class  LiSi extends Student{
  33.     public void stu(){   //继承了抽象类  复写   
  34.             System.out.println("学Android");
  35.     }
  36. }
  37. class  WangWu extends Student{
  38.     public void stu(){   //继承了抽象类  复写   
  39.             System.out.println("学Android");
  40.     }
  41. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
It's_Zero 发表于 2012-5-16 21:36
呵呵呵,哥们,抽象和接口是将共有的属性抽取出来,这样就不需要一一去new  然后调用相应对象了,去看看毕老师 ...

谢谢:):)
回复 使用道具 举报
抽象类中包含了很多成员,在写简单代码的时候体现不出类的简单性,当遇到很多代码重复使用时,就可以不必写同意类别的代码,可以调用该类中的功能,这样提高了效率。
回复 使用道具 举报
        抽象类
(1)        类中只要有抽象方法,类就必须定义为抽象类。
特点:
(1)        抽象类与抽象方法必须用abstract关键字修饰
(2)        抽象方法一定在抽象类中
(3)        一个类继承了抽象类:
要么该类事项了抽象类中的所有抽象方法
要么该类实现了部分抽象方法湖综合根本不实现任何的抽象方法,这个时候需要把自身定义为抽象类。
(4)        抽象类不能被实例化,也就是说不可以通过new关键字创建对象。
(5)        为什么抽象类不能被实例化呢,因为抽象类中有抽象方法,你创建对象后,别人调用抽象方法时没有任何意义的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马