1. 本周学习总结

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

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

本周除了继承,我们还重点学习了多态。

(1)多态性在于有相同的形态,却是不同的行为或者说是不同的定义。即相同的方法名,不同的实现。对于多态性来说,重要的是父类类型变量可以引用子类对象。

(2)多态的 instanceof 运算符:instanceof在程序中的作用,一般是通过 instanceof 就可以判断父类引用所引用的对象实例的实际类型。

(3)因为只能在继承层次内使用 cast 进行类型转换,如果随意强制类型转换,有可能会出现运行时错误,产生一个 ClassCastException 异常。所以在进行强制类型转换时,我们应该先使用 instanceof 进行判断,是否可以进行强制转换。

2. 书面作业

1. 注释的应用

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

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

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

首先:使用https://www.taobao.com/打开淘宝

然后:使用登入名和密码,登入自己的淘宝账号

之后:登入账号后,想到自己的早餐已经吃得差不多了,就想要购买早餐。于是在搜索框中输入“早餐”。

再之后:找到了自己想要的早餐,点击进入商品页面,选择好商品的数量,口味,进入购物车。

然后:打开购物车页面,发现想要买两箱,就在页面中的数量一栏增加数量。

然后:在购物车页面的最下方点击结算按钮,进入结算页面。

最后:提交订单,使用银行卡或者支付宝进行结算,这次购物就完成了。

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

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

PS:2.2和2.3结合起来更简便,不用打两遍的文字,所以一起写了。

在这个故事中可能包含了这些类:

(1)用于存放用户的登入名,密码的User类;

class User{
private String name;
private String code;
}

(2)用于存放所有商品信息的Goods类;

class Goods{
private String name;
private int id;
private double price;
private String type;
}

(3)用于存放搜索信息的Search类;

class Search{
private String Keyname;
private int Keyid;
private String Keytype; public Search(){}
if(Goods.name.equals(Keyname))
System.out.println(Goods);
else if(Goods.id.equals(Keyid))
System.out.println(Goods);
else if(Goods.type.equals(Keytype))
System.out.println(Goods);
else
System.out.println("Sorry");
}

(4)用于存放自己选中的商品信息的ShoppingCart类;

class ShoppingCart{
private String name;
private int id;
private int num;
private double price; public ShoppingCart{} public add(){
/*
*代码省略
*/
}
public delete(){
/*
*代码省略
*/
}
public pay{
double sum;
sum+=Goods.price;
}
}

(5)调用所有类和方法的主函数的Main类;

package keke;

public class Main {
public static void main(String[] args) {
/*
*代码省略
*/
}
}

(6)用于输出或者说是显示的自己购物车信息,自己的个人信息的Menu类。

class Menu{
public ShoppingCartout(){
System.out.println(ShoppingCart.name,ShoppingCart.id,ShoppingCart.num,ShoppingCart.price);
}
public Userout(){
System.out.println(User.name);
}
}

思维导图:

3. ManagerTest.zip代码分析

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

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

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 String getName()
{
return name;
} public double getSalary()
{
return salary;
} public Date getHireDay()
{
return hireDay;
} public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
} private String name;
private double salary;
private Date hireDay;
} class Manager extends Employee //Manager类中出现了关键字extends,即继承父类Employee,为子类。
{
/**
* @param n the employee's name
* @param s the salary
* @param year the hire year
* @param month the hire month
* @param day the hire day
*/
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;
} public void setBonus(double b)
{
bonus = b;
} private double bonus;
}

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

因为如果Employee类及其子类Manager都有getSalary方法,即子类会覆盖或者隐藏了父类中的同名方法,这时候我们就要使用super()语句才能在子类中调用父类的同名方法,近似可以认为带有super()语句的方法就是父类的方法。所以我们可以用super()语句来区分两个同名方法。

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

根据具体的代码来看,在代码的开始分别将staff[0]定义为为Manager类的boss;而将staff[1] 和 staff[2] 定义为Employee类。所以在执行后面的代码时需要根据staff类的不同而调用不同的方法,或者说是调用父类还是子类的方法。在本段代码中,因为staff[0]是Manager类的,所以调用Manager类的getSalary方法。又因为staff[1] 和 staff[2] 定义为Employee类,所以调用Employee类的getSalary方法。

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

(1)我认为这样可以减少代码的编写,节省时间,毕竟同样的代码不需要再写一遍了。

(2)因为虽然这样更直观,但是也更浪费时间,浪费内存,明明可以简便的事情就不需要额外增加其他事了。毕竟,这样不仅浪费打代码的人的时间,同样也增加了阅读代码的时间。

4. Object类

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

