《Java程序设计》第六次学习总结
学号 《Java程序设计》第三次学习总结
目录
教材学习内容总结
教材学习中的问题和解决过程
代码调试中的问题和解决过程
其他(感悟、思考等,可选)
正文
教材学习内容总结
这次主要是学习了多态这一章以及粗略的了解了一些排序算法和查找算法。总体上来说,其实概念上不存在很难理解的地方。
下面图中的例子很好的说明了多态的概念,同时还有一个例子就是上课老师讲过的“动物的叫声:猫是喵喵叫,狗是汪汪叫,狼是嗷嗷叫。这些不同的叫声就体现了多态(Polymorphism)”
只是有几个小的地方(和现实世界不同的地方)需要特别记忆一下的:
A a = new B(); //A是父类, B是子类
- 向上转型:只能调用与父类引用中父类相同的方法,不能调用子类中自己定义的方法和属性,且上转是自动完成的。;如果在子类中重写了,则调用的是子类中的方法;老师上课讲的就是(上转调用方法时:调用子类的方法,父类的属性。这句话具体的涵义就是:当上转型引用变量a去调用实例化时用到的子类B的方法时,那么相当于子类B的对象去调用这些方法。因此,如果子类重写了父类的某个方法,当对象的上转型引用变量A调用这个方法时一定是调用了子类重写的方法。但是,如果子类重写了父类的静态方法,那么子类的上转型引用变量A不能调用子类重写的静态方法,只能调用父类的静态方法。)
但是只能调用父类中相同的方法。
这一点也好理解:- 如果说老虎是哺乳动物,那么我们在谈论这样一个事物时,老师变回失掉老师独有的属性和功能,只谈论哺乳动物们所共有的特性,如:老虎也是哺乳动物,它有哺乳动物的特点体温基本稳定,能够分泌乳汁来给幼崽哺乳。这样我们就不会说它跑得很快,生活在大草原上,而是讨论老虎和哺乳动物所共有的一些特性。因此:只能调用和父类共有的方法和属性,不能操作子类中新定义的和父类不同的方法和属性。
综上所述,关于上转只要记住三点就行:
- 如果说老虎是哺乳动物,那么我们在谈论这样一个事物时,老师变回失掉老师独有的属性和功能,只谈论哺乳动物们所共有的特性,如:老虎也是哺乳动物,它有哺乳动物的特点体温基本稳定,能够分泌乳汁来给幼崽哺乳。这样我们就不会说它跑得很快,生活在大草原上,而是讨论老虎和哺乳动物所共有的一些特性。因此:只能调用和父类共有的方法和属性,不能操作子类中新定义的和父类不同的方法和属性。
1. 老虎是哺乳动物,所以只能讨论:老虎和哺乳动物的共有特性!
2. a 去调用方法时,实际上子类B的对象在调用方法。
3. 上转是自动完成的
-
向下转型:可以调用父类中的方法,也可以调用子类中自己定义的方法和属性;如果子类中重写了父类的方法,调用的是子类中重写的方法;下转要明确写出来,不像上转那样是自动完成的。
-
实现多态的方式:其中的重点是调用的方法是取决于在实例化时候等号右边的那块东西
-
关于搜索,有个最基本的概念:被搜索的一组元素称为搜索池。
[回到目录](#index)
[回到目录](#index)
教材学习中的问题和解决过程
问题一:在看郭同学的博客的时候看到这样一段话,觉得验证了自己前面关于“门牌号”(引用变量)和对象的想法。如下图:
“栈”里面住的是“很简单”的“人(数据类型)”,“堆”里面住的是很复杂的“人(数据类型)”。类比在新区的你所学到的知识,和在老区你所会的知识。新区是“栈”,老区是“堆”。
- 问题二:抽象类和接口的区别
[回到目录](#index)
[回到目录](#index)代码调试中的问题和解决过程
-
问题一:抽象类型 ≠ 抽象类型数组!
上图中的StaffMember[] 和下图的抽象类StaffMember是不同的。虽然StaffMember[]里放着的是StaffMember对象但是:StaffMember[]是一个复合类型,不是抽象类型,所以可以实例化:new StaffMember[6];
下图的StaffMember类型是抽象类,不能实例化的。
-
问题二:接口的详细说明如下图代码所示:
- 问题三:写PP104时用到了Comparable接口,但是不是很熟悉。通过看书以及查资料知道了:Integer包装类型实现了Comparable接口,但是int[]是没有实现的。JDK API 里面也说得很清楚了。
上图来自:Java程序设计教程(第8版) 326面。
在编写程序的时候,还再一次体会到,要打印出整个数组,只能够用循环去一个一个的打印数组的每一个元素,想要一次性把数组元素全都打印出来是不现实的!
-
问题三:在Linux中编译时遇到各种问题:“二元操作符>操作类型错误”
解决方法:查看自己的源代码发现,自己的>的操作数没有正确的输入,修改一下就行。 -
问题四:int[] 无法转换为Comparable[]
解决方法:就是上面提到过的关于Comparable 接口问题。因为int类型没有实现Comparable接口,所以是不行的,得用Integer包装类型才行。 -
问题五:数组初始化问题,符号不对
解决方法:在JAVA中的数组的初始化是用 { } 的!不是用[ ]。
-
问题六:在编写PP10.5时出现了空指针的问题。
解决方法:在Linux环境下不好debug,所以就在IDEA上,把pp10.5的源码给得到了,然后在IDEA上调试,一调试就知道了问题:我在increasize()方法中是一次性增加10个空的数组元素,所以当有7个数组元素时,我的数组长度是15而且前7个是实实在在的已经实例化的数组元素,但是后面8个是空数组元素。所以在进行排序时会出现空指针的情况。所以在DVDCollection类中增加了一个方法来得到实际的已经初始化的数组长度是多少,然后替换图中的length()方法。
本周代码托管截图
[回到目录](#index)
[回到目录](#index)其他(感悟、思考等,可选)
好好锻炼基本功,一用linux的命令行来编程的时候,拼写错误就会有很多。。。
还有一个计算后缀表达式的值的总结没写。。。。其实也就想说一个点:String转char 的话,用String类型中的charAt()方法,来转换!一个字符串的第一个字符就是charAt(0)!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第六次 | 325/1363 | 1/14 | 无记录 | 做完了第二次实验,再一次熟悉了对象数组,还弄懂了上转型对象的两个必要点。 |