201521123069 《Java程序设计》 第4周学习总结
1. 本周学习总结
1.1 尝试使用思维导图总结有关继承的知识点。
1.2 使用常规方法总结其他上课内容。
(1)文档注释(类注释、方法注释、属性注释、通用注释、)
(2)多态性、instanceof运算符(判断引用的对象实例的实际类型)
(3)强制转换(基本类型和引用类型都可以使用强制转换,父类在强制转换成子类之前,最好用instanceof进行判断)
(4)抽象方法必须被重写,抽象方法只能有声明,不能有实现。
(5)控制可见性的访问修饰符:private(在本类中可见)、public(对所有类可见)、protected(对同包和所有子类可见)、默认(对本包可见,不推荐)
(6)Object类(所有类的父类):toString方法(输出对象所属的类名和散列码)、equals方法(判断两个对象是否有相同的引用)、hashCode方法
2. 书面作业
Q1.注释的应用
使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看。(截图)
Q2. 面向对象设计(大作业1,非常重要)
2.1 将在网上商城购物或者在班级博客进行学习这一过程,描述成一个故事。(不得少于50字,参考QQ群中PPT的范例)
2.2 通过这个故事我们能发现谁在用这个系统,系统中包含的类及其属性方法,类与类之间的关系。尝试找到这些类与属性,并使用思维导图描述类、属性、方法及类与类之间的关系。
2.3 尝试使用Java代码实现故事中描述的这一过程(不必很完善),将来要在这个基础上逐渐完善、扩展成一个完整的面向对象的系统。(可选:加分)
参考资料:
UML类图
面向对象案例-借款者姓名地址.zip
2.1
答:周一中午,我在食堂排队的时候接到我妈打来的电话,她让我在网上给我爸买个手机。我在纠结该买哪个牌子的手机,舍友们说华为这个牌子不错,而且挺适合男生用。于是,吃完饭回到宿舍,我就打开电脑,输入京东官网地址,登入自己的账号,在搜索栏输入华为手机,选择屏幕尺寸为5.1-5.5英寸,运行内存为3GB,机身内存为16GB,然后出现满足这些条件的华为手机,我开始查看它的评价及售后保障并对其进行筛选,比较喜欢的就将它添加到购物车,最后在购物车中选择最满意的一款,然后点击结算,填好收货地址及联系电话,然后完成支付。
2.2
2.3
商品类
class Goods {
private double price;
private int nums;
private String type;
public Goods(double price, int nums, String type) {
super();
this.price = price;
this.nums = nums;
this.type = type;
}
public double getPrice() {
return price;
}
public int getNums() {
return nums;
}
public String getType() {
return type;
}
@Override
public String toString() {
return "Goods [price=" + price + ", nums=" + nums + ", type=" + type + "]";
}
public void search(){
...
}
华为手机类
class HW_Phone extends Goods{
private double ScreenSize;
private String RAM;
private String ROM;
private String capacity;
public HW_Phone(double price, int nums, String type, double screenSize,
String rAM, String rOM, String capacity) {
super(price, nums, type);
ScreenSize = screenSize;
RAM = rAM;
ROM = rOM;
this.capacity = capacity;
}
public double getScreenSize() {
return ScreenSize;
}
public String getRAM() {
return RAM;
}
public String getROM() {
return ROM;
}
public void setROM(String rOM) {
ROM = rOM;
}
public String getCapacity() {
return capacity;
}
@Override
public String toString() {
return "HW_Phone "+super.toString()+"[ScreenSize=" + ScreenSize + ", RAM=" + RAM + ", ROM="
+ ROM + ", capacity=" + capacity + "]";
}
}
购物车类
class ShoppingCar{
private Goods goods;
private Users user;
@Override
public String toString() {
return "ShoppingCar [goods=" + goods + ", user=" + user + "]";
}
public void add(){
...
}
public void delete(){
...
}
public double sum(){
...
}
public void find_similar(){
...
}
}
用户类
class Users{
private String pname;
private String adress;
private String tel;
public Users(String pname, String adress, String tel) {
super();
this.pname = pname;
this.adress = adress;
this.tel = tel;
}
@Override
public String toString() {
return "Users [pname=" + pname + ", adress=" + adress + ", tel=" + tel
+ "]";
}
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的构造函数中,这样看起来不是更直观吗?
3.1
答:子类Manager的getSalary方法中复用了父类Employee类的getSalary方法,子类Manager的构造方法中复用了父类Employee类的构造方法。属性name,salary,hireDay也实现了代码复用。
3.2
答:JVM会根据调用该方法的实际对象类型来判断调用哪个方法,即若实际对象类型为Manager,则调用Manager类的getSalary方法,若实际对象类型为Employee,则调用Employee类的getSalary方法。
3.3
答:当e=staff[0]时,调用了Manager类的getSalary方法,当e=staff[1]或e=staff[2]时,调用了Employee类的getSalary方法。
3.4
答:好处:大大提高了软件开发的效率,提高了程序的可维护性。把父类构造函数中的相关代码复制粘贴到Manager的构造函数中,如果对父类构造函数中的相关代码进行了修改,那么同时也要对Manager的构造函数进行修改,而当Manager类的构造函数使用super调用父类的构造函数实现了代码复用时,只需对父类进行修改即可。
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<Fruit> fruitList
存储多个fruit
,要求如果fruitList
中已有的fruit
就不再添加,没有的就添加进去。请编写相关测试代码。并分析ArrayList
的contatins
方法是如何实现其功能的?
4.1
答:使用System.out.println(new Fruit());是调用Fruit的toString()方法,Fruit类继承Object类,Object类中有toString方法,Fruit类对Object类的toString方法实现了复用。这些代码返回一个字符串(字符串内容:Class对象所代表的具体对象的名称与该对象哈希码值的16进制形式)。
4.2
答:父类中的toString方法的代码仍然有。
4.3
答:功能:判断当前对象与传入对象是否有相同的引用,如果有返回true,否则返回false.
代码:
class Fruit{
private String name;
public Fruit(String name) {
super();
this.name = name;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Fruit other=(Fruit) obj;
if((name.compareToIgnoreCase(other.name))==0){
return true;
}
return false;
}
@Override
public String toString() {
return super.toString()+" Fruit [name=" + name + "]";
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Fruit f1=new Fruit("apple");
Fruit f2=new Fruit("Apple");
System.out.println(f1.equals(f2));
}
}
4.4
import java.util.ArrayList;
import java.util.Scanner;
class Fruit{
private String name;
public Fruit(String name) {
super();
this.name = name;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Fruit other=(Fruit) obj;
if((name.compareToIgnoreCase(other.name))==0){
return true;
}
return false;
}
@Override
public String toString() {
return "Fruit [name=" + name + "]";
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Fruit> fruitList=new ArrayList<>();
Scanner in=new Scanner(System.in);
int n=in.nextInt();
for (int i = 0; i < n; i++) {
String str=in.next();
Fruit f=new Fruit(str);
if(i==0){
fruitList.add(f);
}
else{
if(!fruitList.contains(f)){
fruitList.add(f);
}
}
}
System.out.println(fruitList);
}
}
答:通过遍历elementData数组来判断对象是否在fruitList中,若存在,返回对象在数组中的元素下标,若不存在则返回-1。ArrayList中的contains方法可以通过indexOf(Object)方法的返回值来判断对象是否被包含在fruitList中,若返回值大于等于0,则返回true,否则返回false。
代码阅读:EqualsTest.java(equals与hashCode)
5.1 读懂main函数,将自己推测的出代码运行结果与真正运行结果进行比较。尝试分析原因
5.2 为Employee类的equals函数的每一行加中文注释。
5.3 为Manager类的equals函数的每一行加中文注释。并回答,编写子类的equals函数需要注意什么?
5.4 对Employee的hashCode源代码,加中文注释。并结合数据结构中的知识,你觉得每个类中都有的hashCode方法有什么用?
5.5 查看Manager的hashCode源代码。并回答,编写子类的hashCode方法需要注意什么?
5.1
结果:
分析:注意"=="比较的是引用值,调用equals()方法时,JVM会根据实际对象类型来选择调用哪个方法,只需对方法中的条件进行判断。注意不要漏看"boss.setBonus(5000);"这一句,否则在判断"System.out.println("carl.equals(boss): " + carl.equals(boss));"时就会判断错。
5.2
5.3
答:编写子类的equals函数注意可以复用父类的equals函数。
5.4
public int hashCode() {
int h = hash;//将hash的值赋给h
if (h == 0 && value.length > 0) {//如果h的值为0并且value数组的长度不为0
char val[] = value;//将value数组赋给val数组
for (int i = 0; i < value.length; i++) {//i从0变化到value.length-1时满足循环条件
h = 31 * h + val[i];//h与val[i]一一映射
}
hash = h;//将h的值赋给hash
}
return h;//返回h的值
}
答:返回该对象的哈希码值。每创建一个对象,根据该对象的哈希码值,可将其插入到Hash表中,若不同对象的哈希码值相同,也就是在key位置发生了冲突,那么就在key位置新建一个链表,将相同哈希码的不同对象插入链表。比较两个对象时,首先比较的是它们的哈希码值,若哈希码值不同,则肯定不equal。
Q6.代码阅读:PersonTest.java(abstract、多态)
6.1 画出类的继承关系
6.2 读懂main函数,将自己推测的出代码运行结果与真正运行结果进行比较。尝试分析原因
6.3 子类中里面使用了super构造函数,作用是什么?如果将子类中的super构造函数去掉,行不行?
6.4 PersonTest.java中的代码哪里体现了多态?你觉得多态有什么好处?多态和继承有什么关系吗?
参考文件:PersonTest.java
6.1
6.2
运行结果:
分析:按年龄从小到大对数组peoples进行排序,并根据调用toString()方法的实际对象类型来选择调用哪个方法。例如:peoples[3]实际是Manager类,则调用Manager类的toString()方法,而Manager的toString()方法中又使用了super.toString(),即调用了Employee类的toString()方法,依此类推,Employee类的toString()方法调用了Person类的toString()方法,将Manager的toString()方法输出即可。
6.3
答:调用父类的构造函数,对子类中与父类相同的属性进行初始化。不能将子类中的super构造函数去掉。
6.4
多态体现:
多态的好处:可以增强程序的可扩展性及可维护性,使代码更加简洁。
多态和继承的关系:继承是多态的前提。
3. PTA实验总结及码云上代码提交记录
3.1本周Commit历史截图
3.2 实验总结
实验碰到的问题、思考、收获与解决方案
实验碰到的问题:(1)输出persons2数组(ArrayList容器)中的每个元素,使用for(int i=0;i<persons2.size();i++){System.out.println(persons2[i]);}(2)将"default"打成"dafault".
解决方案:(1)将"System.out.println(persons2[i]);"改成"System.out.println(persons2.get[i]);"(2)当编写的代码测试多次都无法通过,逻辑上的代码又没有错误的时候可以再仔细检查一下单词的拼写问题。
收获:Object类是所有类的父类。擅于使用封装与继承能提高代码编写的效率。
4. 其他的一些题目,如特别加分的实验题目、小任务、自己用Java做的一些小东西(可选,加分)
201521123069 《Java程序设计》 第4周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 20145218《Java程序设计》第一周学习总结
20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
随机推荐
- NOIP 2002 提高组 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- mysql对binlog的处理
--mysql对binlog的处理 ------------------------2014/05/28 Binlog是mysql以二进制形式打印的日志,它默认不加密,不压缩.每个正常的binlog文 ...
- oracle数据库与实例
========================================================================================== oracle数据库 ...
- ORA-00119/ORA-00132
今天在启动服务器上的ORACLE时遇到如下错误: SQL> startup; ORA-00119: invalid specification for system parameter LOCA ...
- macvlan 网络隔离和连通 - 每天5分钟玩转 Docker 容器技术(57)
上一节我们创建了两个 macvlan 并部署了容器,网络结构如下: 本节验证 macvlan 之间的连通性. bbox1 能 ping 通 bbox3,bbox2 能 ping 通 bbox4.即:同 ...
- 如何正确地修改.data和.item文件的‘utf-8’格式
问题:有时候,我们在做分类信息提取的时候文件的格式可能不是我们想要的.txt文件的格式,如何进行修改? 解决:(1)将文件复制一份,并保存为.txt的格式(2)将复制之后的文件通过另存为的方式更改为u ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(三)一个简单的rtsp播放器
该篇内容简单的将前两篇内容组合在一起,创建了2个线程,分别播放音频和视频. int main(int argc, char * argv[]) { RtspClient Client; pthread ...
- 多重外键关系在java中的处理方案
// 0){ var ul = li.getElementsByTagName("ul")[0]; ul.style.display = "none"; var ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- PHP迭代与递归实现无限级分类
无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳. 1.循环迭代实现 $arr = [ 1=>['id'=>1,'name'=>'父1','father'=& ...