20145310 《Java程序设计》第4周学习总结
2016-03-27 23:28
381 查看
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 | 继承与多态,接口与多态 |
参考资料
Java学习笔记(第8版)《Java学习笔记(第8版)》学习指导
相关文章推荐
- JAVA设计模式之单利模式
- 20145216史婧瑶《Java 程序设计》第4周学习总结
- 20145216史婧瑶《Java 程序设计》第4周学习总结
- Java过滤器与SpringMVC拦截器之间的关系与区别
- java 表单验证
- spring 源码解析
- spring简介
- spring aop 原理
- JavaSript模块规范 - AMD规范与CMD规范介绍
- Junit单元测试的简单使用(主要是在spring框架下的项目)
- java是面向未来的!
- 是介绍一下初学JAVA的经验
- 没有一本书是先宏观介绍JAVA的
- 学习java的一些感言!
- Spring官网下载dist.zip的几种方法
- 20144303 《Java程序设计》第四周学习总结
- 20145322第四周JAVA程序设计基础学习总结
- java regex (一)
- 设计模式之组合模式
- Spring MVC 相关概念