201521123065 《Java程序设计》第4周学习总结
1. 本周学习总结
1.1 尝试使用思维导图总结有关继承的知识点。
1.2 使用常规方法总结其他上课内容
类设计:属性设计类型为priate并初始化。
文档注释:以/*开始,以*/结束。
继承:存在的本身是为了减少重复代码以免冗长增加不便;
单继承性,并继承所有成员;
出现覆盖时用supper调用父类,会根据对象的类型来选择进行父类或子类的函数;
创建子类时父类构造函数自动调用;
覆盖与重载的区别:覆盖是子类重新定义父类已存在的函数或进行更改,重载是同一个类中一样的函数名不一样的名称。
final与abstract:final不能被继承,final修饰的类没有子类,因此不能引用此类的对象;
abstract必须被继承,与final相反,不能new创建实例。
抽象方法:抽象方法的类一定是抽象类,抽象类的方法不一定都是抽象方法。
object:toString-默认调用,一般自定义覆盖;
equal-判断对象是否有相同引用;
hashCode-将对象插入散列表,equal方法改变也须改变哈希方法。
2. 书面作业
1、注释的应用
使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看。(截图)
类的注释:
方法的注释:
2、面向对象设计
2.1 将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事。(不得少于50字,参考QQ群中PPT的范例)
a、月末了打开手机淘宝屯粮;
b、点开天猫超市,选择食品饮料的饼干糕点;
c、将中意的商品全部加入购物车;
d、打开购物车发现满88包邮,返回购物界面继续添加商品;
e、结账时又发现购物券满150-20,继续挑选;
f、根据总计金额增删商品使最接近150;
g、确认收货人信息及收货地址,付款成功。
2.2 通过这个故事我们能发现谁在用这个系统,系统中包含的类及其属性方法,类与类之间的关系。尝试找到这些类与属性,并使用思维导图描述类、属性、方法及类与类之间的关系。
2.2 我发现年轻人及中年人在用这个系统,系统中包含淘宝(父类),其子类有天猫,口碑外卖等。父类的属性有产品,购物车,订单,收货信息等。
类与属性的思维导图:
3、ManagerTest.zip代码分析
分析ManagerTest.zip中的代码,回答几个问题:
3.1 在本例中哪里体现了使用继承实现代码复用?回答时要具体到哪个方法、哪个属性。
方法的复用:super(n, s, year, month, day)复用了父类的有参构造函数public Employee(String n, double s, int year, int month, int day);
double baseSalary = super.getSalary()复用了父类的public double getSalary();
属性的复用:class Manager extends Employee复用了父类的private String name; double salary; Date hireDay;
3.2 Employee类及其子类Manager都有getSalary方法,那怎么区分这两个方法呢?
Manager-getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
Employee-getSalary()
{
return salary;
}
Employee类setSalary其实是Manager的baseSalary,Manager的salary还包括Bonus;
在调用setSalary函数时,系统会根据该方法的实际对象类型进行调用。
3.3 文件第26行e.getSalary(),到底是调用Manager类的getSalary方法还是Employee类的getSalary方法。
运行结果如上:
通过工资的输出可以得知当执行到staff[0]时,e.getSalary是调用的Manager类的getSalary方法(其方法中还调用了Employee类的getSalary方法)因为初始化是这样的Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);staff[0] = boss;
当执行到staff[1],staff[2]时是调用的Employee类的getSalary方法。
3.4 Manager类的构造函数使用super调用父类的构造函数实现了代码复用,你觉得这样的有什么好处?为什么不把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,这样看起来不是更直观吗?
从直观上讲,用一句super(n, s, year, month, day);代替了private String name;private double salary;private Date hireDay;三句,减少了代码的冗长繁琐,并且可以直观的看出Manager和Employee之间的继承关系。
直接将代码复制到Manager构造函数中,对setSalary函数需要重新书写浪费代码的空间。
4、Object类
4.1 编写一个Fruit类及属性String name,如没有extends自任何类。使用System.out.println(new Fruit());是调用Fruit的什么方法呢?该方法的代码是从哪来的?尝试分析这些代码实现了什么功能?
运行结果如上,调用了Object的toString类,因为所有的类都是默认继承自Object类,toString实现了该对象的字符串,equal比较对象是否是相同的引用,clone实现复制该对象。
4.2 如果为Fruit类添加了toString()方法,那么使用System.out.println(new Fruit());调用了新增的toString方法。那么其父类中的的代码就没有了吗?如果同时想要复用其父类的toString方法,要怎么操作?(使用代码演示)
这是添加了toString()方法,父类的toString方法还在,只是被覆盖了,创建该对象时调用的是对象里的toString().
这是复用父类的toString(),只需要用到super关键字就可以:
4.3 Fruit类还继承了Object类的eqauls方法。尝试分析其功能?自己编写一个equals方法覆盖父类的相应方法,功能为当两个Fruit对象name相同时(忽略大小写),那么返回true。(使用代码证明你自己覆盖的eqauls方法是正确的)
Object-eqauls:用于比较两个对象的地址值是否相同,值相等或所属一个对象返回true,另一个对象就返回false.
覆盖的equal方法及运行结果如下:
4.4 在4.3的基础上使用ArrayList
测试代码如下:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
由上源代码可看出contains的实现是调用了indexOf这个函数,通过查找是否含有该元素返回true or false.
5、代码阅读:PersonTest.java(abstract、多态)
5.1 画出类的继承关系
5.2 读懂main函数,将自己推测的出代码运行结果与真正运行结果进行比较。尝试分析原因
运行结果如下:
原因分析:
推测运行结果应该是按年龄排序输出,原因是四个成员对象都继承了person这个抽象类,有其共同的属性和方法,新建指向对象时自动调用了person类的构造函数并打印。
5.3 子类中里面使用了super构造函数,作用是什么?如果将子类中的super构造函数去掉,行不行?
作用是调用子类所继承的父类的函数,不行,去掉了会出现编译错误,因为子类中没有编写构造函数,去掉之后缺乏完整性。
5.4 PersonTest.java中的代码哪里体现了多态?你觉得多态有什么好处?多态和继承有什么关系吗?
1、子类的构造函数中用super调用父类的构造函数;
2、多态可以防止出现多次重复的代码,如果没有多态性,若继承父类的子类有多个,则每个子类都要编写重复的代码,这样就显得冗余;
3、有关系,没有继承就没有多态,子类要先继承于父类才能调用父类的属性及方法。
3. 码云代码提交记录
4. PTA实验总结
1、使用继承需要些extends,不能写在同一个类里面就默认是继承了;
2、如何创建一个数组可以存放不同类型的对象可以用object型,因为所有类都默认继承于object。object真强大。
3、码云最近总是提交不上去,只能手动上传文件。
4、函数第二题
一定根据题目粘贴代码
5、不能用new创建抽象派的实例。