继承与多态

20145217 《Java程序设计》第4周学习总结(1)

教材学习内容总结

第六章主要论述了继承与多态。文件调用在Java中使用数量比在c中多得多,在书本上也提过,即使是在同一文件中定义了包装类以及函数,实际计算机操作时也产生了两个文件。本章实际上就是在说明包装类调用关系。

6.1继承与多态

  • 面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承。

  • 不过也要注意滥用继承而导致程序维护上的问题。

例子:
父类:
public class Role {
private String name;
private int level;
private int blood;
public int getBlood(){
return blood;
}
public void setBlood(int blood){
this.blood=blood;
}
public int getLevel(){
return level;
}
public void setLevel(int level){
this.level=level;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public void fight(){
}
}

子类:
public class Magicain extends Role{
public void fight(){
System.out.println("魔法攻击");
}
public String cure(){
return("魔法治疗");
}
}

  • 子类可以对父类进行扩充,这时会用到关键字“extends”,也就是继承行为。
  • 子类只能定义集成一个父类。
  • 多态实际上就是对子类父类关系的描述,子类是父类的一个状态,即子类是父类的一种多态。因此定义参数时,父类可定义为子类。反过来不可以。

RPG程序:
public class RPG {
static void demoSwords(){
Swords swords =new Swords();
swords.setName("Justin");
swords.setLevel(1);
swords.setBlood(100);
System.out.printf("剑士:(%s,%d,%d,)%n",swords.getName(),swords.getLevel(),swords.getBlood());
}
static void demoMagicain(){
Magicain magicain =new Magicain();
magicain.setName("Monica");
magicain.setLevel(1);
magicain.setBlood(100);
System.out.printf("魔法师:(%s,%d,%d,%s)%n",magicain.getName(),magicain.getLevel(),magicain.getBlood(),magicain.cure());
}
public static void main(String[] args){
demoSwords();
demoMagicain();
Swords swordsman=new Swords();
swordsman.setName("Bob");
swordsman.setLevel(2);
swordsman.setBlood(120);

    Magicain mag=new Magicain();
    mag.setName("Tom");
    mag.setLevel(3);
    mag.setBlood(110);
    
    showBlood(swordsman);
    drawFight(swordsman);
    showLevel(mag);
    
}
static void showBlood(Role role){
    System.out.printf("%s血量 %d%n",role.getName(),role.getBlood());
}
static void showLevel(Role role){
    System.out.printf("%s级别 %d%n",role.getName(),role.getLevel());
}
static void drawFight(Role role){
    System.out.print(role.getName());
    role.fight();
}    

}

  • 子类可以对父类进行重新定义。

以上程序运行结果为:

6.2语法细节

  • 1.protected、private、public和无的区别。

  • 2.super:子类中如果想取得父类中的方法定义,可以在调用方法前加上super关键字。例如父类中定义有toSting(),子类文件中可以这样写:public String toString(){return“剑士”+super.toString();}。要求除了可以定义权限较大的关键字外,其他部分必须预父类中方法签署完全一致。super还可以用来在子类中指定父类重构函数。

  • 3.final:子类不能继承父类的final类。

  • 4.java.lang.Object是最上层父类。

定义不限长度的数组:
package arraylist;
import java.util.Arrays;
public class Arraylist {
private Object[] list;
private int next;
public Arraylist(int capacity){
list=new Object[capacity];
}
public Arraylist(){
this(16);
}
public void add(Object o){
if(next==list.length){
list=Arrays.copyOf(list,list.length*2);
}
list[next++]=o;
}
public Object get(int index){
return list[index];
}
/**
* @param args the command line arguments
*/
public int size(){
return next;
}
}
Guest.java程序的运行结果:

  • 5.抽象类:这个类不完整,函数结构还没有决定,关键字为abstract。
    书本程序运行结果:

上传代码到git

教材学习中的问题和解决过程

教材这部分是对程序设计逻辑化详解,需要多加练习,很多东西都是在敲完代码,运行程序成功后懂得的。

代码调试中的问题和解决过程

教材中的很多代码都是一半,真正实现需要自己补充好,在这方面也花掉了我大部分时间,但是总而言之很有收获。教材详细论述了父类和子类的关系,并让我了解到最初的父类是java.lang.Object,这使我对java有了一种全新的认识。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第三周 300/600 2/6 20/50
第四周 100/900 1/8 8/50

参考资料

posted @ 2016-03-27 19:35  joke-bright  阅读(138)  评论(0编辑  收藏  举报