教材学习内容总结

第六章 继承与多态

6.1 何为继承

0.面向对象中,子类继承父类,避免城府的行为定义。正确判断使用继承的时机,以及继承之后如何活用多态,才是学习继承时的重点。

1.继承:避免多个类间重复定义共同行为。

继承的好处:将name、level、blood改为其它名称,只要修改Role.java就可以了,只要继承Role的子类都无需修改。

public class RPG {

public static void main(String[] args)

{

demoSwordsMan();

demoMagician();

}

static void demoSwordsMan()
{
SwordsMan swordsMan = new SwordsMan();
swordsMan.setName("Justin");
swordsMan.setLevel(1);
swordsMan.setBlood(200);
System.out.pringtf(“剑士:(%s, %d, %d)%n”, swordsMan.getName(), swordMan.getLevel(), swordsMan.getBlood());
} static void demoMagician()
{
Magician magician = new Magician();
magician.setName("Monica");
magician.getLevel(1);
magician.getBlood(100);
System.out.printf(“魔法师:(&s, &d, &d)%n”, magician.getName(), magician.getLevel(), magician.getBlood());
}

}

执行结果:

剑士:(Justin,1,200)

魔法师:(Monica,1,100)

2.多态与is-a

在java中,子类只能继承一个父类。

is-a:继承除了可避免类间重复的行为定义类外,还有一种重要的关系——is-a,中文称为“是一种”的关系。

多态:抽象的说,就是使用单一接口操作多种类型的对象。

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();
magician.setName("Monica");
magician.getLevel(1);
magician.getBlood(100); showBlood(swordsMan);
showBlood(magician);
} static void showBlood(Role role)
{
System.out.printf("%s 血量 %d%n",role.getName(), role.getBlood());
}

}

执行结果:

Justin 血量 200

Magica 血量 100

3.重新定义行为

再重新定义父类中的某个方法时,子类必须编写与父类方法中相同的签署。

再重新定义某种方法时,加上@override,就不用担心打错字的问题了。

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();
magician.setName("Monica");
magician.getLevel(1);
magician.getBlood(100); drawFight(swordsMan);
drawFight(magician);
} static void showBlood(Role role)
{
System.out.printf(role.getName());
role.fight();
}

}

执行结果:

Justin挥剑攻击

Monica魔法攻击

4.抽象方法、抽象类

java中规定内涵抽象方法的类,一定要在class前标示abstract,表示一个定义不完整的抽象类。(如果尝试用抽象类创建实例,就会引发编译错误)

子类若继承抽象类,对于抽象方法有两种做法:

·继续标示该方法为abstract(该子类因此也是个抽象类,必须在class前标示abstract);

·操作抽象方法。

(两种抽象方法都没有实施,就会引发编译错误)

6.2 继承语法继承

1.protected成员

被声明为protected成员,相同包中的类可以直接存取,不同包中的类可以自己城中的子类直接存取。

java中的权限关键字:public、protected、private。(实际上有4个权限范围,因为没有定义权限关键字,默认就是是包范围)

2.重新定义的细节

对于父类中的方法权限,只能扩大不能缩小。

在JDK5之前,重新定义方法时除了可以定义权限较大的关键字外,其他部分必须与父类中方法签署完全一致。

在JDK5之后,重新定义方法类时,如果返回类型是父类中方法返回类型的子类,也是可以通过编译的。

3.java.lang.Object

如果定义类时没有使用extends关键字指定继承任何类,那一定是继承java.lang.Object。

因此在java中,任何类追溯至最上层一定就是java.lang.Object,也就是说,在java中所有对象,一定“是一种”Object。

任何类型的对象,都可以使用Object申明的名称来参考。

import java.util.Scanner;

import static java.lang.System.out;

public class Guess

{

public static void main(String[] args)

{

ArrayList names = new ArrayList();

collectNameTo(names);

out.printIn(“访客名单:”);

printUpperCase(names);

}

static void collectNameTo(ArrayList names)

{

Scanner console = new Scanner(System.in);

while(true)

{

out.print(“访客名称:”);

String names = 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.printIn(name.toUpperCase());
}
}

}

