201521123074 《Java程序设计》第4周学习总结
1、本周学习总结
这次用XMind画的图,果然比百度脑图好用一点。
2、书面作业
Q1、注释的应用
使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看。(截图)
- 类注释
- 方法注释
**Q2.面向对象设计(大作业1,非常重要) 2.1 将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事。(不得少于50字,参考QQ群中PPT的范例) 2.2 通过这个故事我们能发现谁在用这个系统,系统中包含的类及其属性方法,类与类之间的关系。尝试找到这些类与属性,并使用思维导图描述类、属性、方法及类与类之间的关系。**
- 比方说想要在淘宝上买一条裙子吧。首先打开淘宝网。先随便看看淘宝广告上的优惠打折新品什么的,后来进入正题,在搜索栏输入
裙子
,会跳出各种各种裙:连衣裙、长裙、半身裙。。就索性直接打开裙子这一大类,然后就有各种分类:品牌、裙长、选购热点。。。还会有相关引索:是不是想找花裙子、修身打底裙子。。往下开始看商品的时候又可以进行排序搜索:按照人气、销量、信用、价格。。。点开自己比较喜欢的裙子,旁边就会展示这条裙子的各种详细信息:价格、运费、尺码、颜色。。。比较重要的还有商品评价。然后终于开开心心添加了很多裙子进购物车,进入购物车查看,就有很多商品在里面了,购物车里也会显示商品的主要信息,价格是最主要的,然后再购物车里进行各种操作,删除、添加、合计之后就结算付款输入自己的收获信息即算在淘宝上完成一次购物了。
- 是购买者在用这个系统。
Q3.ManagerTest.zip代码分析
分析ManagerTest.zip中的代码,回答几个问题:
3.1 在本例中哪里体现了使用继承实现代码复用?回答时要具体到哪个方法、哪个属性。
3.2 Employee
类及其子类Manager
都有getSalary方法,那怎么区分这两个方法呢?
3.3 文件第26行e.getSalary()
,到底是调用Manager类的getSalary方法还是Employee类的getSalary方法。
3.4 Manager
类的构造函数使用super调用父类的构造函数实现了代码复用,你觉得这样的有什么好处?为什么不把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,这样看起来不是更直观吗?
- 首先明白代码复用的含义:子类继承父类,则子类无需无需重新编写相同的代码。
- 如何区分:两个方法虽然名称相同,但是具体实现却不相同,Manager类对getSalary方法进行了重写。子类中可以重新定义父类中已有的方法,从而体现出子类自己的行为。
//Manager类的getSalary方法
public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
//Employee类中的getSalary方法
public double getSalary()
{
return salary;
}
- JVM根据调用该方法的实际对象的类型来决定选择调用哪个方法。
如图所示,staff【0】是调用的Manager类的getSalary方法,有额外的bonus。
staff【1】、staff【2】都是调用Employee类的getSalary方法,纯工资无bonus。- 好处:最直接的就是可以少写代码呀,很棒的。直接复制粘贴的话,直观是直观了,但是会是代码变得很冗长,本来可以化繁为简的达到统一目的,不必再多此一举重新粘贴重复的代码。所谓大道至简嘛。
**Q4.Object类 4.1 编写一个`Fruit`类及属性`String name`,如没有extends任何类。使用`System.out.println(new Fruit())`;是调用Fruit的什么方法呢?该方法的代码是从哪来的?尝试分析这些代码实现了什么功能? 4.2 如果为`Fruit`类添加了`toString()`方法,那么使用`System.out.println(new Fruit())`;调用了新增的toString方法。那么其父类中的toString方法的代码就没有了吗?如果同时想要复用其父类的toString方法,要怎么操作?(使用代码演示) 4.3 Fruit类还继承了`Object`类的`eqauls`方法。尝试分析其功能?自己编写一个equals方法覆盖父类的相应方法,功能为当两个Fruit对象name相同时(忽略大小写),那么返回`true`。(使用代码证明你自己覆盖的eqauls方法是正确的) 4.4 在4.3的基础上使用`ArrayList
> - 在Eclipse上操作一下。如图 ![](http://images2015.cnblogs.com/blog/1109847/201703/1109847-20170318131512276-1771288137.png) ![](http://images2015.cnblogs.com/blog/1109847/201703/1109847-20170318131522901-1516814596.png) ![](http://images2015.cnblogs.com/blog/1109847/201703/1109847-20170318131531291-268679474.png) ![](http://images2015.cnblogs.com/blog/1109847/201703/1109847-20170318132224370-2020127645.png) 可知`System.out.println(new Fruit())`是调用了`Fruit`的`toString()`方法。该方法的代码是从`Object.class`中来的。实现了将对象表现输出的功能。
>- 父类的toString()不会消失。代码实现如图。 ![](http://images2015.cnblogs.com/blog/1109847/201703/1109847-20170318133944682-1485915108.png)
>- Object类的equals()方法源码如图。![](http://images2015.cnblogs.com/blog/1109847/201703/1109847-20170318140100776-1745665126.png) 功能有点像String类里的“==”,用来比较“地址”是否相同。若两个不同对象进行比较,即使内容相同,也会输出“fasle”。
class Fruit {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
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.equals(other.name))
return false;
return true;
}
}
public class lala {
public static void main(String[] args) {
Fruit a=new Fruit();
Fruit b=new Fruit();
a.setName("a");
b.setName("a");
System.out.println(a==b);
System.out.println(a.equals(b));
}
}
Q5.代码阅读:PersonTest.java(abstract、多态)
5.1 画出类的继承关系
5.2 读懂main函数,将自己推测的出代码运行结果与真正运行结果进行比较。尝试分析原因
5.3 子类中里面使用了super构造函数,作用是什么?如果将子类中的super构造函数去掉,行不行?
5.4 PersonTest.java中的代码哪里体现了多态?你觉得多态有什么好处?多态和继承有什么关系吗?
- 预计输出就是根据年龄大小排序(从小到大)输出四个对象。
输出结果:
分析:Person类是abstract修饰的,只能当爸爸。Person类在这个代码里是爸爸,Student类和Employee类是它的儿子,而Programmer类和Manager类又是Employee类的儿子,输出就是按照每个类重写的toString()方法依次输出,所以,Student类和Employee类有一层toString,Programmer类和Manager类有两层toString。
- 作用是继承父类构造函数方法,因为有些属性是重复一样的,直接继承父类就可以少写很多代码。去掉不行,因为去掉后系统会自动调用父类的无参构造函数,而此时父类没有无参构造函数,编译出错。
- 多态性:相同的形态,不同的行为(不同的定义)
-相同的方法名,不同的实现
-父类类型变量可以引用子类对象
代码体现在:每个类对toString()方法的不同实现。如:
多态的好处: 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。
多态和继承关系:继承是多态的基础,有了继承,才能有多态。
3. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
4. PTA实验
题目集:jmu-Java-03-面向对象1-基础-封装继承 中的
函数(4-1, 4-2, 4-3,4-4较难选做)
编程(5-4, 5-5, 5-6)
一定要有实验总结
- 对Employee的company属性的比较。要考虑传入为null的情况。如果company不为null且传入为null,返回false.
- 编写double sumAllArea方法输出形状数组中的面积和和double sumAllPerimeter方法输出形状数组中的周长和。需要用到多态的方法。
- 用super关键字调用父类方法时,该代码语句应该放在子类构造函数的第一行。