201521123005《java程序设计》第四周学习总结

1. 本周学习总结

1.1 尝试使用思维导图总结有关继承的知识点。

201521123005《java程序设计》第四周学习总结

1.2 使用常规方法总结其他上课内容。

·继承(是什么,意义)

-父类(被继承的类)

-子类(继承父类)

-多态(解决重复代码的问题)

-覆盖(覆盖父类的方法,但父类的方法还在)

2. 书面作业

Q1注释的应用

使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看。(截图)

(1)类的注释

201521123005《java程序设计》第四周学习总结

201521123005《java程序设计》第四周学习总结

(2)方法的注释

201521123005《java程序设计》第四周学习总结

201521123005《java程序设计》第四周学习总结

Q2面向对象设计(大作业1,非常重要)

2.1 将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事。(不得少于50字)

今天突然想到数字逻辑老师推荐我们看《数学之美》这本书。我就想网上买会不会有比较便宜。我就打开淘宝,搜索“数学之美”.

201521123005《java程序设计》第四周学习总结

发现里面有很多店家有在卖我直接选老师给我们看过封面的,然后加入购物车。

201521123005《java程序设计》第四周学习总结

201521123005《java程序设计》第四周学习总结

我就问舍友要不要一起买,她们说要。我就点开购物车,点编辑,把《数学之美》的数量变成4本,然后点完成。

201521123005《java程序设计》第四周学习总结

我勾选《数学之美》这个商品,然后点结算。

201521123005《java程序设计》第四周学习总结

最后我提交订单。

201521123005《java程序设计》第四周学习总结

2.2 通过这个故事我们能发现谁在用这个系统,系统中包含的类及其属性方法,类与类之间的关系。尝试找到这些类与属性,并使用思维导图描述类、属性、方法及类与类之

间的关系。

    我即消费者在用这个系统。系统中包含的类:商品,书,购物车,用户。商品的属性:价格,数量,店家,商品名,生产地;方法有获得添加价格,数量,店家,商品名,生产地,快递费。书的属性:编码;方法有获得添加书的编码。购物车的方法有结算。

201521123005《java程序设计》第四周学习总结

2.3 尝试使用Java代码实现故事中描述的这一过程(不必很完善),将来要在这个基础上逐渐完善、扩展成一个完整的面向对象的系统。(可选:加分)

参考资料:

UML类图

面向对象案例-借款者姓名地址.zip

Q3ManagerTest.zip代码分析

分析ManagerTest.zip中的代码,回答几个问题:

3.1 在本例中哪里体现了使用继承实现代码复用?回答时要具体到哪个方法、哪个属性。

201521123005《java程序设计》第四周学习总结

201521123005《java程序设计》第四周学习总结

    答:Manager 继承 Employee。Employee类的属性name,salary,hireDay和方法.getName(),.getSalary()通过super实现代码复用

3.2 Employee类及其子类Manager都有getSalary方法,那怎么区分这两个方法呢?

    答:一般方法是通过参数的不同来区分。如果子类与父类有相同的字段,则子类中的方法会覆盖父类的方法。
如果要调用超类Employee中的getSalary方法,而不是当前类的getSalary,必须使用super关键字来解决这个问题

3.3 文件第26行e.getSalary(),到底是调用Manager类的getSalary方法还是Employee类的getSalary方法。

201521123005《java程序设计》第四周学习总结

    答:首先截图中的这段代码定义出了一个Manager类的boss变量,又定义了一个Employee类的staff数组,然后令staff[0]为Manager类的boss,staff[1]和staff[2]为
Employee类,接下来用for循环来实现e.getSalary(),所以调用Manager类的getSalary方法还是Employee类的getSalary方法是根据e的类型来定,由以下运行结果的截图
也可得出结论。

201521123005《java程序设计》第四周学习总结

3.4 Manager类的构造函数使用super调用父类的构造函数实现了代码复用,你觉得这样的有什么好处?为什么不把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,这样看起来不是更直观吗?

    答:(1)直接使用super调用节省了很多打相同代码的时间,而且代码不会看起来很乱。
