20145230《Java程序设计》第4周学习总结

教材学习内容总结

继承共同行为

本周学习的首先是Java语言中的继承与多态。何为我们的继承呢?在我们面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承,滥用继承可能导致程序维护上的问题,继承基本上就是避免多个类间重复定义共同行为。下面我们来看代码:

package cc.openhome;
public class Role {
private String name;
private int level;
private int blood;
public int getBlood()
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

我们注意到private成员是可以继承的,只不过子类无法直接存取而已,必须通过父类提供的方法来存取。

多态与is-a###

is-a,顾名思义,就是"是一种"的意思,在前面看到的范例中,SwordsMan和Magician都继承了Role,它们都是Role的子类,即它们都是一种Role。下面是代码:

package cc.openhome;
public class RPG {
public static void main(String[] args) {
SwordsMan swordsMan = new SwordsMan();
swordsMan.setName("Justin");
swordsMan.setLevel(1);
swordsMan.setBlood(200);
Magician magician = new Magician();
nagician.setName("Monica");
magician.setLevel(1);
magician.setBlood(100);
showBlood(swordsMan);
showBlood(magician);
}
static void showBlood(Role role) {
System.out.printf("%S 血量 %d%n", role, getName(), role.getBlood())
}
}

重新定义行为###

在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。因为

对父类中已定义的方法执行不满意,所以在子类中重新定义执行。SwordsMan和Magician继承了Role后,也重新定义了fight()行为。下面是部分代码:

package cc.openhome;
public class SwordsMan extends Role{
public void fight(){
System.out.println("挥剑攻击");
}
}

抽象方法和抽象类

如果某方法区块中真的没有任何程序代码操作,可以直接使用abstract标示该方法为抽象方法,该方法不用撰写{}区块,直接";"结束即可。子类如果继承抽象类,对于抽象方法有两种做法,一种做法是继续标示该方法为abstract,另一种做法就是操作抽象方法。特别注意的是:如果两种做法都没有实施,那么就会引发编译错误。

构造函数

如果类有继承关系,在创建子类实例后,会先进行父类定义的初始流程,再进行子类中定义的初始流程,再执行子类构造函数定义的流程。父类中可重载多个构造函数,如果子类构造函数中没有指定执行父类中哪个构造函数,默认会调用父类中无参数构造函数。

再看final关键字

前面我们知道,如果变量值确定以后,不再想改变变量值,我们可以加上final限定,如果在后续撰写程序时,不经意想修改final变量,就会出现编译错误。如果class前使用了final关键字定义,那么这个类将不会有子类,也不能被继承。如果尝试在继承父类后,重新定义final方法,则会发生编译错误。

java.lang.Object

在java中,子类只能继承一个父类,如果定义时没有使用extends关键字指定继承任何类,那一定继承java.lang.Objecta。如果要收集对象,可通过add()的方法,如果想取得收集的对象,可以使用get()指定索引取得。如果想知道已收集对象个数,则通过size()的方法获得。下面是收集访客名称的代码:

package cc.openhome;
import java.util.ArrayList;
import java.util.Scanner;
import static java.lang.System.out;
public class Guest{
public static void main(String[] args){
ArrayList names=new ArrayList();
collectNameTo(names);
out.println("访客名单:");
printUpperCase(names);
}
static void collectNameTo(ArrayList names) {
Scanner console = new Scanner(System.in);
while (true) {
out.print("访客名称:");
String name = console.nextLine();
if (name.equals("quit")) {
break;
}
names.add(name);
}
}
static void printUpperCase(ArrayList names) {
for (int i = 0; i < names.size(); i++)
String name = (String) names.get(i);
out.println(name.toUpperCase());
}
}
}

接口定义行为

接口可以用于定义行为但不定义操作,对象若想拥有Swimmer定义的行为,就必须操作Swimmer接口。类操作接口,必须使用implementa关键字。操作某接口时,对接口中定义的方法有两种处理方式,医师操作接口中定义的方法,二是再度将该方法标示为abstract。操作接口表示"拥有行为",但不会有"是一种"的关系。下面是部分代码:

public class Submarine implements Swimmer {
private String name;
public Submarine(String name){
this.name=name;
}
public String getName(){
return name;
}
@Override
public void swim(){
System.out.printf("潜水艇 %s 潜行%n",name);
}
}

行为与多态

只要是操作Swimmer接口的对象,都可以使用doSwim()的方法,Anemonefish、Shark、Human、Submarine等,都操作了Swimmer接口。只要对象拥有Swimmer行为,都不用撰写新的方法,可维护性提高了很多。

匿名内部类

写Java程序时,经常会有临时继承某个类或操作某个接口并建立实例的需求。由于这类子类或接口操作类只使用一次,不需要为这些类定义名称,这时可以使用匿名内部类来解决这个需要。以下是代码举例:

package cc.openhome;
public class Client{
public final String ip;
public final String name;
public Client(String ip,String name){
this.ip=ip;
this.name=name;
}
}

使用enum枚举常数