执行结果:

访客名称:Justin

访客名称:Monica

访客名称:Irene

访客名称:quit

访客名单:

JUSTIN

MONICA

IRENE

4.关于垃圾收集

创建对象会占据内存,如果程序执行流程中已经无法再使用某个对象,该对象只是徒耗内存的莱基。

对于不再使用的对象,JVM有垃圾收集机制(GC),收集到的垃圾对象所占据的内存,会被垃圾收集器释放。

5.再看抽象类

第七章 接口与多态

1.接口定义行为

类要操作接口,必须使用implemente关键字。

2.行为的多态

public class Ocean{

public static void main(String[] args)

{

doSwim(new Anemonefish("尼莫"));

doSwim(new Shark("兰尼"));

doSwim(new Huamn("贾斯汀"));

doSwim(new Submarine("黄色一号"));

}

static void doSwim(Swimmer swimmer){
swimmer.swim();
}

}

执行结果:

小丑鱼 尼莫 游泳

鲨鱼 兰尼 游泳

人类 贾斯汀 游泳

潜水艇 黄色一号 潜行

7.2 接口语法细节

1.接口的默认

在java中,可使用interface来定义抽象行为与外观(如接口中的方法可声明为public abstract)。接口中的方法没有操作时,一定得是公开且抽象。可以省略public abstract,编译程序会自动帮你加上public abstract。默认一定是public。

2.匿名内部类

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

new 父类()|接口(){

//类本体操作

};

使用匿名内部类,直接建立操作ClientListener的对象:

public class MultiChat{

public static void main(String[] args){

Client c1 = new Clent("127.0.0.1","Caterpillar");

Client c2 = new Clent("192.168.0.2","Justin");

    ClientQueue queue = new ClientQueue();
queue.addClientListener(new ClientListener(){
@Override
public void clientAdded(ClientEvent event){
System.out.printf("%s 从 %s 联机%n", event.getName(), event.getIp());
} @Override
public void clientRemoved(ClientEvent event){
System.out.printf("%s 从 %s 联机%n", event.getName(), event.getIp());
}
}); queue.add(c1);
queue.add(c2);
queue.remove(c1);
queue.remove(c2);
}

}

执行结果:

caterpillar 从 127.0.0.1 联机

justin 从 192.168.0.2 联机

caterpillar 从 127.0.0.1 联机

justin 从 192.168.0.2 联机

3.使用enum枚举常数

从JDK5之后新增了enum语法,可用于定义枚举常数。

例

public enum Action{

STOP, RIGHT, LEFT, UP, DOWN

}

范例中的enum定义的Action实际上是个类,而enum中例举的STOP, RIGHT, LEFT, UP, DOWN常数,实际上是public static final,且为Action实例。你无法编写程序直接实例化Action,因为构造函数权限设定为private,只有Action类中才可以实例化。

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

本周的学习内容和上周一样太多,光是看书并不能都看懂弄会,并且只是自己敲代码还是有许多的不理解,这两章的内容都有些抽象,所以许多地方都询问了同学。

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

第六章两个章节都有关于抽象方法、抽象类的内容,但是很难理解,光看书上的代码并没有搞懂。

其他(感悟、思考等)

说实话大量时间放在java上,但是感觉学习的效果并不是很理想,看来我还是得好好想想学习方法是否哪里不对。

参考资料

Java学习笔记(第8版)

《Java学习笔记(第8版)》学习指导

