20145302 《Java程序设计》第四周学习总结
教材学习内容总结
第六章
- 继承共同行为
- 面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承。
- 程序代码重复在程序设计上就是不好的信号,多个类间出现重复的程序代码时,设计上可考虑的改进方式之一,就是把相同的程序代码提升为父类。
- 在java中,继承时使用
extends
关键字,private
成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(若父类愿意提供访问方法的话)。
- 多态与is-a
- 在java中,子类只能继承一个父类,并且子类与父类之间有一种is-a的关系。
- 多态,抽象的说,就是使用单一接口操作多种类型的对象。
- 重新定义行为在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义(Override)。在重新定义父类中某个方法的时候,子类必须撰写与父类方法中相同的签署。
- 抽象方法、抽象类如果某个方法区块中真的没有任何程序代码操作,可以使用abstract标示该方法public abstract void fight,定义不完整的类就不能用来生成实例,内含抽象方法的类也一定要定义为不完整的抽象类,子类继承抽象类,对于抽象方法,一种是继续标示其为抽象类,另一种就是操作抽象方法。
-
protected成员java中有
public
、protected
、private
三个权限关键字,但实际上有四个权限范围。 - 重新定义的细节
- 如果想取得父类中的方法定义,可以在调用方法前,加上
super
关键字。 - 重新定义方法要注意,对于父类中的方法权限,只能扩大不能缩小。
- 在JDK5后,重新定义方法时,如果返回类型是父类中方法返回类型的子类,也可以通过编译。
- 再看构造函数在创建子类实例后,会先进行父类定义的初始流程,在进行子类定义的初始流程,如果子类构造父类函数中没有指定执行父类中哪个构造函数,默认会调用父类中无参数构造函数如果父类中定义了构造函数,子类构造函数时就要注意调用父类中的哪个函数。
- 再看final关键字
- 如果
class
前使用了final
关键字定义,那么表示这个类是最后一个了,不会再有子类,也就是不能被继承。 - 定义方法时,也可以限定该方法为
final
,这表示最后一次定义方法了,也就是子类不可以重新定义final
方法。
- java.lang.object
- 如果定义类时没有使用
extends
关键字指定继承任何类,那一定是继承java.lang,Object
。 - 在java中,任何类追溯至最上层父类,一定就是
java.lang.Objet
。
- 垃圾收集
- 对于不再有用的对象,JVM有垃圾收集机制,收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。
- 在执行过程中,无法通过变量参考的对象,就是GC认定的垃圾对象。
-
再看抽象类在不确定执行环境的时候,可以先创建出ConsoleGame实例,执行
go()
方法过程中调用到print()
、nextInt()
或println()
等方法时,都是执行ConsoleGame中定义的流程。
第七章
- 接口定义行为
- 对于定义行为,可以使用
interace
关键字定义,接口中的方法不能操作,直接标示为abstract
,而且一定是public
。 - 操作某接口时,对接口中定义的方法有两种操作方式,一是操作接口中定义的方法,二是再度将该方法表示为
abstract
。 - 继承会有“是一种”关系,而操作接口表示“拥有行为”。
- 行为的多态与继承相同,也可以让一个对象强行扮演(cast)某种行为,与多态相同,只要是操作同一个接口的类都可以拥有接口的行为,可维护型也同时得到了较大的提高。
- 解决需求变化在java中类可以操作两个以上的类,可以同时继承某个类并操作某些接口;于此同时,java中接口可以继承自另一个接口,也就是继承父接口行为,再在子接口中额外定义行为。
-
接口的默认可以使用接口枚举常数,只能定义为
public static final
,如果有两个接口都定义了方法,操作的两个接口的类并不会有错误,照样会通过编译,所以要在设计时注意一下。 -
使用enum枚举常数
enum
实际上定义了类,而enum
中列举的常数,实际上是public static final
,而且为枚举类型实例,无法撰写程序直接实例化枚举类型,因为构造函数权限设定为private
,只有类中才可以实例化。
教材学习中的问题和解决过程
- 这两章的联系比较紧密,一定得把前方的知识都搞懂了,循序渐进才能一步步的将代码看懂,这就很尴尬了,函数各种调用,在学习状态不好,精神疲惫的时候是无法参透代码的含义的,子类,父类,继承,接口,多态,枚举常数等含义都要反复的看,否则不好理解。
代码调试中的问题和解决过程
-
问题在模仿Game游戏代码时,我将Game中的游戏代码都放到了一个包里,给“Role”、“RPG”等命名时加上了数字编号,结果发现
fight()
无法使用。 -
解决过程我发现,随着类名称的改变,自己在模仿书上的代码的同时应该注意相对应的修改一些代码,才可以正确的调用函数。而且改变了文件的包的位置的时候,注意修改import偷懒的那个包的地址,包的嵌套中间用
.
隔开。
本周代码托管截图
其他(感悟、思考等,可选)
- 这周的学习任务很繁重,而且更加抽象了,而且函数各种调用,不太容易看懂,必须得细心。
- 我发现,都到第七章了,良葛格的好多注释还是“无聊的语法示范”,说明现在还在学习很基础的知识,为了之后较熟练的应用java,我们应该扎实基础,一周两章感觉不太能消化完。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 1500行 | 15篇 | 400小时 | |
第一周 | 10/10 | 2/2 | 10/10 | 基础知识 |
第二周 | 100/100 | 3/3 | 35/35 | 语法知识 |
第三周 | 300/300 | 4/4 | 60/60 | 了解对象 |