20175211 2018-2019-2 《Java程序设计》第四周学习总结
教材学习内容总结
第五章 子类与继承
5.1 子类与父类
- 继承是一种由已有的类创建新的类的机制。利用继承,可以先定义一个共有属性的一般类,根据该一般类再定义具有特殊属性的子类,子类继承一般类的属性和行为,并根据需要增加自己的属性和行为。
- 子类通过extends关键字来定义
- 所有类都是Object类的子类
所以所有类都继承了Object类的方法
5.2 子类的继承性
5.3 子类与对象
用子类的构造方法创建一个子类对象时,不仅子类中声明的成员变量被分配了内存,而且父类的成员变量也都分配了内存空间,但只将子类继承的那部分成员变量作为分配给子类对象的变量。
instanceof运算符的左操作元是对象,右操作元是类,当左边的操作元是右边的类或其子类所创建的对象时,instanceof运算的结果是true,否则是false。
5.4 成员变量的隐藏和方法重写
当子类声明的成员变量的名字和从父类继承来的成员变量名字相同(声明的类型可以不同),子类会隐藏所继承的成员变量。此时可以使用super关键字调用被隐藏的父类成员变量
方法重写是指子类中定义一个方法,这个方法的类型和父类的方法的类型或父类方法的类型的子类型一致,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。
注意:方法重载不比较方法类型,所以子类里不可以出现仅和父类方法类型不一样,而名称、参数都完全相同的方法,这既不是重写也不是重载。
重写父类方法时,不允许降低方法的访问权限,但可以提高访问权限(访问权限从高到低为public、protected、no modifier、private)
5.5 super关键字
- 与this有相似之处
5.6 final关键字
- final关键字可以修饰类、成员变量和方法中的局部变量
- final类不可以被继承,final方法不可以被重写,final声明的变量是常量,声明时没有默认值。
5.7对象的上转型对象
- 上转型对象就是父类引用指向子类对象,例如
Animal a = new Tiger();
5.8 继承与多态
多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为
5.9 abstract类和abstract方法
- 对于abstract方法,只允许声明,不允许实现,且不允许使用final、static和abstract同时修饰一个方法或类
- abstract类中可以有abstract方法(非abstract类中不可以有abstract方法),也可以有非abstract方法
- abstract类不能用new运算符创建对象
- abstract类的非abstract子类必须重写父类的abstract方法
5.10 面向抽象编程
- 理解abstract类
- 抽象类用抽象方法来封装子类必须要有的行为标准
- 抽象类声明的对象可以成为其子类的对象的上转型对象,调用子类重写的方法,即体现子类根据抽象类里的行为标准给出的具体行为。
- 所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。
- 面向抽象编程的目的是为了应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去。面向抽象编程的核心是让类中每种可能的变化对应地交给抽象类的一个子类去负责,从而让该类的设计者不必去关心具体实现,避免所设计的类依赖于具体的实现。
5.11 开-闭原则
- 设计系统时,首先考虑到用户需求的变化,将对应用户变化的部分设计为对扩展开放
- 设计的核心部分是经过经过精心考虑之后确定下来的基本结构,这部分应当是对修改关闭的
教材学习中的问题和解决过程
- 问题1:上转型对象是什么?有什么用吗?
- 问题1解决方案:简单来说,向上转型就是
父类引用指向子类对象
好处在于
这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,
如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了JAVA的抽象编程思想。
其实书上P128页上Example5_11就有体现,同样的animal.cry()可以根据具体的上转型对象做出不同的行为,狗就是“汪汪”,猫就是“喵喵”,那么在其他函数的接口就可以直接使用animal作为参数,而不需要重载方法。比如P130页Example5_12中Boy类的setGirlfriend方法。其实看完面向抽象编程和相应的例子以后就很好理解了。
参考链接JAVA中上转型对象的详细解释,
在java 中,什么叫向上转型
代码调试中的问题和解决过程
- 问题1:构建了一个斐波那契数列类,但是在接收到负数参数时,无法很好的反馈异常,本来想在存入数据时判断calcNextFib()结果是否为-1来处理负数输入,但还是抛出异常。
import java.util.Arrays;
public class Fibonacci {
int length;
int[] fib;
Fibonacci(int n) {
this.length = n;
fib = new int[length];
System.out.println("Please Input a positive number");
if(calcNextFib(n)<0){
for (int i = 0; i < n; i++) {
fib[i] = calcNextFib(i);
}
} else {
System.out.println("Invalid Input");
}
}
private int calcNextFib(int n) {
if (n == 0 || n == 1) {
return 1;
} else if (n > 1) {
return fib[n - 1] + fib[n - 2];
} else {
return -1;
}
}
void printFib() {
System.out.println(Arrays.toString(fib));
}
}
- 问题1解决方案:查看文档,搜索抛出的异常
原来是数组定义的时候长度不能为负数,所以在给数组赋值的时候检查并没有什么用。而我用这种方式来构造斐波那契数列,正好可以用数组长度来检测输入数据的合法性,所以我想到可以直接catch这个异常,修改代码如下
···
Fibonacci(int n) {
this.length = n;
try {
fib = new int[length];
} catch (NegativeArraySizeException e) {
System.out.println("Please Input a positive number");
}
for (int i = 0; i < n; i++) {
fib[i] = calcNextFib(i);
}
}
···
之后我又测试了长度为0时,是可以的,结果创建了一个空数组,测试结果如下
代码托管
上周考试错题总结
- 错题1:下列关于实例方法和类方法的叙述,正确的是
A .类方法不可以操作实例变量,因为在类创建对象之前,实例成员变量还没有分配内存。
B .当创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址。
C .实例方法不能通过类名调用,只能由对象来调用。
D .不必创建对象就可以用类名直接调用static方法。
正确答案: A B C D 你的答案: A C D
错误原因:书上有这句原话。。。没印象了。其实很好理解,因为同一个类创建的对象方法是一样的,所以只需要一个方法入口就可以了,需要的时候直接传参进去,不需要存放多个一样的方法。
其他(感悟、思考等,可选)
面向抽象编程的思想很重要!也很好用!能从书上的例子上直接感受到这种思想带来的便利和清晰的架构,看来要多实践实践熟悉这种思想。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 32/32 | 3/3 | 20/20 | 掌握JDB用法 |
第二周 | 261/293 | 3/6 | 18/38 | 无 |
第三周 | 770/1063 | 2/8 | 10/48 | 类 |
第四周 | 555/1508 | 2/10 | 14/62 | 子类与继承 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
20175211 2018-2019-2 《Java程序设计》第四周学习总结的更多相关文章
- Java程序设计第四周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:①String类是final类,不能定义String的子类. ② instanceof ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第四周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第四周学习总结 正文开头 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-da ...
- 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结
20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- 杨其菊201771010134《面向对象程序设计(java)》第四周学习总结
<面向对象程序设计(java)> 第四周学习总结 第一部分:理论知识 1.类与对象 a.类(class)是构造对象的模板或蓝图.由类构造对象的过程称为创建类的实例: java中类声明的格式 ...
- 对于“2017面向对象程序设计(JAVA)第四周学习总结”存在问题的反馈
对于“2017面向对象程序设计(JAVA)第四周学习总结”存在问题的反馈 “这部分同学博文总结没有写,实验作业没有提交.”——1.关于博文作业.实验作业教学功能的正解:学习知识.暴露问题.衔接课上.2 ...
- 20155318 2016-2017-2 《Java程序设计》第九学习总结
20155318 2016-2017-2 <Java程序设计>第九学习总结 教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型 ...
- 《Java程序设计》第二学习总结
<Java程序设计>第二学习总结 教材学习内容总结 类型 byte(字节) shot(短整型) int(整型) long(长整型) float(浮点型) double(双精度) char( ...
- 20145304 刘钦令 Java程序设计第二周学习总结
20145304 <Java程序设计>第2周学习总结 教材学习内容总结 java可区分基本类型和类类型(即参考类型)两大类型系统. 基本类型主要可区分为整数.字节.浮点数.字符与布尔. 整 ...
- 20145304 刘钦令 Java程序设计第一周学习总结
20145304<Java程序设计>第1周学习总结 教材学习内容总结 1995年5月23日,是公认的Java的诞生日,Java正式由Oak改名为Java. Java的三大平台是:Java ...
- 20145120黄玄曦 《java程序设计》 寒假学习总结
1和2.我对未来规划不多,我认为好好学习积累知识能帮助我应对未来的挑战,这是我的学习动力之一,此外,了解新知识满足好奇心也是我的主要的学习动力. 3.我认为专业课学习比公务员考试重要,我认为专业知识是 ...
随机推荐
- 刨根问底 | Elasticsearch 5.X集群多节点角色配置深入详解【转】
转自:https://blog.csdn.net/laoyang360/article/details/78290484 1.问题引出 ES5.X节点类型多了ingest节点类型. 针对3个节点.5个 ...
- 性能测试工具--SIEGE安装及使用简介 siege压力测试
官方网站http://www.joedog.org/ 概述 Siege是一个多线程http负载测试和基准测试工具.它有3种操作模式: 1) Regression (when invoked by bo ...
- TensorFlow 图片resize方法
参见这篇博客 tensorflow里面用于改变图像大小的函数是tf.image.resize_images(image, (w, h), method):image表示需要改变此存的图像,第二个参数改 ...
- kafka调试工具kafkacat的使用
一. 安装 kafkacat 是基于kafka C语言的librdkafka库的 kafka客户端,不依赖java,小巧轻便,支持主流系统.在高版本的debain.Ubuntu下可以直接apt-get ...
- Filter需要配置多个url-pattern
最近做项目遇到一个Filter需要配置多个url-pattern,上网查了下资料,经测试,现总结下 filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前. ...
- GraphX学习笔记——可视化
首先自己造了一份简单的社交关系的图 第一份是人物数据,id和姓名,person.txt 1 孙俪 2 邓超 3 佟大为 4 冯绍峰 5 黄晓明 6 angelababy 7 李冰冰 8 范冰冰 第二份 ...
- Webpack前端打包工具
一.安装 安装Webpack之前需要安装nodejs,然后用npm安装: $ npm install webpack -g &nsbp;运行以上命令就将Webpack安装到了全局环境中. 但 ...
- linux系统下Nagios+rrdtool+Pnp4nagios监控环境的搭建
环境中的软件版本>>>>>>>>>>>>>>>>>>nagios版本:3.5.1rrdtoo ...
- passwd命令
passwd命令用于设置用户的认证信息,包括用户密码.密码过期时间等.系统管理者则能用它管理系统用户的密码.只有管理者可以指定用户名称,一般用户只能变更自己的密码. 语法 passwd(选项)(参数) ...
- Linux下的搜索查找命令的详解(whereis)
2.whereis 和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据 ...