20145127《java程序设计》第四周学习总结的更多相关文章

  1. Java程序设计第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:①String类是final类,不能定义String的子类. ② instanceof ...

  2. 杨其菊201771010134《面向对象程序设计(java)》第四周学习总结

    <面向对象程序设计(java)> 第四周学习总结 第一部分:理论知识 1.类与对象 a.类(class)是构造对象的模板或蓝图.由类构造对象的过程称为创建类的实例: java中类声明的格式 ...

  3. 对于“2017面向对象程序设计(JAVA)第四周学习总结”存在问题的反馈

    对于“2017面向对象程序设计(JAVA)第四周学习总结”存在问题的反馈 “这部分同学博文总结没有写,实验作业没有提交.”——1.关于博文作业.实验作业教学功能的正解:学习知识.暴露问题.衔接课上.2 ...

  4. 201871010106-丁宣元 《面向对象程序设计(java)》第四周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第四周学习总结 正文开头 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-da ...

  5. 20155318 2016-2017-2 《Java程序设计》第九学习总结

    20155318 2016-2017-2 <Java程序设计>第九学习总结 教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型 ...

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

    <Java程序设计>第二学习总结 教材学习内容总结 类型 byte(字节) shot(短整型) int(整型) long(长整型) float(浮点型) double(双精度) char( ...

  7. 20145304 刘钦令 Java程序设计第二周学习总结

    20145304 <Java程序设计>第2周学习总结 教材学习内容总结 java可区分基本类型和类类型(即参考类型)两大类型系统. 基本类型主要可区分为整数.字节.浮点数.字符与布尔. 整 ...

  8. 20145304 刘钦令 Java程序设计第一周学习总结

    20145304<Java程序设计>第1周学习总结 教材学习内容总结 1995年5月23日,是公认的Java的诞生日,Java正式由Oak改名为Java. Java的三大平台是:Java ...

  9. 20145120黄玄曦 《java程序设计》 寒假学习总结

    1和2.我对未来规划不多,我认为好好学习积累知识能帮助我应对未来的挑战,这是我的学习动力之一,此外,了解新知识满足好奇心也是我的主要的学习动力. 3.我认为专业课学习比公务员考试重要,我认为专业知识是 ...

  10. 201621123007 Java程序设计第一周 学习总结

    第一周-Java基本概念 201621123007 <Java程序设计> 第一周学习总结 1. 本周学习总结 java是面向对象的一类语言,三大特征:封装性,继承性,多态性. jdk jr ...

随机推荐

  1. ZOJ 3780 - Paint the Grid Again - [模拟][第11届浙江省赛E题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3780 Time Limit: 2 Seconds      Me ...

  2. POJ - 1088 滑雪 dp

    http://bailian.openjudge.cn/practice/1088?lang=en_US 题解: 设一个dp[N][N]数组代表从(i,j)坐标开始能滑到的最远距离.更新的方法为 遍历 ...

  3. POJ - 1191 棋盘分割 记忆递归 搜索dp+数学

    http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...

  4. CCCC L2-020. 功夫传人 搜索 bfs && 精度+ 特判

    https://www.patest.cn/contests/gplt/L2-020 题解:给你一颗树,让你遍历一遍,顺便更新一下数据,每次到根节点时将其对应的数据加到ans上面.这里用的bfs. 坑 ...

  5. 静默方式安装10g数据库软件+升级patch+手工建库

    通常我们安装Oracle数据库软件,都是用OUI图形界面来完成的,但有些Unix/Linux系统中并未安装图形系统,也就无法使用图形界面来安装Oracle的产品了,对于这种场景,就只能采用静默方式来安 ...

  6. https-->http and http-->https bitransfer

    openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -status -cert client.pem -ve ...

  7. extjs中的store

    1.store中重要的属性和方法 属性:data.proxy.reader.url.root .... 方法:load 2.理解:data--原料,proxy--运输车,reader--加工厂,sto ...

  8. 理解SQL Server中索引的概念,原理

    转自:http://www.cnblogs.com/CareySon/archive/2011/12/22/2297568.html 简介 在SQL Server中,索引是一种增强式的存在,这意味着, ...

  9. UIWebview于JS交互

    最近使用火车票网的限行网页,但是广告以及头部nav和地步footer都是我们现在所不需要的,所以决定使用js交互,下面所有代码都写在 webViewDidFinishLoad 里面 1.查看原网址的源 ...

  10. linux上mysql安装详细教程

    所有平台的MySQL下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. MySQL - MySQL服务器.你需要该选项,除非你只想连接运行 ...