20165214 2017-2018-2 《Java程序设计》第四周学习总结
教材学习内容总结
- 每个子类只能有一个父类,而一个父类可以有多个子类。可以使用关键字
extends
来定义一个类的子类:class 子类名 extends 父类名
。不加extends关键字时,默认为Object类,Object类是任何类(除了本身)的祖先类。 - 简单的说,子类拥有父类的所有(除了private类及不同包的友好类),同时可以拥有自己新的东西。
- 如果一个类A想通过一个其他类B的子类C创造对象来调用它的变量或者方法:①若要调用的是子类C内部新定义的而不是继承的,只要C与A同包即可; ②若要调用的是C继承下来的,只要C所继承的祖先类与A同包即可。
- 子类可以通过继承的方法来操作未继承的变量。
instanceof
运算符:除了之前在第二章总结的以外,还有:当子类创造的对象与父类去使用instanceof运算符时,得出的结果也是true。- 当子类新声明的变量名与继承的变量名相同时,继承的变量名会被隐藏。但是我们仍可以通过继承的方法来对隐藏的变量名进行操作。(继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。)
- 方法重写:要求新的方法的类型与父类相应方法一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父亲的方法完全相同。重写方法可以操作继承的变量、方法,也可以操作子类新声明的成员变量、方法。如果子类想要使用被隐藏的方法或者成员变量,需使用super。注意,重写方法时不允许降低方法的访问权限。
super
的使用方法:通过命令super.[成员变量]和super.[方法]来分别使用被隐藏的变量和方法。在父类中定义多个构造方法时,应当包括一个不带参数的构造方法,这是因为如果在子类中没有写出super关键字,默认地有super()
。final
关键字。final关键字可以修饰类、成员变量和方法中的局部变量。①修饰类:被修饰的类不能有主类。
②修饰父类的方法:子类不能对被修饰的方法进行重写
③修饰变量:被修饰的变量变为常量,常量在运行期间不能发生变化。- 上转型对象。通过把子类创建的对象的引用赋给父类创建的对象来得到上转型对象。上转型对象不能操作子类新增的成员变量与方法,但是可以操作子类继承或隐藏的成员变量或方法。注意的是,如果子类重写了父类的静态方法,则子类对象的上转型对象不能调用子类的重写静态方法,只能调用父类的静态方法。
- 父类的方法被子类重写时,可以各自产生自己的功能行为。
- 关键字
abstract
:①修饰方法:被修饰的方法只能声明不能运行。
②修饰类:被修饰的类中可以有abstract方法,也可以有非abstract方法。而没被修饰的类只能有非abstract方法。- abstract父类的abstract子类可以继承或重写父类的abstract方法,但是abstract父类的非abstract子类必须重写父类的abstract方法。
- abstrcat的类只能声明对象但是不能创建对象,但是该对象可以成为其子类的上转型对象。
- abstract不能和final同时修饰。
- abstract类在实际中很好用,因为它注重面向对象而不是面向类。
- 开闭原则是对扩展开放,对修改关闭。我觉得在这其中abstract起了很大的作用。遵守开闭原则的系统易于维护。
- 使用
interface
来定义一个接口。接口=接扣声明+接口体
。接口体中只有常量(权限为public,且为static常量)和抽象方法(权限为public,为stract型),没有变量。- public接口可以被任意一个类实现,友好接口可被同一个包里的接口实现。
- 接口也可以通过extens来继承。
- import语句可以引入包的类也可以引入包的接口。
- 通过类来实现接口:在类声明中使用关键字implements来声明一至多个接口。非抽象类实现了某个接口,一定要重写这个接口中的所有方法(要去掉abstract,体现public)。抽象类实现了某个接口,既可以重写,也可以不重写。
- 可以通过接口名来访问常量,也可以通过实现接口的类来直接使用。
- 接口回调:简单的说,接口回调就是为了能够调用某个接口中的方法。具体操作:类A实现接口B;A创建对象a;B声明变量b;b=a;
教材学习中的问题和解决过程
-
问题1:在书里的程序里看到了一个
类名.intValue()
,不懂这是什么意思。 -
问题1解决方案:上网查了一下,在这个链接里发现了解决的方法。
-
问题2:在写第五章的课后习题的时候,发现了这样一个问题。
-
问题2解决方案:在写这个程序的时候,我忽略了不能直接使用空对象,修改程序时改错了地方,导致了这个结果。于是我进入程序,把主函数的程序恢复原来的样子,然后在
这个函数里面对返回值直接进行了输出,解决了问题。
代码调试中的问题和解决过程
-
问题1:第五章的很多代码都涉及到继承,因此在输入这些程序的时候,只要其中一个地方错了,就会导致错了很多个,纠错既浪费很浪费时间。思考如何减少这种误。
-
问题1解决方案:总结了一下我常错的几个方面,以后一定得注意:①及得关键字extends,不要漏掉;②输入的时候看清楚变量、方法的大小写。③程序排版要合理,以免出现大括号打多了或者打少了的情况。
-
问题2:教材Example5_6的代码为什么在
return new Integer(100);
这句里要加上100呢,本来定义的Integer方法是没有参数的。
-
问题2解决方案:现在还没有解决这个问题。
代码托管
上周考试错题总结
- 错题1:15&250的值为? 这道题答案错了。我算出来是10,同学们也是,但是答案里没有这个选项。
- 错题2:float x = 0.f;double y = 0.5,则x==y的结果为flase。这道题娄老师在课下给了我很好的解答,让我知道了浮点类型的编码方式。
- 错题3:byte b=byte(-150),则b的值为106。这是正确的。错误原因是我错把byte的范围记成了-256255..应该是-128127。
- 错题4:课本P23程序在命令行运行时,输入ctrl+c可以结束阻塞。这是正确的。
- 错题5:'ucafe'是正确的char型变量声明。u表示16进制,cafe我把它错以为是字符串。。
- 错题6:char str[] = " hello"是错误的初始化语句。因为hello是string型。
- 错题7:复制数组不能使用“=”。
- 错题8:P29的程序所用的是选择排序法,不是冒泡排序法,这道题答案也错了。
- 错题9:变量赋值boolean a = = false是不对的。错题原因:没注意审题,忽略了是两个“=”。
我发现这周的错题除了两道题是答案错了以外,其他好几道题都是自己太粗心才错的。。审题不够细心。
其他
不得不说,这周我又发现了娄老师“考试就是一种学习”这句话的正确性。无论是线上蓝墨云里的测试,还是线下课堂上的测试,都让我有很大的收获。因为对于我们的教材,如果顺着它有耐心、专心地看下来,跟着敲一敲代码,写一写博客,其实是不会遇到什么问题的。这时候如果没有测试,我们就不能发现自己的问题(因为书里的教材只是一部分,更关键的是看自己能不能通过教材的学习做到举一反三,而测试可以帮我们看到这些)。
基于测试,我也能够提出一些自己真正不会、不懂的问题,而这些问题在老师、同学们的解答下,使我印象深刻, 学习也就事倍功半。
另一方面,我发现了一个自己的不足。就是在时间紧张的时候编程序,编出来的程序格式比较乱,没有美感。这在我们本周的课上测验上就暴露了出来。以后需对这个问题进行改正。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 36/36 | 1/1 | 8/8 | |
第二周 | 432/468 | 2/3 | 15/23 | |
第三周 | 964/1432 | 1/4 | 16/39 | |
第四周 | 725/2157 | 1/5 | 14/53 |
-
计划学习时间:15小时
-
实际学习时间:14小时
-
改进情况:效率有所提高,提前完成任务。