20145337《Java程序设计》第四周学习总结

时间:2024-01-14 19:36:56

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文件中运行,显示找不到类或方法

  • 解决过程:回顾第二章,将分立的代码放在共同的包内,就可以了

本周代码托管截图

20145337《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 继承与多态

参考资料