enum定义了特殊的类,继承自"java.lang.Enum",不过这是由编译程序处理,直接撰写程序继承Enum类会被编译程序拒绝。要注意的是,enum实际上定义了类,而enum中列举的常数,实际上是public static final,且为枚举类型实例,无法撰写程序直接实例化枚举类型,因为构造函数权限设定为private,只有类中才可以实例化。下面是enum语法的举例:

package cc.openhome;
public enum Action{
STOP,RIGHT,LEFT,UP,DOWN
}

教材学习中的问题和解决过程

问题

我在学习第六章的多态与"is-a"时遇到了这样的问题。Role role1=new SwordsMan();Role role2=new Magician();这样的代码可以通过编译,但是,SwordsMan swordMan=new Role(); Magician magician=new Role();却无法通过编译。

解决方法

我仔细看了这一块介绍的知识,大概就是一种继承的问题。举个通俗一点的例子,就是这里的=号并不是相等的意思,而是"is-a"的意思。我们可以说鲨鱼是一种鱼,小丑鱼是一种鱼,但反过来说鱼是一种鲨鱼则显得不妥,这种逻辑问题编译就不能通过。SwordsMan是一种Role,但Role不一定是一种SwordsMan。

代码调试中的问题和解决过程

问题

我在敲代码的过程中遇到了类似这样的问题:

解决方法

我通过询问同学才知道,书中的package cc.openhome是编书作者的一个包,而在我的idea上并没有这个包,所以我就重新建了一个cc.openhome的文件夹,解决了这个问题。下面那个Guest的问题是因为我建的C-class的名字和class下的Guest不符合,所以出现了编译失败的问题,我又只能修改C-class的名字才能解决。

本周代码托管截图



其他(感悟、思考等,可选)

这个星期我学习了第6、7章的java,自己学到了很多东西。上两章是"对象"的序幕,那么这两章则是对"对象"这个概念的深入介绍。而且这两章书中所举的例子都十分生动,有设计简单游戏的,也有举海洋动物的例子的。这样在我看来就十分好,代码是活的东西,它就应该像游戏一样让人开怀大笑,像动物一样栩栩如生。往往我们会对成百上千行的代码感到枯燥无味,那是因为我们没有了解它背后的内涵。这两章内容是对继承和接口的介绍,让我知道了父类和子类是不能颠倒的,也让我知道了接口表示的只是一种"拥有行为"。但我觉得自己还是不够认真,总把事情拖到最后来完成,要是自己能更加主动一点去学习就好了,想必这也是老师要教给我们的吧。希望下周自己能更加积极一点学习,客服拖延症!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 2000行 25篇 400小时
第一周 100/100 2/2 20/20 编写了HELLO WORLD程序
第二周 100/200 2/4 20/40 了解了Java基本语法
第三周 50/250 1/5 20/60 了解了对象封装问题
第四周 564/814 2/7 30/90 了解了继承、接口与多态的问题

参考资料

20145230《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. 什么是 AJAX?

    AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行 ...

  2. 使用.NET Reflector 查看Unity引擎里面的DLL文件

    转载标注来源哦! 原地址在这里!在这里. 当你查看unity里面API的时候.是不是有时候追踪了一两步就碰到DLL文件走不下去了呢?非常是不爽吧. 这样的问题我也是常常碰到.这是人家商业引擎不想让你看 ...

  3. (转)Resources和AssetBundle(新旧版)学习

    Resources:   Resources的缺点:1.与显示Inspector上直接引用相比,Resources使用不方便.     2.不管你Resources上的资源是否调用了,当你发布的时候, ...

  4. poj 3469(网络流模版)

    题目链接:http://poj.org/problem?id=3469 思路:终于把网络流的模版测试好了,在Dinic和Sap之间还是选择了Sap,事实证明Sap确实比Dinic效率高,在此贴出自己的 ...

  5. webpack添加node_path不是('webpack' 不是内部或外部命令,也不是可运行的程序或批处理文件?)

    安装webpack 先决条件 开始之前,请确保安装了新的Node.js版本.目前的LTS是理想的起点.您可能会遇到与旧版本的各种问题,因为它们可能缺少webpack或相关软件包可能需要的功能. 请注意 ...

  6. Core Services层

    本文转载至 http://jingyan.baidu.com/article/cdddd41c57360853cb00e124.html Core Services层是系统很多部分的基础部分,也许应用 ...

  7. Nginx 的多站点配置

    当我们有了一个 VPS 主机以后,为了不浪费 VPS 的强大资源(相比共享主机1000多个站点挤在一台机器上),往往有想让 VPS 做点什么的想法,银子不能白花啊:).放置多个网站或者博客是个不错的想 ...

  8. 1280 前缀后缀集合(map)

    1280 前缀后缀集合 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一个数组包含N个正整数,其中有些是重复的.一个前缀后缀集是满足 ...

  9. SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)

    本节中所阐述的内容,主要适用于SharePoint文档库中的文件和文件夹,以及列表中的文件夹.系统中的其他文件(如_layouts中的文件.配置文件.程序文件等)不在本章节的讨论范围之内.   (一) ...

  10. 类与类之间关系,用C#和JavaScript体现

    前言 在面向对象中,类之间的关系有六种,分别是: 关联关系(Association) 泛化关系(Generalization) 依赖(Dependency) 聚合(Aggregation) 组合(Co ...