System.out.println(new Fruit());因为如果在Java中直接输出一个类的对象的时候,则是会调用这个类的toString()方法,但是因为在这个代码中没有自己写的toString()方法,所以System.out.println(new Fruit());就是继承Object类的toString()方法,Object中toString()方法的实现是这样的:getClass().getName() + "@" + Integer.toHexString(hashCode())。就会输出本题的运行结果:类名+@+这个类的哈希码值。

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

(1)为Fruit类添加了toString()方法后:

(2)其父类中的toString方法的代码并不会没有,在子类中新增toString方法不会影响父类中的toString方法。

(3)因为就我们所知的调用父类的方法一般是使用super()语句。所以可以使用super()语句复用其父类的toString方法。

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

(1)Object类的eqauls方法:主要认为是两个对象进行比较是否相同,根据是否相同输出true or false。

(2)

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

(1)

(2)

通过查看ArrayList的contatins方法的源代码,不难发现在contains方法会调用 o.equals(elementData[i])方法,其中elementData[i]是个object类的实例,即contains的方法其实就是调用equals()方法。

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

5.1 画出类的继承关系

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

因为对Person类来说,它是抽象类型,不能实例化,所以只需要考虑代码中的Student类,Employee类,Manager类和Programmer类的toString()方法,然后用super关键字来调用父类Person类的toString()方法,最后得出运行结果。

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

(1)作用是为了能够调用或者是继承父类的方法和属性。

(2)不能,因为如果去掉的话就不能继承父类中的方法和属性了,这样的话,一旦在子类只能继承的是默认值,即需要重新初始化。

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

(1)因为多态是相同的方法名,不同的实现。所以可以明显看出是代码中的toString()方法。

(2)多态的好处在于可以增强程序的可扩展性及可维护性,使代码更加简洁。同时不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。

(3)继承:子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。

多态:子类重写父类的方法,使子类具有不同的方法实现。

3. 码云代码提交记录

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

4. PTA实验

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

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

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

  • 对于4-1:使用toString()语句就行了。
  • 对于4-2:使用equals()语句来比较,并使用if语句来实现不同的输入形式,并创建对象。输出时使用for语句进行倒序输出。
  • 对于4-3:使用DecimalFormat df=new DecimalFormat("#.##");保留位数。同样使用equals()语句。
  • 对于5-4:主要和前面的函数差不多,只是需要使用extends关键字进行继承父类。同样也使用了equals()语句。
  • 对于5-5:使用了for循环来使不相等的输入才能输进对对象中,同样也使用了equals()语句。使用了toString()语句进行输出。
  • 对于5-6:使用了extends关键字进行继承父类,同样在子类中使用super()语句继承父类中的方法和属性。还是用了for(Person itor:personList)进行遍历,以及contains()语句。

201521123006 《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. python中的赋值和深浅拷贝

    python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 . 此时当B对象里面的内容发生更改的时候,A对象也自然而然的 ...

  2. UIButton 中高亮取消

    1.图片 取消高亮方法 a.第一种方法 [withdrawalBtn setAdjustsImageWhenHighlighted:NO]; b.第二种方法 [withdrawalBtn setIma ...

  3. Ubuntu 16.04 + CUDA 8.0 + cuDNN v5.1 + TensorFlow(GPU support)安装配置详解

    随着图像识别和深度学习领域的迅猛发展,GPU时代即将来临.由于GPU处理深度学习算法的高效性,使得配置一台搭载有GPU的服务器变得尤为必要. 本文主要介绍在Ubuntu 16.04环境下如何配置Ten ...

  4. eclipse中配置spring环境

    初识Spring框架 1.简单使用 eclipse中配置Spring环境,如果是初学的话,只需要在eclipse中引入几个jar包就可以用了, 在普通java project项目目录下,建一个lib文 ...

  5. 【LeetCode】数组-6(561)-Array Partition I(比较抽象的题目)

    题目描述:两句话发人深思啊.... Given an array of 2n integers, your task is to group these integers into n pairs o ...

  6. Markdown学习笔记(一) 基本的Markdown标签

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人用它写 ...

  7. C#多线程的用法1-简单示例

    写在前面:阅读本系列文章即表示你已经知道什么是线程等理论知识,现在正想了解如何正确的使用线程进行编程工作. /// <summary> /// 单线程工作示例 /// </summa ...

  8. 解析SS、SP、BP寄存器

    SS, SP, BP 三个寄存器 SS:存放栈的段地址: SP:堆栈寄存器SP(stack pointer)存放栈的偏移地址; BP: 基数指针寄存器BP(base pointer)是一个寄存器,它的 ...

  9. win10下vagrant+centos7 rails虚拟开发机配置流程

    此文写于2017.8.21 在写本文前,笔者已经尝试了多种其他的替代方法,例如wmware虚拟机安装kylin.然而发现总是还有各种问题.经大佬指点安装了virtualbox + vagrant.于是 ...

  10. Ransom Note(383)

    题目:Given an arbitrary ransom note string and another string containing letters from all the magazine ...