第4周作业-面向对象设计与继承

1. 本周学习总结

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

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

总结:

(1)学会了如何给类和方法进行简单的注释;

(2)学会如何设计一个类,并应用到生活中(简单应用);

(3)了解类的继承,及其基本语法extends关键字,还有super关键字调用父类方法;

(4)了解多态性,具体在下5.4有详细介绍;

2. 书面作业

1.注释的应用

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

answer:

类的注释(我对上周的Person类进行了简单的注释):



方法的注释(对第二周Fibonacci数列进行了简单的注释):

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

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

answer:

首先,我将通过www.taobao.com这个网址进入某宝



之后进行手机扫码登陆



比如我近期想买一个电动牙刷,我就在上面的搜索栏进行搜索



然后我找到了我想要的物品,选好样式、数量等参数后,我将其加入了我的购物车





加入购物车以后,将自己想要买的物品勾选,之后点击结算,然后就可以通过银行卡,支付宝的平台进行付款,一个简单完整的网上购物过程大概就是这个样子。

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

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

answer:

1.首先,我认为该有个LoginUser类,用来登陆

public class LoginUsers {
private String userName;
private String code;
private String verificantionCode;
/*
* also can add some other personal information;
*/
} 2.然后会出现一个menu类,用来显示商品,显示自己的购物车,显示自己搜索到的东西等等... public class Menu {
private void showShoppingcart(){ }
private void showSearcher() { }
private void showGoods(){ }
/*
* and so on....Limited by my ability
*/
} 3.Storage类,用来存放所有商品的信息 public class Storage {
/*
* to save all the Goods'information
*/
} 4.Searcher类,根据输入的keyWord来搜索仓库里所有包含keyWord的商品 public class Searcher {
private String keyWord;
void search();
if(Goods.name.equals(keyWord))
System.out. System.out.println(Goods);//print on the menu;
} 5.Goods类,商品的信息参数。 public class Goods {
private String name;
private String price;
private String type;
/*
* also can add other parameter
*/
} 6.Shoppingcart类,用来保存想要结算的商品,有add(添加),delete(删除),pay(结算)等方法。 public class Shoppingcart {
/*
* 参考某人
*/
class Item {
private Goods goods;
private int num;
}//
private void add(){ }
private void delete(){ }
private void pay(){
int total = goods.price * goods.num;
/*
* when paying is done,clear the Goods
*/
}
} 而思维导图。。。我只能说自己尽力了。。。做的这么粗糙不好意思。。。

参考资料:

UML类图

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

3.ManagerTest.zip代码分析

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

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

answer:

