第6周代码分析

1.阅读ManagerTest目录中的代码

1.1绘制UML类图,要体现类之间的关系。

1.2文件第26行e.getSalary(),到底是调用Manager类的还是Employee类的getSalary方法?

staff被创建为Employee类,所以e.getSalary()调用的自然是父类Employee类的getSalary(),但是,如果当e引用Manager对象的时候,e.getSalary()调用的是Manger类中的getSalary方法。

1.3Manager类的构造函数使用super调用父类的构造函数实现了代码复用,这样有什么好处?为什么不把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,这样看起来不是更直观吗?

代码复用可以使代码更清晰简洁;若把父类构造函数中的相关代码复制粘贴到Manager的构造函数中虽会达到相同的效果,但当需要对父类的构造函数进行修改时,就需要对每一处使用父类的代码的地方进行修改。

1.4该代码中哪里体现了多态的好处?请说明。

Employee:

public double getSalary()
   {
      return salary;
   }

Manager:

public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }
Manager也是雇员,但是manager作为更高层应该得到额外的红利,所以这里体现了多态的好处,既有共同点也有不同点。

2.阅读GuessGame抽象类的设计与使用源代码

2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法,看起来更复杂,这样的改造到底有什么好处呢?

抽象类不具有实例化特点,改造前,代码与控制台绑定,只能在控制台输入输出;改造后,就可以在控制台、对话框以及图形界面等输入输出。

2.2 GuessGame(改造后).java中有抽象方法与非抽象方法,你觉得抽象类中什么样的方法应该声明为abstract,什么方法不需要声明为abstract直接实现即可。

对于某一具有一定关系的类所拥有的共同行为,可以声明为abstract,然后就可以在子类中进行不同的实现方法了;而对于某些类所特有的具体方法,可以不要声明。

2.3 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract等概念进行说明。

不变:猜数字游戏的本质,都是输入一个数字然后判断随机产生的数和这个数是不是相等;
变化:改造后的Guess中增加了抽象类和public abstract void print,public abstract void println和public abstract int nextInt三个抽象方法。
Abstract关键字:
1)修饰类:不可被实例化,抽象类只能申明引用,不能创建对象;
2)修饰方法:抽象方法只有声明,没有实现。具体的实现交给继承抽象类的子类;
3)子类若不想是抽象类,则需要继承父类所有的抽象类。

posted on 2018-10-16 17:27  pianzhi  阅读(175)  评论(0编辑  收藏  举报