20155320 2016-2017-2 《Java程序设计》第的四周学习总结
教材学习内容总结
继承与多态
- 继承就是子承父类,避免重复定义共同行为,会使用
extends
关键词,表示会扩展其原来没有的行为。
相关继承的代码
运行结果为:
- 子类只能继承一个父类,子类与父类间会有is-a(是一种)关系。但是需注意程序编译时是从右往左读的。所以一下这种情况无法通过编译。
Role role1=new SwordsMan();
SwordsMan swordsMan=role1;//Role不一定是SwordsMan类
需要将代码改为如下以通过编译,但这在执行时期可能会出错,需仔细考虑:
Role role1=new SwordsMan();
SwordsMan swordsMan=(SwordsMan)role1;
-多态即指使用单一接口操作多种类型的对象,多态具有更高的可维护性
多态程序showblood
运行结果为:
- 重新定义即为在继承父类后,在子类中定义与父类中相同的方法部署,但执行内容不同。
重新定义的应用程序
运行结果为:
- 类中若有方法没有操作,就需标示为
abstract
,且在class前也一定要标abstract
,表示这个类定义不完整 - 子类继承标示有abstract的类1.继续标示该方法为abstract,则class前也一定要标2.操作抽象方法
- 声明为
protect
的成员,相同包中的类可以直接存取,不同包中的类可以在继承后直接存取。 - 如果子类想获取父类中的方法定义,可以在调用方法前,加上
super
,这种方法不能被定义为private
,重新定义方法,对于父类中的方法权限,只能扩大不能缩小。
相关范例程序
运行结果为:
- 重新定义方法时可将方法类型定义为父类中的子类。
- 在创建子类实例后会先执行父类定义的初始流程,再执行子类定义的初始流程,若干子类构造函数中没有指定执行父类的哪个构造函数则会默认调用父类中无参数构造函数。
- 若干想执行父类中的构造函数,可使用super()指定。
- class前加上
final
关键字,那么表示这是最后一个类了,不会再有子类;方法若被定义为final,则子类不能重新定义方法。 java.lang.object
是所有类的顶层父类,object上定义的方法,所有对象都继承下来,只要不是被定义为final的方法,均可重新定义。
object的运用instanceof
运算符可以用来判断对象是否由某个类创建,左操作为对象右操作是类。
接口与多态
- 定义行为在可以使用
interface
关键字。 - 类要操作接口,必须使用
implements
关键字;操作接口时对接口中定义的方法有两种处理方式1.操作接口中定义的方法2.在读将该方法表示为abstract。
关于游泳乐园的代码
运行结果为:
- 操作接口表示拥有行为,但不会有是一种关系。
- 有弹性、可维护性的程序就是增加新的需求,原有的程序无须修改,只需针对新需求撰写程序。
- 类可以操作两种以上的类,即具有两种以上的行为。
操作两种以上类的程序oceanworld
运行结果为:
- Java中,接口可以继承自另一个接口,即继承父接口行为,且在子接口中额外定义行为。
接口继承范例Ship
运行结果为:
- 接口中的方法没有操作时,一定得是公开且抽象,但是可以省略
public abstract
,其默认定义即为这样。 - 在interface中,只能定义
public static final
的枚举常数,若省略,则会默认补充,且必须使用=指定值,否则会编译错误。 - 接口可以继承别的接口,也可以同时继承两个以上的接口,同时会继承父接口的操作。
- 匿名内部类的语法为:
new 父类()|接口(){
//类本体操作
}
- JDK8以前,如果要在匿名内部类中存取局部变量,则该局部变量必须是final。
- 可以使用
enum
语法来定义枚举常数,public enum Action
定义的Action实际上是个类,而enum中列举的常数实际上为Action实例,由于构造函数为private,只有Action类中才可以实例化,因此可以传入的只有在Acion类中定义的实例。
enum枚举实例Game
运行结果为:
教材学习中的问题和解决过程
- 在学习第六章时,我发现了教材程序的错误,我按教材范例来练习程序Guest,我发现按教材上的程序来,得到的结果如下,与所需结果不符:
教材程序Guest
- 后我通过单步调试发现原因出在如下循环的位置:
- names.add()的执行应该在循环内,这样每次录入的名字才能加入数组,而不是只有最后一个quit,将循环处的程序改为如下,即可得到所需输出:
正确修改后的程序GuestJDB
代码调试中的问题和解决过程
- 在编写与接口有关的代码oceanword时,我由于想偷懒,在继承后的子类中少写了执行父类构造函数的这部分代码:
public Flyingfish(String name){
super(name);
}
结果出现了如下错误提示:
- 这是因为若子类构造函数中没有指定执行父类父类中的哪个构造函数,则会默认执行父类中的无参数构造函数,但是父类中没有无参数构造函数,则必须指定执行哪个构造函数,否则就是调用不存在的构造函数了。补充上以上代码后,则运行结果正确了。
代码托管
- 代码提交过程截图:
-
代码量截图:
上周考试错题总结
- 题1,Linux Bash中,(grep)命令可以进行全文搜索
- 题5,System.out.println(52+25+””);的结果是(77);java中可以通过‘+’来连接字符串,但是+要在字符串前,才表示连接的是字符串。
- 题18, p109 Average.java,求1,2,3,4,5的平均值的命令是(java cc.openhome.Average 1 2 3 4 5);这是因为在启动JVM并指定执行类时,可以一并指定命令行自变量
- 题25,判断:public void someMethod(int i)和public int someMethod()是方法重载。(OK);返回值类型不可作为方法重载依据,所以public void someMethod()和public int someMethod会被视为同一个定义,方法重载可根据传递自变量类型不同和参数列个数不同来设计方法重载。
其他(感悟、思考等,可选)
本周主要学习了继承、接口和多态的问题,感觉上和c语言的函数还是差别很明显的,语法比较繁杂,但是通过本周和上周的学习,已经能能够自己独立的编写一些程序了,尤其本周书本上的代码大都不能直接用,通过这两周的学习,衔接改写代码已经基本没有太大问题了,但是在一些复制程序的理解和编写上还需继续努力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 20/20 | 1/4 | 20/20 | 安装了JDK及IDEA |
第二周 | 144/164 | 1/5 | 18/38 | 学习了java语言的基本语法 |
第三周 | 447/567 | 1/6 | 20/ 58 | 掌握了一些有关对象和封装的内容 |
第四周 | 875/ 1442 | 1/7 | 23/81 | 学习了解了继承、接口和多态的相关问题 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:25小时
-
实际学习时间:23小时
-
改进情况:随着本周学习java语法的渐渐复杂,我大部分的学习时间都用在了编程实际操作上面,感觉这样对知识的掌握更加牢固。