(2)把父类构造函数中的相关代码复制粘贴到Manager的构造函数中虽然直观,但是多了很多麻烦。使用super()可以使子类进行初始化,不仅减少了代码输入量,
而且减少了读代码人的阅读困难,而且对于程序员都知道super()在继承中的用法,就更没有必要去做复制相关代码这种行为。

Q4Object类

4.1 编写一个Fruit类及属性String name,如没有extends自任何类。使用System.out.println(new Fruit());是调用Fruit的什么方法呢?该方法的代码是从哪来的?尝试分析这些代码实现了什么功能?

201521123005《java程序设计》第四周学习总结

运行结果

201521123005《java程序设计》第四周学习总结

    从运行结果来看,该方法是来自object,尝试一下看源代码。可以进一步知道方法所在。

201521123005《java程序设计》第四周学习总结

201521123005《java程序设计》第四周学习总结

    从方法注释Prints an Object and then terminate the line.  This method calls at first String.valueOf(x) to get the printed object's string value。
Returns the string representation of the {@code Object} argument.知道其功能为打印对象,然后终止该行。此方法调用在第一个字符串值(x)得到印刷对象的字
符串值,返回{对象}参数的字符串表示形式

4.2 如果为Fruit类添加了toString()方法,那么使用System.out.println(new Fruit());调用了新增的toString方法。那么其父类中的toString方法的代码就没有了吗?如果同时想要复用其父类的toString方法,要怎么操作?(使用代码演示)

调用了新增的toString方法

201521123005《java程序设计》第四周学习总结

运行结果

201521123005《java程序设计》第四周学习总结

调用了其父类中的toString方法

201521123005《java程序设计》第四周学习总结

运行结果

201521123005《java程序设计》第四周学习总结

    从调用了其父类中的toString方法得到的运行结果来看其父类中的toString方法的代码还在,而且使用super关键字就可以调用父类的toString()方法。

4.3 Fruit类还继承了Object类的eqauls方法。尝试分析其功能?自己编写一个equals方法覆盖父类的相应方法,功能为当两个Fruit对象name相同时(忽略大小写),那么返回true。(使用代码证明你自己覆盖的eqauls方法是正确的)

Object类的eqauls方法

public boolean equals(Object obj) {

return (this == obj);

}

功能:

201521123005《java程序设计》第四周学习总结

编写一个equals方法覆盖父类的相应方法,功能为当两个Fruit对象name相同时(忽略大小写),那么返回true

package some;

class Fruit
{
String name;
@Override
public String toString() {
return "Fruit [name=" + name + "]"+" "+super.toString();
} public Fruit(String name) {
super();
this.name = name;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Fruit other = (Fruit) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equalsIgnoreCase(other.name))
return false;
return true;
} } public class Main {
public static void main(String[] args)
{
Fruit A = new Fruit("It's A Fruit");
Fruit B = new Fruit("It's A fruit");
System.out.println(A.equals(A));
System.out.println(A.equals(B));
}
}

运行结果:

201521123005《java程序设计》第四周学习总结

4.4 在4.3的基础上使用ArrayList fruitList存储多个fruit,要求如果fruitList中已有的fruit就不再添加,没有的就添加进去。请编写相关测试代码。并分析ArrayList的contatins方法是如何实现其功能的?

201521123005《java程序设计》第四周学习总结

运行结果:

201521123005《java程序设计》第四周学习总结

从运行结果来看代码写的是对的

分析ArrayList的contatins方法的功能

201521123005《java程序设计》第四周学习总结

201521123005《java程序设计》第四周学习总结

从源代码可知,其实它就是把数组遍历一遍,找一下有没有相同的,如果有就不加,如果没有就加

Q5代码阅读:PersonTest.java(abstract、多态)

5.1 画出类的继承关系

201521123005《java程序设计》第四周学习总结

5.2 读懂main函数,将自己推测的出代码运行结果与真正运行结果进行比较。尝试分析原因

