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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Asan 中级黑马   /  2013-4-26 08:31  /  1678 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Asan 于 2013-4-27 01:24 编辑

在抽象类中创建的、没有实际意义的、必须要子类重写的方法称之为抽象方法!抽象方法只有方法的声明,而没有方法的实现,那又为什么又要用抽象方法呢?

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

8 个回复

倒序浏览
举个例子给你说明一下吧!
比方我们写一个方块类,用它来派生出6个子类。而方块类的当前方块属性的类型是方块类型。它可以指向任何子类。但是,当我调用当前方块的翻转方法时,它的子类都有吗?如果你把翻转方法写到方块类中,它的子类自然也就有了。可以这六种子类的翻转方法是不同的。我们知道'田'方块,它只有一种状态,无论你怎么翻转它。而长条的方块有两种状态。一种是‘-’,另一种是‘|’。这可怎么办呢?我们知道Java的多态性,你可以让子类来重写父类的方法。也就是说,在父类中定义这个方法,子类在重写这个方法。

那么在父类的这个翻转方法中,我写一些什么代码呢?让它有几种状态呢?因为我们不可能实例化一个方块类的实例,所以它的翻转方法中的代码并不重要。而子类必须去重写它。那么你可以在父类的翻转方法中不写任何代码,也就是空方法。

我们发现,方法类不可能有实例,它的翻转方法的内容可以是任何的代码。而子类必须重写父类的翻转方法。这时,你可以把方块类写成抽象类,而它的抽象方法就是翻转方法。当然,你也可以把方块类写为非抽象的,也可以在方块类的翻转方法中写上几千行的代码。但这样好吗?

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
楼主你好:
因为抽象方法是所有继承他的子类公共的方法,所有的子类因为具有相同的方法,要不断向上抽取,把这些子类相同的方法,放到了抽象类中。
然后子类可以定义特有的自己的方法。


下面是概念内容:

抽象类: abstract
  抽象:不具体,看不明白。抽象类表象体现。
  在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。
  抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。
  
抽象类的特点:
   1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
   2:抽象方法只定义方法声明,并不定义方法实现。
   3:抽象类不可以被创建对象(实例化)。
   4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
抽象是在不断抽取过程中,将共性内容中的方法声明抽取,然后用关键字abstract修饰?什么时候用抽象?就是在同一个类中有许多一样的东西存在。
回复 使用道具 举报
本帖最后由 白飞金 于 2013-4-26 19:32 编辑

抽象方法的作用是,你在此类里不必实现它,只是一个虚方法,所有的实现可以到继承此类的子类里面去做。
回复 使用道具 举报
好吧!我来给你举个我用到的抽象方法,不知楼主是否对GUI编程有熟悉。
GUI编程的时候通常有很多组件需要监听,而监听的时候需要一个个去写监听的动作,此时代码这样写非常的麻烦。
有一种思想,我每个组件都是实现同一个接口实现监听,在调用的时候我不知道究竟是谁产生动作,但是每个子类却实现了各自的监听动作。只要是实现了这个监听接口的所有子类,那么就可以调用该子类覆盖的方法,这样代码的冗余度就更高了。下面是一个简单的例子:
  1. package com.itcast.itheima;

  2. public class AbstractTest {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 AbstractTest abs = new AbstractTest();
  9.                
  10.                 abs.transfer(new ChildA());
  11.         }
  12.         //我怎么知道要使用哪个子类方法?可能我要ClassA,可能我要ClassB,如果没有抽象父类我岂不是需要写两个方法?
  13.         //只要AbsSuper的某个子类一进来我就调用谁,我管你是哪个子类。这种思想称之为---多态,这样最直接看出抽象父类的使用,也称为面向抽象父类编程
  14.         public void transfer(AbsSuper absSuper){
  15.                 absSuper.eat();
  16.         }
  17. }

  18. abstract class AbsSuper{
  19.        
  20.         abstract public void eat();
  21.        
  22. }

  23. class ChildA extends AbsSuper{
  24.        
  25.         @Override
  26.         public void eat() {
  27.                 // TODO Auto-generated method stub
  28.                 System.out.println("Child-A");
  29.         }
  30. }
  31. class ChildB extends AbsSuper{
  32.        
  33.         @Override
  34.         public void eat() {
  35.                 // TODO Auto-generated method stub
  36.                 System.out.println("Child-B");
  37.         }
  38. }
复制代码

评分

参与人数 2技术分 +2 收起 理由
黄玉昆 + 1
田磊阳 + 1

查看全部评分

回复 使用道具 举报
白飞金 发表于 2013-4-26 09:04
抽象方法的作用是,你在此类里不必实现它,只是一个虚方法,所有的实现可以到继承此类的子类里面去做。你也 ...

兄弟写错了不是重载,是覆盖(复写。)
回复 使用道具 举报
版主代理郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记成“已解决”。就OK了,还可以去群里领取美女一个。{:soso_e102:}
回复 使用道具 举报
明显为了方便使用嘛,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马