20165228 2017-2018-2 《Java程序设计》第4周学习总结
20165228 2016-2017-2 《Java程序设计》第4周学习总结
教材学习内容总结
- 子类与继承
- 子类的定义:使用关键词extends
class 子类名 extends 父类名{ ... }
- 一个子类只能有一个父类,子类继承父类的属性与行为,并可增加其新的属性和行为。Object是所有类的祖先类,若一个类声明中未使用extends关键词,则默认是Object的子类。习惯称子类与父类的关系为"is-a"关系
- 子类的继承性
- 当子类和父类在同一个包中时,那么子类继承其父类中不是private的成员变量(方法)作为自己的成员变量(方法)
- 当子类和父类不在同一个包中时,子类只继承父类中的protected和public访问权限的成员变量作为子类的成员变量。同样,子类只继承父类的protected和public访问权限的方法作为子类的方法
- 关于protected的说明:一个类中的protected的成员变量和方法可以被它的子孙类继承。
- 如果用D类再D本身创建一个对象,那么该对象总是可以通过"."运算符访问继承的或自己定义的protected变量及方法。
- 如果在另一个类中,例如在Other类中用D类创建一个对象object,该对象通过"."运算符访问protected变量及方法时,对于子类D自己声明的protected成员变量和方法,只要Other类和D类在同一个包中,object对象就可以访问这些protected成员变量和方法。对于子类D从父类继承的protected成员变量和方法,只要Other类和这些protected成员变量和方法所在的祖先类在同一个包中,object类对象能访问继承的protected变量和方法
- 子类与对象
- 子类不继承父类的私有成员变量
- 子类与父类不在同一个包中,子类不继承父类的友好成员变量
- instanceof运算符是Java独有的双目运算符,其左边的操作元是对象,右边的操作元是类。当左边的操作元是右边的类或其子类所创建的对象时,运算结果是true,否则是false
- 成员变量的隐藏和方法重写
- 子类声明的成员变量名字和从父类继承而来的成员变量的名字相同时,子类就会隐藏所继承的成员变量
- 子类隐藏继承的的成员变量的特点:
子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量
子类继承的方法所操作的成员变狼一定是被子类继承或隐藏的成员变量 - 子类继承的方法只能操作子类继承和隐藏的成员变量。子类新定义的方法可以操作子类继承和子类新声明的成员变量,但无法操作子类隐藏的成员变量(需使用super)
- 方法重写(方法覆盖):子类可以通过重写可以隐藏已继承的方法。指子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且方法的名字、参数个数、参数类型和父类的方法完全相同
- 如果子类可以继承父类的某个方法,那子类就有权利重写这个方法。
- 重写目的:把父类的状态和行为改变为自身的状态和行为
- 重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法(需使用关键词super)
- 重写注意事项:重写父类方法时,不允许降低方法的访问权限,但可以提高权限
访问权限从高到底的排列顺序:public、protected、友好的、private
- super的使用
- 子类一旦隐藏了继承的成员变量(方法),那么子类创建的对象不再拥有该变量(不能调用该方法),该变量(该方法的调用权)归关键词super所有。
- 如果子类想使用被子类隐藏的成员变量和方法
访问和调用被子类隐藏的变量x:
访问和调用被子类隐藏的方法play():
super.play()
- final关键字
- final关键字可修饰类、成员变量和方法中的局部变量
- final类:使用final声明,不可继承也不能有子类
final class A { ... }
- final方法:修饰父类中的一个方法时,这个方法不允许子类重写。不允许子类隐藏可以继承的final方法
- 常量
- 成员变量或局部变量被修饰为final时,它就是常量,在声明时无默认值。所以要求再声明常量时指定它的值
- abstract类和abstract方法
abstract class A { ... }
abstract int min(int x,int y);
- 对于abstract方法,只允许声明,不允许实现(没有方法体),不允许使用final(及static)和abstract同时秀是一个方法和类。即abstract方法必须是实例方法
- abstract类只关心操作,而不关心细节
- abstract类中可以有abstract方法,也可以有非abstract方法(可以没有abstract方法)
- abstract类不能用new运算符创建对象
- 接口
- 使用interface来定义一个接口,接口定义包括接口声明和接口体
interface 接口名 { 常量声明+抽象方法(访问权限一定是public) } - interface前面加上public,则这个public接口可以被任何一个类实现。如果不加public,则称作友好接口,只能被与该接口在同一个包中的类实现 - 接口可被继承,可通过extends声明一个接口是另一个接口的自接口。由于接口中的方法和常量都是public类,子接口将继承父接口的全部方法和常量 - 接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用 - 接口回调:把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法 - 接口参数:如果准备给一个方法的参数传递一个数值,可能希望该方法的参数的类型是double型,这样就能向该参数传递byte、int、long、float和double型数据 - 如果一个方法的参数是接口类型,可以将任何实现该接口的类的实例的引用传递给该接口参数
- abstract类与接口的比较:
- abstract类和接口都可以有abstract方法
- 接口只可以有常量不可以有变量;而abstract类既可以有常量也可以有变量
- abstract类也可以有非abstract方法,接口不可以
教材学习中的问题和解决过程
- 问题1:如何将对象的上转型对象强制转换到一个子类对象?
- 问题1解决方案:还未解决,虽然百度过这个问题,但是仍然没有明白如何操作
- 问题2:this可以访问被隐藏的变量和方法,和super的区别是什么?
- 问题2解决方案:通过搜索资料,大概如下:
不同点:
1、super()主要是对父类构造函数的调用,this()是对重载构造函数的调用
2、super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用;this()主要是在同一类的不同构造函数中的使用
相同点:
1、super()和this()都必须在构造函数的第一行进行调用,否则就是错误的 - 问题3:使用IDEA调试带中文的程序时,会提示“不可映射的GBK字符”
- 问题3解决方案:Setting->File Encodings->IDE Encoding选择utf-8,不要选择“system default”
同时,Default encoding for properties files 也选择 UTF-8
代码调试中的问题和解决过程
- 问题1:运行Example5_8时提示“非法字符:’\u3008’”
- 问题1解决方案:写代码时,输入法的全半角问题,切换到英文输入法,把报错行重新输入即可
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 错题1及原因,理解情况
原因:通过aa与55按位与计算后得到FF,没多加思考就选择了A - 错题2及原因,理解情况
原因:将这道题想得太简单,只注意到了将-2的二进制数右移一位,即除以2后的值 - 错题3及原因,理解情况
原因:对于这道题的B选项不太确定,但是由于short的取值范围为-32768~32767,于是我把D选项给排除掉,选择了BC - 错题4及原因,理解情况
原因:这道题算是粗心大意吧,没有注意到“Float”,以为就是普通的浮点型数据 - 错题5及原因,理解情况
原因:我对这道题的B选项不确定,所以就只选择了CD
其他(感悟、思考等,可选)
随着学习进度地不断推进,我发现以前每天敲一点代码然后把学习的任务留到周末的方法效果很差。每一章的内容都很多,我将调整自己的学习时间,每天学一点然后将所学部分的代码敲了,才会引发更加深入的思考和增强理解
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 25篇 | 400小时 | |
第一周 | 235/235 | 1/1 | 15/15 | |
第二周 | 224/459 | 2/3 | 15/30 | |
第三周 | 443/902 | 1/4 | 15/73 | |
第四周 | 577/1479 | 2/6 | 17/90 |
-
计划学习时间:20小时
-
实际学习时间:17小时