20145315 《Java程序设计》第四周学习总结

20145315 《Java程序设计》第四周学习总结

教材学习内容总结

第六章 继承与多态

6.1何谓继承

6.1.1继承共同行为

把相同的程序代码提升为父类

    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 class SwordsMan extends Role
{
    public void fight()
    {
        System.out.println("挥剑攻击");
    }
}

子类:魔法师

public class Magician extends Role
{
    public void fight()
    {
        System.out.println("魔法攻击");
    }
    public void cure()
    {
        System.out.println("魔法治疗");
    }   
} 

继承后执行:

public class RPG
{
    public static void main (String[] args)
    {
        demoSwordsMan();
        demoMagician();
    }
    static void demoSwordsMan()
    {
        SwordsMan swordsMan = new SwordsMan();
        swordsMan.setName("Justin");
        swordsMan.setLevel(1);
        swordsMan.setBlood(200);
        System.out.printf("剑士:(%s.%d,%d)%n",swordsMan.getName(),
                swordsMan.getLevel(),swordsMan.getBlood());
    }
    static void demoMagician()
    {
        Magician magician = new Magician();
        magician.setName("Moinca");
        magician.setLevel(1);
        magician.setBlood(100);
        System.out.printf("魔法师:(%s,%d,%d)%n",magician.getName(),
                magician.getLevel(),magician.getBlood());        
    }
}

运行结果:

剑士:(Justin.1,200)

魔法师:(Moinca,1,100)

Process finished with exit code 0

6.1.2多态与is a

Role role1=new SwordsMan

检查右边类是不是左边的子类

public class RPG
{
    public static void main(String[] args)
    {
        SwordsMan swordsMan = new SwordsMan();
        swordsMan.setName("Justin");
        swordsMan.setLevel(1);
        swordsMan.setBlood(200);
        
        Magician magician = new Magician();
        magician.setName("Monica");
        magician.setLevel(1);
        magician.setBlood(100);
        
        showBlood(swordsMan);
        showBlood(magician);
        
    }
    static void showBlood(Role role)
    {
        System.out.printf("%s 血量 %d%n",role.getName(),role.getBlood());
    }
  }

多态:使用单一接口操作多种类型的对象。

6.1.3重新定义行为

在父类中定义 某种方法,但是内容为空,在子类继承父类后,重新定义该行为。

public class RPG
{
    public static void main(String[] args)
    {
        SwordsMan3 swordsMan = new SwordsMan3();
        swordsMan.setName("Justin");
        swordsMan.setLevel(1);
        swordsMan.setBlood(200);
        
        Magician magician = new Magician();
        magician.setName("Monica");
        magician.setLevel(1);
        magician.setBlood(100);
        
        drawFight(swordsMan);
        drawFight(magician);
        
    }
    static void drawFight(Role3 role)
    {
        System.out.print(role.getName());
        role.fight();
    }
}
public class Magician extends Role
{
    public void fight()
    {
        System.out.println("魔法攻击");
    }

}
public class SwordsMan3 extends Role
{
    public void fight()
    {
        System.out.println("挥剑攻击");
    }

}
public class Role3
{

        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()
    {
        
    }
}
6.1.4抽象

如果某方法区块中真的没有任何程序代码操作,可以使用abstract标示该方法为抽象方法。

Java中规定内含抽象方法的类,一定要在class前标示abstract.

如果尝试用抽象类创建实例,就会引发编译错误。

6.2继承语法细节

6.2.1protected

定义为rotected,可以只让子类存取。

被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类中直接存取。

public abstract class Role
{
    protected String name;
    protected int level;
    protected 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 class Magician extends Role
{

    public void fight()
    {
        System.out.println("魔法攻击");
    }
    
    public String toString()
    {
        return String.format("魔法师 (%s, %d, %d)", this.name, this.level, this.blood);
    }
    
}

剑士:

public class SwordsMan extends Role
{

    public void fight()
    {
        System.out.println("挥剑攻击");
    }
    public String toString()
    {
        return String.format("剑士 (%s, %d %d)", this.name, this.level, this.blood);
    }
    
}
6.2.2重新定义细节

在Java中,如果想取得父类中的方法定义,可以在调用方法前,加上super关键字。

@override

写在重新定义前面,可以检查是否有拼写错误。

注意:

  • 对于父类方法中的权限,只能扩大,不能缩小。
  • static属于类拥有,没有多态。
6.2.3再看构造函数

构造函数可以重载,父类中可以重载多个构造函数。如果想执行父类中的某构造函数,可以使用super()指定。

注意:this()与super()只能择一调用。

final关键字

如果class前声明了final,说明这个类是最后一个了,不会再有子类,也就是不能被继承。

同样的,也可以限定该方法为final.

java.lang.Object

Object[]数组可以收集各种对象

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];
}

public int size() {
return next;
}
}

第七章接口与多态

7.1何谓接口

7.1.1接口定义行为

定义接口:

public interface Swimmer
{
public abstract void swim();
}

鱼类:

public abstract class Fish implements Swimmer{
protected String name;
public Fish(String name){
this.name=name;
}
public String getName()
{
return name;
}
@Override
public abstract void swim();
}

小丑鱼:

 public class Anemonefish extends Fish{
 Anemonefish(String name){
 super(name);
 }


 @Override
 public void swim();{
 System.out.printf("小丑鱼 %s 游泳%n",name);
 }
 }
7.1.2行为的多态

操作接口表示“拥有行为”,即右边是不是有左边的行为。

public class Ocean{
public static void main(String[] args)
{
doSwim(new Anemonsfish("尼莫"));
doSwim(new Shark("兰尼"));
doSwim(new Human("贾斯汀"));
doSwim(new Submarine("黄色一号"));
}

static void doSwim(Swimmer swimmer){
swimmer.swim();
}
}
7.1.3解决需求变化

如果增加新的需求,原有的程序无需修改,只需要针对新的需求撰写程序,那就是有弹性、具有可维护的程序。
飞鱼:

public class FlyingFish extends Fish implements Flyer{
public FlyingFish(String name){
super(name);
}


@Override
public void swim(){
Systen.out.println("飞鱼游泳");
}



@Override
public void fly(){
Systen.out.println("飞鱼会飞");
}
}

飞机:

public class Airplane implements Flyer{
protected String name;
public Airplane(String name){
this.name=name;
}



@Override
public void fly();{
Systen.out.printf("飞机 %s 在飞%n",name);
}
}

7.2接口的语法

7.2.1接口的默认

接口的方法没有操作时,一定得是公开且抽象。

public interface Action{
public static final int STOP=0;
public static final int RIGHT=1;
public static final int LEFT=2;
public static final int UP=3;
public static final int DOWN=4;
}
7.2.2匿名内部类

只用一次时,不定义类,直接写项目。

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

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

本周代码托管截图

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 1/1 20/20
第二周 300/500 1/1 18/38
第三周 500/1000 1/1 22/60
第四周 600/1000 1/1 30/90

参考资料

posted @ 2016-03-27 20:45  君知らない  阅读(180)  评论(2编辑  收藏  举报