黑马程序员技术交流社区

标题: Java基础——关于抽象类的应用和多态调用(?)的疑惑 [打印本页]

作者: 夏夜猫    时间: 2013-8-25 00:29
标题: Java基础——关于抽象类的应用和多态调用(?)的疑惑
本帖最后由 夏夜猫 于 2013-8-26 12:31 编辑

今天学习了面向对象里面关于继承和抽象类的内容,在记熟具体的定义和格式的前提下(多少有点死记硬背的),做题时创建类、继承类、创建方法的思路都比较清晰。。
但是在含main方法调用的类里面,关于具体的调用步骤和思想,还是剪不清理还乱,希望能有人帮我具体解释、梳理下关于通过创建、调用子类的对象完成方法执行的过程。

如下题,是老师课后留在抽象内容后面的作业,做是做出来了,但是关于红色字部分的调用,完全是照葫芦画瓢根据老师上课时的举例模仿的,并没真的理解其规则,绿色字体部分的注释也是自己写的,对不对完全不知道。。这个是不是叫做多态调用?还是叫做通过子类实现父类?具体什么时候创建,怎么执行呢? 现阶段每次做题都是这种很乱的感觉。。

求解答。。{:soso_e183:}

/*使用抽象类知识设计军队模型,包含下列类
军人(ArmyMan):抽象类
指挥官(Commander):抽象类,扩展自军人
将军(General):扩展自指挥官
师长(DivisionCommander):扩展自指挥官
连长(CompanyCommander):扩展自指挥官
排长(PlatoonLeader):扩展自军人
士兵(Soldier):扩展自军人*/

//定义一个类,含有main方法
class Army{
     public static void main(String[] args){
//抽象类无法创建实例对象,通过子类继承重写创建,并调用子类的方法实现。
     General g = new General();
     g.fnFight();
     g.fnCommand();
     }
}

//定义一个军人(ArmyMan)抽象类,含战斗(fight)方法
abstract class ArmyMan{
     abstract void fnFight();
}

//定义一个指挥官(Commander)抽象类,含指挥(command)方法,继承军人(ArmyMan)类
abstract class Commander extends ArmyMan{
     abstract void fnCommand();
}

//定义一个将军(General)类,含将军战斗方法和将军指挥,继承指挥官(Commander)类
class General extends Commander{
     void fnCommand(){
          System.out.println("将军在后方指挥所指挥");
     }
     void fnFight(){
          System.out.println("将军指挥师长战斗");
     }
}

//定义一个师长(DivisionCommander)类,含师长战斗方法和师长指挥,继承指挥官(Commander)类
class DivisionCommander extends Commander{
      void fnCommand(){
            System.out.println("师长在前线指挥所指挥");
      }
      void fnFight(){
            System.out.println("师长指挥连长战斗");
      }
}

……


另外,关于抽象类,他的作用体现在哪里,或者说,到底在什么情况下需要创建一个抽象类呢?因为这道题目老师说后面学了接口可以直接用接口做,比用抽象更好,那么抽象类的存在有什么具体意义(用处)呢?

求大神解惑,java基础班新人一只。。

作者: 尚前琛    时间: 2013-8-25 01:05
你可以把这些个汉字替换成简单的试试,,,,
作者: gulup    时间: 2013-8-25 01:40
大晚上的,一般都是赚技术分的好时机啊。今天刚好复习了抽象类和接口,就来说上两句。看能不能拿到分?
先来回答你后面的问题,抽象类到底有啥用?
抽象,这个词就有够抽象的,抽象类最简单的理解就是拥有抽象方法的一个类。当然你不能就这么去理解。
抽象类不单单只有抽象方法,抽象类还可以包含其他方法,并且可以包含这些方法的实现细节,所以抽象类就可以将一些具有共性的代码抽取出来,一些不同实现的代码做成抽象方法,让子类去实现,提高代码的复用性。
除此之外,抽象类的另一个用处,就是不能被直接实例化。
比如,有一个动物类,每种动物的叫声都是不一样的,你可以让动物类的子类去各自实现它的叫声。而且,动物是一种很抽象的概念,甚至人也是一种动物,你如果直接new一个动物类的实例的话,那是相当相当的不合适的。所以如果把动物类做成抽象类,让其子类必须实现叫的方法,而且可以避免动物类被直接实例化。
再来看你的代码,其实你的代码就能很好的解释抽象类的作用。一个军人,最基本的作用就是战斗,至于怎么战斗?每个军人的战斗方法都不一样。需要你具体实现。一个指挥官肯定会指挥,并且他肯定会战斗。至于指挥工作怎么进行?前线和后方肯定不一样,具体怎么实现?需要你去实现。而如果你要做一个要做一个将军,就必须要会战斗并且会指挥,所以你直接继承指挥官类就可以了。
可能我解释的不是很好,不知道你能不能理解。。。。
最后说一下你提到的多态。多态主要表现在:
方法的覆盖和重载和对象的多态性这两方面。
对象的多态性即对象的转型。给你贴一下代码和注释:
  1. public class Test{
  2.      public static void main(String[] args){
  3.              //抽象类无法创建实例对象,通过子类继承重写创建,并调用子类的方法实现。
  4.              General g = new General();     
  5.              /*创建一个军人实例,并把将军引用指向军人实例。
  6.               * 这个叫做对象的向上转型。
  7.               * 打个很贴切的比喻,在战场上,因为敌人的总攻击,现在谁也分不清楚谁了。
  8.               * 在别人的眼里,将军也只是一个军人。
  9.               * 因为我看到你只是一个军人,并不是一个将军,所以我只能调用每个军人都与的战斗方法。
  10.               * 但是,将军毕竟是将军,虽然我看起来他只是一个军人
  11.               * 但是他战斗的具体方法还是将军的战斗方法。
  12.               * 所以这里的am.fnFight();输出的是“将军指挥师长战斗”
  13.               * */
  14.              ArmyMan am = g;
  15.              am.fnFight();   
  16.      }
  17. }
复制代码
好了,就这样了。今天的任务还没完成,我得继续复习去了。准备申请入学考试了。
作者: 夏夜猫    时间: 2013-8-26 12:31
gulup 发表于 2013-8-25 01:40
大晚上的,一般都是赚技术分的好时机啊。今天刚好复习了抽象类和接口,就来说上两句。看能不能拿到分?
先 ...

抽象类的解释很赞。后面调用方法这道题目里面被你这么解释能看懂了,以后做其他题希望思路还能清晰,谢谢!




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