运行结果:

201521123005《java程序设计》第四周学习总结

    分析:首先Person类是一个抽象类,所以不存在可以实例化对象不进行分析。
其次可以看到Employee、Student、Manager和Programmer这四个类的toString()方法,具有相同的格式,然后调用父类的同名方法。
而对于Manager和Programmer这两个类,因为他们的父类Employee类也是继承Person类,所以他们会有两层嵌套。

5.3 子类中里面使用了super构造函数,作用是什么?如果将子类中的super构造函数去掉,行不行?

   答:子类中里面使用了super构造函数,可以从子类中调用父类的构造方法,引用当前对象的直接父类中的成员;
如果将子类中的super构造函数去掉是不行的。如果去掉编译不通过,因为调用super()必须写在子类构造方法的第一行。每个子类构造方法的第一条语句,都是隐含地
调用super(),如果父类没有这种形式的构造函数,而PersonTest.java中没有无参构造器,那么在编译的时候就会报错。

5.4 PersonTest.java中的代码哪里体现了多态?你觉得多态有什么好处?多态和继承有什么关系吗?

多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”

201521123005《java程序设计》第四周学习总结

    (1)在PersonTest.java中,在toString()方法体现了多态,每个类的toString()方法都有不同的实现,并且父类类型变量都可引用子类对象

201521123005《java程序设计》第四周学习总结

    (2)多态的好处:

    1.可替换性。多态对已存在的代码具有可替换性。

    2.可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际 上新加子类更容易获得多态功能。  

    3.接口性。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。  

    4.灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。  

    5.简化性。多态简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。值得注意的是,多态并不能够解决提高执行
速度的问题,因为它基于动态装载和地址引用,或称动态绑定 (3)多态和继承的关系:
a.继承是多态的基础,没有继承,跟本谈不上多态.
b.多态体现在继承上的,方法的修饰
c.多态性、继承直接影响了类型转换
d.继承:子类继承父类中所以的属性和方法,但是对于private的属相和方法,由于这个是父类的隐私,所以子类虽然是继承了,但是没有可以访问这些属性和方法的引
用,所以相当于没有继承到。很多时候,可以理解为,没有继承。
e.多态:就是父类引用可以持有子类对象。这时候只能调用父类中的方法,而子类中特有方法是无法访问的,因为这个时候(编译时)你把他看作父类对象的原因,但
是到了运行的时候,编译器就会发现这个父类引用中原来是一个子类的对像,所以如果父类和子类中有相同的方法时,调用的会是子类中的方法,而不是父类的。

参考文件:PersonTest.java

3. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

201521123005《java程序设计》第四周学习总结

4. PTA实验

题目集:jmu-Java-03-面向对象1-基础-封装继承 中的

函数(4-1, 4-2, 4-3,4-4较难选做)

编程(5-4, 5-5, 5-6)

5-4:在上周的5-3实验中,Rectangle类、Circle类中都写了各自的计算周长和面积的方法,最后再Main类里逐一使用,显得比较繁琐,这周学习了抽象类,通过继承的关
系来实现代码的复用。Shape类中集中了子类共同的方法public double getPerimeter(),public double getArea())。
但是还是有不少问题,在写代码的时候遇到了一些问题。

201521123005《java程序设计》第四周学习总结

查了一下报错的原因是参数错误,然后一直找都不知道哪里错。后来看一下输入的参数又没错。然后发现

201521123005《java程序设计》第四周学习总结

我定义的参数是double型的虽然我在写的时候没有报错,但是实际参数类型错误了。

5-5:equals方法需要比较name、age、gender使用了方法覆盖。子类重新定义了equals方法。
ArrayList的contains方法在上面的作业有提到
5-6:调用父类的构造函数时,用super()来调用Employee的构造函数,要在子类的构造函数的第一行。
上一篇:我的Python成长之路---第四天---Python基础(16)---2016年1月23日(寒风刺骨)


下一篇:Koa -- 基于 Node.js 平台的下一代 web 开发框架 koa.bootcss.com