class Employee
{//Employee类,为父类 public Employee(String n, double s, int year, int month, int day)
{
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
hireDay = calendar.getTime();
}
public double getSalary()
{
return salary;
} class Manager extends Employee
{//Manager类,并且出现了extends继承关键字,为子类 public Manager(String n, double s, int year, int month, int day)
{
super(n, s, year, month, day);//这里使用了super关键字,调用父类方法的初始化;
bonus = 0;
} public double getSalary()
{
double baseSalary = super.getSalary();//这里又出现了super关键字,调用父类getSalary()方法;
return baseSalary + bonus;
}

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

answer:

- 如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
- 如果子类被当作父类使用,则通过子类访问的字段是父类的! 所以我认为,除了系统编译器自行区分,就可以用super关键字来区分父类与子类的同名方法。 网络上还看到这样一句话,我就暂且记住吧:
牢记:
* 在实际开发中,要避免在子类中定义与父类同名 的字段。不要自找麻烦!

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

answer:

首先,我们要结合整段代码来看,截图中第一行,定义出了一个Manager类的boss变量,接着下来两行,又定义了一个Employee类的staff数组,然后关键点来了,它令staff[0]为Manager类的boss,staff[1]和staff[2]为Employee类,所以由此来看,这个for循环当中的e.getSalary(),应该要根据当时e的类型来定,由以下运行结果也可得出结论。

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

answer:

(1)我认为直接使用super调用节省了很多打相同代码的时间;
(2)相关代码复制虽然直观,但是使用super()帮助子类进行初始化,不仅减少了代码输入量,而且减少了读代码人的阅读困难,既然大家都知道super()在继承中的用法,就更没有必要去做复制相关代码这种行为。

4.Object类

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

answer:

首先让我们来看看代码



及其运行结果

通过百度,我查到直接输出某个对象的时候,会直接调用toString()方法,所以我通过查看println()的源代码,最终查到了toString()方法的所在



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

answer:

父类中的toString()方法当然还存在着,操作如下图之后的下图

首先贴出在Fruit类中添加的toString()方法

运行结果:

如图可知,新写的toString()方法覆盖了原来的方法,接着贴出同时使用父类的toString()方法的代码:

运行结果:

如图可知,使用super关键字可以调用父类的toString()方法。

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

answer:

首先,我查看了Object类中equals()方法的源代码,如图:

可以发现,就是拿一个与另一个作比较,然后最终返回true or false

接着我又查看了JDK Documentation,具体的我也不解释了,就如图吧:

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

5.1 画出类的继承关系

answer:

如图

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

answer:

运行结果如图:

首先,Person类是一个抽象类,无法实例化对象,因此只需分析Student类,Employee类,Manager类和Programmer类的toString()方法,可以发现其实也就是按部就班的输出成员变量,然后再利用super关键字调用父类Person类的toString()方法,得出运行结果,而Manager类和Programmer类继承Employee类,Employee类继承Person类,因此有两层toString()输出。

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

answer:

(1)作用:调用父类的构造器;
(2)不行,去掉后编译器会调用父类无参构造器,而PersonTest.java中没有无参构造器,会出现编译出错的情况。

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

answer:

首先,我们来看看ppt上对多态的定义

而在PersonTest.java中,出现了以上两点情况,最明显的就是toString()方法,每个类的toString()方法都有不同的实现(如5.2代码运行结果所示),并且父类类型变量都可引用子类对象,如

(本题答案来源于网络)
(1)多态的好处:
     - 可替换性。多态对已存在的代码具有可替换性。
     - 可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际 上新加子类更容易获得多态功能。  
     - 接口性。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。  
     - 灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。  
     - 简化性。多态简化了对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。值得注意的是,多态并不能够解决提高执行速度的问题,因为它基于动态装载和地址引用,或称动态绑定。 (2)多态与继承的关系:
- 继承:子类继承父类中所以的属性和方法,但是对于private的属相和方法,由于这个是父类的隐私,所以子类虽然是继承了,但是没有可以访问这些属性和方法的引用,所以相当于没有继承到。很多时候,可以理解为,没有继承。
- 多态:就是父类引用可以持有子类对象。这时候只能调用父类中的方法,而子类中特有方法是无法访问的,因为这个时候(编译时)你把他看作父类对象的原因,但是到了运行的时候,编译器就会发现这个父类引用中原来是一个子类的对像,所以如果父类和子类中有相同的方法时,调用的会是子类中的方法,而不是父类的。
可以这么说:编译时看父类,运行时看子类。

3. 码云代码提交记录

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

4. PTA实验

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

    函数(4-1, 4-2, 4-3)

    编程(5-4, 5-5, 5-6, 5-7(选做))
  • 一定要有实验总结

answer:

4-1:直接使用super调用父类方法;

4-2:首先创建n个Object类数组,再根据题目要求,依次创建Computer类,Double类,Integer类,String类的实例化对象,接着倒序输出就行了;

4-3:这题要求覆盖Employee类的equals方法,其中先要判断二者是否相同,是的话直接返回true,不同的话,比较父类属性,若不同直接返回false。若相同,则比较二者的类是否相同,不同直接false。接着还要比较company和salary。company要考虑null的情况,salary要使用DecimalFormat。

4-4:

5-4:这题是在5-3的基础上加入了继承的思想。首先要定义一个抽象(abstract)的Shape类,让Rectangle与Circle继承自Shape类,然后再在主类中添加上sumAllArea和sumAllPerimeter方法。

5-5:这题就按照题目要求一步一步在PersonOverride类中编写各种构造函数,最后出了点小问题,“使用System.out.println(Arrays.toString(PersonOverride.class.getConstructors()));输出PersonOverride的所有构造函数。”这一块发现在class类中构造函数的顺序也会有影响Accept的情况,因此构造函数的顺序要依输出样例来定。

5-6:

201521123084 《Java程序设计》第4周学习总结的更多相关文章

  1. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  9. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  10. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. CentOS Linux 系统 安装oracle 11g

    CentOS Linux 系统 安装oracle 11g 在Linux系统上安装oracle是比较麻烦,需要配置各种变量啥的,o(︶︿︶)o ,但是没办法,有些东西你总的去接触,而且接触理解的越早越深 ...

  2. 微信小程序(有始有终,全部代码)开发--- 新增模块: 图片选取以及拍照功能

    开篇语 前几天发了一篇: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 后来又发了BUG修复的版本: 简年18: 微信小程序(有始有终,全部代码)开发 ...

  3. Sybase数据库的连接,JNDI配置,Hibernate配置

    最近的一个项目就是移植老项目的代码,有一个模块用的是Sybase数据库,我表示从来没接触过,更不用说怎么用了.再者这东西都是几乎被淘汰的东西了,而且网上搜到的东西简直了,全是复制粘贴的. 一.使用工具 ...

  4. 【NO.6】HTTP请求-配置-POST请求-GET请求

    直接举例来说 :) 例1:URL里面有”&”连接的情况 http://123.456.7.89:8080/aa/bb/cc/?userid=abcd@gmail.com&operati ...

  5. Lucene搜索引擎+HDFS+MR完成垂直搜索

    介于上一篇的java实现网络爬虫基础之上,这一篇的思想是将网络收集的数据保存到HDFS和数据库(Mysql)中:然后用MR对HDFS的数据进行索引处理,处理成倒排索引:搜索时先用HDFS建立好的索引来 ...

  6. InnoDB: ERROR: the age of the last checkpoint

    --InnoDB: ERROR: the age of the last checkpoint ---------------------------------------------------- ...

  7. C/C++ 知识点---存储区

    C/C++ 知识点---存储区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储 ...

  8. 详实的SQL学习笔记

    写在前面:最近在上海找工作,前前后后面试了N家单位,发现各个公司对程序员的数据库知识尤其是SQL语句的掌握程度有很高的要求,作为一名光荣的程序员,不会玩儿SQL语句走在街上根本不好意思和人打招呼!好了 ...

  9. PHP高并发

    首先,确认服务器硬件是否足够支持当前的流量 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻底 ...

  10. Java中几种常量池的区分

    转载自:https://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的内存分配中,经常听到很多关于常量 ...