20145310 《Java程序设计》第4周学习总结

20145310 《Java程序设计》第4周学习总结

教材学习内容总结

本周主要进行第五章和第六章的学习。

第六章 继承与多态

子类(Inherit)继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就是用继承,滥用继承而导致程序维护上的问题时有所闻。

书中从一款RPG游戏入手。

继承作为面向对象的第二大特征,基本上就是避免多个类间重复定义共同行为。继承也符合DRY(Don't Repeat Yourself)原则。通过extends 关键字让类与类之间产生继承关系。

将书中的代码提升(Pull Up)为父类

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 class Magician3 extends Role3
{
    public void fight3()
    {
        System.out.println("魔法攻击");
    }
    public void cure()
    {
        System.out.println("魔法治疗");
    }
}

magician继承Role的行为,再扩充了Role原本没有的fight()与cure()行为。

从以下的程序可以看出确实有继承。

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

程序运行结果图片:

在Java中,子类只能继承一个父类;
is-a:因为子类继承了父类,所以子类是一种父类。

多态:要开始理解多态,必须要知道操作的对象是“哪一种”东西。

多态就是使用单一接口操作多种类型的对象。即可以通过Role类型操作SwordMan对象,也可以通过Role类型操作Magician对象。

Java中有抽象方法的类一定是抽象类,但抽象类中的方法不一定都是抽象方法

继承语法细节:在Java中有public、protected、private三个权限关键字,但实际上有四个权限范围:public/package/protected/private

图片:

依权限小至大来区分。如果一开始不知道使用那个权限,就先使用private,以后视需求再放开权限。

final可以指定变量值不再改变,在class前加上final,意思是这个类是最后一个类,不会再有子类,即不能被继承。限定方法为final表示最后一次定义该方法,子类不能重新定义。在Java中子类只能继承一个父类,没有使用extends关键字指定继承的类时,一定是继承java.lang.Object。

第七章 接口与多态

使用 interface 定义接口:

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

使用 implements 操作接口。

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();
}

类要操作接口,必须使用implements关键字。操作某接口时,对于接口的定义有两种操作方式:一是操作接口中定义的方法,二是再次将该方法标识为abstract。

public class Human implements Swimmer 
	{
    private String name;
    public Human(String name)
		{
        this.name=name;
		}
    public String getName()
    {
        return name;
    }
    @Override
    public void swim()
    {
        System.out.printf("人类 %s 游泳 %n",name);
    }
}
public class Submarine implements Swimmer
{
    private String name;
    public Submarine(String name){
        this.name=name;
    }
    public String getName()
    {
        return name;
    }


    @Override
    public void swim(){
        System.out.printf("潜水艇 %s 潜行%n",name);
    }
}
public class Ocean
{
    public static void main(String[] args)
    {
        doSwim(new Anemonefish("尼莫"));
        doSwim(new Shark("兰尼"));
        doSwim(new Human("贾斯汀"));
        doSwim(new Submarine("黄色一号"));
        
    }

    static void doSwim(Swimmer swimmer)
    {
        swimmer.swim();
    }
}

程序运行结果如下:

接口语法细节:接口中的public abstract可以省略
接中可以使用extends继承接口,并且可以继承多个接口

在接口中枚举常数,一定要使用 = 指定值,否则编译错误。

在interface中,可以定义常数。

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;
}
import static java.lang.System.out;
public class Game
{
    public static void main(String[] args)
	{
        play(Action.RIGHT);
        play(Action.UP);
    }
    public static void play(int action) //声明为action类型
	{
        switch(action)
		{
            case Action.STOP:
                out.println("播放停止动画"); //也就是Action.STOP
                break;
            case Action.RIGHT:
                out.println("播放向右动画"); //也就是Action.RIGHT
                break;
            case Action.LEFT:
                out.println("播放向左动画"); //也就是Action.LEFT
                break;
            case Action.UP:
                out.println("播放向上动画"); //也就是Action.UP
                break;
            case Action.DOWN:
                out.println("播放向下动画"); //也就是Action.DOWN
                break;
        }
    }
}

这个代码中,play()方法中的action参数声明为Action类型,所以只接受Action的实例。

接口可以继承别的接口,也可以同时继承两个以上的接口。

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

这周学习的两章不但代码比较多,而且难度也比较大,不能很好地消化。

首先出现了大量的生词,很难记忆,所以学习java也要有一定的英语基础啊。

在调试的过程中又出现了GBK的问题,这个问题搞得很头疼,说明还是编码的问题。并且使用EditPlus编写代码编译运行的时候也较为不便,决定从下周开始使用IDEA。

有很多东西看书上说的并不是很清楚,还要多看看视频才能搞清楚。

其他(感悟、思考等,可选)

每周两章学习内容很多,其实并不能很好地理解,但敲代码总是有好处的。学习java要投入大量的时间,才能学好。同时还有一些新概念,新知识,以前没有接触过的类型,也要用新的思路去理解。

代码托管截图:

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 100/100 2/2 10/10 初步认识java
第二周 150/250 1/3 12/22 掌握Java基础语法
第三周 537/787 2/4 20/42 认识对象,对象封装
第三周 500/1287 1/5 20/62 继承与多态,接口与多态

参考资料

posted @ 2016-03-27 23:28  20145310刘宇飞  阅读(151)  评论(2编辑  收藏  举报