20145337《Java程序设计》第四周学习总结
教材学习内容总结
继承与多态
继承
- 继承,避免多个类间重复定义共同行为
- 符合DRY(Don't Repeat Yourself)原则,多个类间出现重复的程序时,可改进为将相同的程序代码提升为父类
- 使用
extends
关键字,private
成员也会被继承,只不过子类无法直接存取,须通过父类提供的方法
多态
子类只能继承一个父类,子类父类之间存在
ISA
的关系检查多态逻辑语法是否正确,方式是从“=”右边往左读;判断右边是不是一种左边(右边类型是不是左边类型的子类),如果不是就会编译失败。如果加上扮演(Cast)语法,编译程序会让程序代码通过编译,不过很有可能会扮演失败,执行时抛出ClassCastException的错误。
封装是继承的基础,继承是多态的基础
「用父类声明对象引用,用子类生成对象」就有了多态
-
多态就是使用单一接口操作多种类型的对象,例如
`public class RPG2 {
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());
}
}`
覆盖
- 子类中出现与父类一模一样的方法时,会出现覆盖操作。一般来说,当子类需要父类的功能,而功能主体子类有自己特有内容时,可以覆盖父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
- 父类中的私有方法不可以被覆盖,在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。
- 覆盖需要注意的是:覆盖时,子类方法权限一定要大于等于父类方法权限,并且静态只能覆盖静态。
抽象方法、抽象类
- 如果某方法区块中没有任何程序代码操作,可以使用abstract标示该方法为抽象方法,该方法不用撰写{}区块,直接“;”结束即可。类中若有方法没有操作,并且标示为abstract,表示这个类定义不完整,因此也就不能用来生成实例。Java中规定内含抽象方法的类,一定要在class前标示abstract,表示这是一个定义不完整的抽象类。
继承语法细节
- 在Java中有public、protected、private三个权限关键字,但实际上有四个权限范围:
关键字 | 类内部 | 相同包类 | 不同包类 |
---|---|---|---|
public | 可存取 | 可存取 | 可存取 |
protected | 可存取 | 可存取 | 子类可存取 |
无 | 可存取 | 可存取 | 不可存取 |
private | 可存取 | 不可存取 | 不可存取 |
- 如果想取得父类中的方法定义,可以在调用方法前,加上super关键字,重新定义的时候要注意,对于父类中的方法权限,只能扩大不能缩小。如果想执行父类中某构造函数,可以使用super()指定,但要注意的是,this()和super()只能选择其中之一调用,并且一定要在构造函数第一行执行。
- class前也可以加上final关键字,如果class前使用了final关键字定义,那么表示这个类是最后一个了,没有子类,不能被继承。同样,定义方法时,也可以限定该方法为final。
java.long.Object
- 定义类时未使用extends关键字指定继承任何类型,为继承java.lang.Object,Java中的所有对象,都满足“是一种”Object
Object c1 = "Justin";Object c2 = new Date();
- 任何类型的对象,都可以使用Object声明的名称来参考
- 对于不再有用的对象,JVM有垃圾收集机制,收集到的垃圾对象所占据的内存空间,会被垃圾收集器释放。执行流程时,无法通过变量参考的对象,就是GC认定的垃圾对象。
接口与多态
对于“定义行为”,在Java中可以使用interface关键字定义:
package cc.openhome; public interface Swimmer{ public abstract void swim(); }
接口可以用于定义行为但不定义操作。类要操作接口,必须使用implements关键字。操作某接口时,对接口中定义的方法有两种处理方式,一是操作接口中定义的方法,二是再度将该方法标示为abstract.
操作接口则表示“拥有行为”,但不会有“是一种”的关系。Java中经常见到在接口中定义这类常数,称为枚举常数。事实上,在interface中,也只能定义public static final的枚举常数。在接口中枚举常数,一定要使用=指定值,否则就会编译错误。
接口可以继承别的接口,也可以同时继承两个以上的接口,同样也是使用extends关键字,这代表了继承父接口的行为。在JDK8之后,如果父接口中定义的方法有操作,也代表了继承父接口的操作。
教材学习中的问题和解决过程
对于这两章的学习,看的比较仔细,单纯机械的调试书上的代码,若有错误,也是因为粗心,并非语法错误
public class Role {
private String name;
private int level;
private int blood;
public void fight(){
}
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;
}
}
P178
import java.util.Arrays;
import java.util.Objects;
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;
}
}
代码调试中的问题和解决过程
问题一:对包的了解不够,机械的将教材上的代码敲到分立的.java文件中运行,显示找不到类或方法
- 解决过程:回顾第二章,将分立的代码放在共同的包内,就可以了
本周代码托管截图
其他(感悟、思考等,可选)
虽然在短短的周末安排两章的学习内容,有点多,所幸有所收获,虽然还有自主的编辑过JAVA代码,但“动手题”里提供了一些思路,确实有进步。计算机二级的考试题很简单,然根基不稳,再加上没有复习,所以C语言一直掌握的不好。当务之急,是提高学习的效率,光是看书、调试书上的代码,对我来说,应付考试尚可,自己编辑就难说。我会继续努力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | 了解JAVA环境 |
第二周 | 300/500 | 2/4 | 18/38 | 编写HelloWorld |
第三周 | 500/1000 | 3/7 | 22/60 | 了解类、封装 |
第四周 | 300/1300 | 2/9 | 30/90 | 继承与多态 |