20145301第四周学习总结
教材学习内容总结
第六章
6.1 何谓继承
-
何谓继承 面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承,滥用继承而导致程序维护上的问题时有所闻。如何正确判断使用继承的时机,以及继承之后如何活用多态,是学习继承时的重点。:
-
通过extends继承的父类可以是不加abstract关键字的普通类,也可以是加了abstract关键字的抽象类。继承普通类时可以覆写父类的方法,或者创建自己独有的方法,或者这两者都不使用。继承抽象类时,必须覆写抽象类中的全部抽象方法
public class SwordsMan extends Role{
private int level; // 角色等级
private String name; // 角色名称
private int blood; // 角色血量
public void fight() {
System.out.println("挥剑攻击");
}
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;
}
-
implements继承的父类是且必须是一个interface定义的接口类,且接口中不能定义方法体,只能拥有私有变量和方法名。子类必须实现所有接口中的方法
-
如果一个方法中含有与成员变量同名的局部变量,则方法中对该变量的访问以局部变量进行访问,也就是说,方法体中的局部变量覆盖了成员变量。如果要在该范围内访问成员变量,就必须使用this关键字
-
不能在静态上下文和静态代码块中使用this关键字,编译器不允许这么做。
-
子类可以重写父类的方法,或者说可以覆盖父类的方法,只要在子类中定义与父类相同的方法就可以了。但是,方法的声明一定要和父类的方法声明一样
- 可以使用super关键字应用父类的方法,然后再添加新的业务代码。
6.2继承语法细节
-
protected 被声明为 protected 的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类直接存取;Java中,有3个权限关键字,但实际上有4个权限范围,因为没有定义权限关键字,默认就是包范围。
-
重新定义的细节 要注意,对于父类中的方法权限,只能扩大但不能缩小(即若原来成员为 public,则子类中重新定义时不可为 private 或 protected);在 Java中,如果想取得父类中的方法定义。可以在调用方法前,加上 super 关键字; static 方法属于类拥有,如果子类中定义了相同签署的 static 成员,该成员属于子类所有,而非重新定义, static 方法也没有多态。
-
对象类型转换和多态
1.多态:同一个实体同时具有多种形式,这样可以提高代码的可重用性
2.对象类型转换分为向上转型和向下转型
向上转型:子类的对象被看做父类的对象来使用
这样的类型转换是安全的,但会丢失子类中新定义的那些信息
向下转型:父类的对象被看做子类的对象来使用(需要使用强制转换)
这种类型转换时不安全的,有可能造成信息的缺失
3.Java中通过覆写机制可以在继承关系的若干类中定义方法名、参数表、返回值相同但方法体不同的方法,在程序运行时,根据所引用对象的类型来判断执行哪个方法,这称为动态绑定(即运行时确定执行哪个方法)
- 关键词final
1.final可以用于修饰变量、方法和类,表示被修饰的东西只能做一次初始化,之后不能发生改变
当final修饰方法参变量时,表示方法中不会对参变量的值做修改
final修饰的静态成员变量必须在声明时或在静态初始化块中初始化
final修饰的方法在继承过程中不能被覆写
final修饰的类不能被其他类继承
2.final类没有子类,final类的成员方法不会被覆写,final类的成员变量却不一定是常变量象。
- 关于垃圾收集 JVM 有垃圾收集(GC)机制,执行流程(目前我们只接触过 main()程序进入点开始之后的主流程)中,无法通过变量参考的对象(就是没有牌子的对象),就是 GC 认定的垃圾对象。数。
第七章
7.1 何谓接口
-
定义形式:interface interfaceName {…}
成员方法默认为抽象的、公有的,成员属性默认为静态的、final修饰的
接口只是提供一种形式,具体的实现细节交由它的类完成
由于接口不涉及具体的实现,因此在接口中的成员变量是静态常变量,默认为static和final修饰
-
类实现一个接口:class MyClass implements A, B, C {…}
一个类可以实现多各个接口
注意:虽然在接口中没有显式声明方法是公有的,但接口中默认的访问控制是公有的,而类中默认的访问控制是包内友好,所以必须在类中将这个方法用public修饰
-
接口和抽象类的选择:
Java中类之间不支持多继承,但类可以实现多个接口
若类需要包含一些方法的实现,必须实现为抽象类,其他情况两者皆可,优先选择使用接口,使程序更加易于扩展
7.2 接口语法细节
- 使用interface来定义抽象的行为外观,方法要声明为public abstract,无须且不能有操作。为了方便,也可以省略public abstract,编译程序会协助补齐。可以使用接口枚举常数,只能定义为public static final。为了方便,也可以省略public static final。
- 接口可以继承别的接口,也可以同时继承两个以上的接口,也是使用extends关键字。
- enum语法可用于定义枚举常数,enum实际上定义了类,而enum中列举的常数实际上是public static final,无法撰写程序直接实例化枚举类型,因为构造函数权限设定为private,只有类中才可以实例化。
问题和解决过程
问题
不清楚覆盖和重载。
解决过程
在博客园上找到高手之见,特推荐:
重载和覆盖的区别:
- 重载发生在同一个类之中,重载要求函数名相同,参数不同(参数个数||参数类型||参数顺序)。特别的函数的返回类型不影响重载。
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
- 覆盖发生在父子类之间,覆盖同样要求函数名相同,并且参数也相同。覆盖遵循“两同两小一大”的原则。 两同是即是函数名和参数是相同的;两小是抛出的异常更小或相同,返回类型更小或相同;一大是访问权限更大或相同。 构造函数和静态方法支持重载,但是不可以被覆盖。(构造方法和static的相似性,也可以联系到private和final关键字也有此相似性)
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float), 但是不能为fun(int, int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
其他
- 抽象类和接口的区别:
在设计理念上,一个类只能继承一个抽象类,但是可以实现多个接口。
抽象类可以含有普通成员变量和非抽象的方法,而接口的成员变量和方法都有固定的修饰。即:public static final 和 public abstract。对于继承者来说,抽象类的方法子类可以不全部复写,但是接口的方法抽象类是必须全部复写的。
抽象类也可以implements接口,可以实现接口中的方法,也可以不实现。抽象类不可以被final修饰。抽象类可以包含非抽象方法。心得体会
这周感觉学习比较吃力,抽象的东西越来越多,理解上难度也逐渐增加。如:对象、封装等概念,即使读了,也不能完全理解。也不能再吃C语言的老本,需要我投入更多的时间和精力,我需要更多的去展开去学习,不能仅仅局限在看书,码代码上,不懂的地方,我会先码着码,好先留存着问题,去与同学进行交流。我发现博客园的学习不应仅仅局限于dky的小圈子,我们可以抽些时间,看看其他高手的博客进行学习,会对我们的学习很有帮助。
学习进度条
目标 | 代码行数 | 博客量 | 学习时间 | 重要成长 |
---|---|---|---|---|
目标 | 4000行 | 30篇 | 400小时 | ---- |
第一周 | 100/4000 | 2/30 | 15/400 | hello java |
第二周 | 350/4000 | 3/30 | 40/400 | 流程控制 |
第三周 | 500/4000 | 4/30 | 50/400 | 类与对象、封装 |
第四周 | 700/4000 | 5/30 | 50/400 | 继承、接口 |
参考资料
- 《Java学习笔记》
- 《Java学习笔记》学习指导
- 毕向东java教学