20145216史婧瑶《Java 程序设计》第4周学习总结
20145216 《Java程序设计》第4周学习总结
教材学习内容总结
第六章 继承与多态
6.1 何谓继承
继承基本上就是避免多个类间重复定义共同行为。
在Java中,继承时使用extends关键字,private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(如果父类愿意提供访问方法的话)。如:
public class SwordsMan extends Role
{
public void fight()
{
System.out.println("挥剑攻击");
}
}
继承范例:
public class RPG1
{
public static void main(String[] args)
{
demoSwordsMan1();
demoMagician1();
} static void demoSwordsMan1()
{
SwordsMan1 swordsMan1 = new SwordsMan1();
swordsMan1.setName("Justin");
swordsMan1.setLevel(1);
swordsMan1.setBlood(200);
System.out.printf("剑士:(%s,%d,%d)%n",swordsMan1.getName(),swordsMan1.getLevel(),swordsMan1.getBlood());
} static void demoMagician1()
{
Magician1 magician1 = new Magician1();
magician1.setName("Monica");
magician1.setLevel(1);
magician1.setBlood(100);
System.out.printf("魔法师:(%s,%d,%d)%n",magician1.getName(),magician1.getLevel(),magician1.getBlood());
}
}
继承的好处:若你要将name、level、blood改为其他名称,那就只要修改Role.java就可以了,只要是继承Role的子类都无须修改。
在Java中,子类只能继承一个父类,继承有个重要的关系,就是子类与父类间会有is-a的关系,中文称为“是一种”的关系。
检查多态语法逻辑是否正确,方式是从=右边往左读;右边是不是一种左边呢(右边类型是不是左边类型的子类)?如果不是就会编译失败,如果加上扮演(Cast)语法,编译程序就让程序代码通过编译,不过后果得自行负责,也就是扮演失败,执行时会抛出ClassCastException。
多态就是使用单一接口操作多种类型的对象。
在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。如:
父类:
public class Role3
{
...
public void fight()
{
//子类要重新定义fight的实际行为
}
}
子类:
public class SwordsMan3 extends Role3
{
public void fight()
{
System.out.println("挥剑攻击");
}
}
如果在子类中某个方法前标注@Override,表示要求编译程序检查,该方法是不是真的重新定义了父类中某个方法,如果不是的话,就会引发编译错误。
如果某方法区块中真的没有任何程序中代码操作,可以使用abstract标示该方法为抽象方法,该方法不用撰写{}区块,直接“;”结束即可。
子类如果继承抽象类,对于抽象方法有两种做法: 一种做法是继续标示该方法为abstract;另一种做法就是操作抽象方法。
6.2 继承语法细节
- 被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类直接存取。如:
父类:
public abstract class Role5
{
protected String name;
protected int level;
protected int blood;
...略
}
子类:
public class SwordsMan5 extends Role5
{
...
public String toString()
{
return String.format("剑士 (%s,%d,%d",this.name,this.level,this.blood);
}
}
Java中有public、protected与private三个权限关键字,但实际上有四个权限范围:
在Java中,如果想取得父类中的方法定义,可以在调用方法前,加上super关键字。如:
public class SwordsMan6 extends Role6
{
...
@Override
public String toString()
{
return "剑士" + super.toString();
}
}
重新定义方法要注意,对于父类中的方法权限,只能扩大但不能缩小。
如果子类构造函数中没有指定执行父类中哪个函数,默认会调用父类中无参数构造函数。
this()与super()只选择一调用,而且一定要在构造函数第一行执行。
如果class前使用了final关键字定义,那么表示这个类是最后一个了,不会再有子类,也就是不能被继承。定义方法时,也可以限定该方法为final,这表示最后一次定义方法了,也就是子类不可以重新定义final方法。
在Java中,子类只能继承一个父类,如果定义类时没有使用extends关键字指定继承任何类,那一定是继承java.lang.Object。
第七章 接口与多态
7.1 何谓接口
对于“定义行为”,在Java中可以使用interface关键字定义。如:
public interface Swimmer1
{
public abstract void swim();
}
接口可以用于定义行为但不定义操作。
类要操作接口,必须使用implements关键字。操作某接口时,对接口中定义的方法有两种处理方式:一是操作接口中定义的方法;二是再度将该方法标示为abstract。如:(第二种方法)
public abstract class Fish1 implements Swimmer1
{
protected String name;
public Fish1(String name)
{
this.name = name;
} public String getName()
{
return name;
}
@Override
public abstract void swim();
}
以Java的语意来说,继承会有“是一种”关系,操作接口则表示“拥有行为”,但不会有“是一种”的关系。
在Java中,类可以操作两个以上的类,也就是拥有两种以上的行为。如:
public class Seaplane3 implements Swimmer1,Flyer3
{
private String name;
public Seaplane3(String name)
{
this.name = name;
}
@Override
{
System.out.printf("海上飞机 %s 在飞%n",name);
}
@Override
public void swim()
{
System.out.printf("海上飞机 %s 航行海绵%n",name);
}
}
在Java中,类可以同事继承某个类,并操作某些接口。如:
public class FlyingFish3 extends Fish1 implements Flyer3
{
public FlyingFish3(String name)
{
super(name);
} @Override
public void swim()
{
System.out.println("飞鱼游泳");
} @Override
public void fly()
{
System.out.println("飞鱼会飞");
}
}
在Java中,接口可以继承自另一个接口,也就是继承父接口行为,再在子接口中额外定义行为。如:
父类:
public class Boat4 implements Swimmer1
{
protected String name;
public Boat4(String name)
{
this.name = name;
}
@Override
public void swim()
{
System.out.printf("船在水面 %s 航行%n", name);
}
}
子类:
public class Submarine4 extends Boat4 implements Diver4
{
public Submarine4(String name)
{
super(name);
}
@Override
public void dive()
{
System.out.printf("潜水艇 %s 潜行%n",name);
}
}
7.2 接口语法细节
在Java中,可使用interface来定义抽象的行为与外观,如接口中的方法可声明为public abstract。
接口中的方法没有操作时,一定得是公开且抽象。
在接口中枚举常数,一定要使用=指定值。并且接口枚举常数一定是public static final。
接口可以继承别的接口,也可以同时继承两个以上的接口,同样也是使用extends关键字,这代表了继承父接口的行为。
如果有临时继承某个类或操作某个接口并建立实例的需求,而这类子类或接口操作类只使用一次,不需要为这些类定义名称,这是可以使用匿名内部类来解决这个需求。匿名内部类的语法为:
new 父类()|接口(){
//类本体操作
};
enum实际上定义了类,而enum中枚举的常数,实际上是public static final,且为枚举类型实例,无法撰写程序直接实例化枚举类型,因为构造函数权限设定为private,只要类中才可以实例化。如:
import static java.lang.System.out; public class EnumGame
{
public static void main(String[] args)
{
play(EnumAction.RIGHT);
play(EnumAction.UP);
} public static void play(EnumAction action)
{
switch (action)
{
case STOP:
out.println("播放停止动画");
break;
case RIGHT:
out.println("播放向右动画");
break;
case LEFT:
out.println("播放向左动画");
break;
case UP:
out.println("播放向上动画");
break;
case DOWN:
out.println("播放向下动画");
break;
}
}
}
教材学习中的问题和解决过程
问题:
在结合教材、视频和老师博客中的学习指导学习了第六、七章后,发现对于老师给出的思考题——接口与抽象类的区别还是不太清楚。
解决过程:
通过上网百度,我终于弄明白了接口与抽象类的区别,以下是我根据查找的资料总结的二者区别:
语法层面上的区别
1、抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract方法; 2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的; 3、一个类只能继承一个抽象类,而一个类却可以实现多个接口。
设计层面上的区别
1、抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象;抽象类是对整个类整体进行抽象,包括属
性、行为,但是接口却是对类局部(行为)进行抽象。 2、对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接
口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
代码调试中的问题和解决过程
问题:
由于教材中的很多范例代码的类名都相同,于是我在类名后编上了号,结果自己敲完代码后出现如图所示错误:
解决过程:
经过反复查看错误代码,我发现该代码中的声明类型(Role)没有与父类的类名(Role1)保持一致,于是我做了以下修改:
最后运行得到正确结果:
总结:
给类名编号后虽然解决了类名重复的问题,但是在敲代码时特别容易出错,因为很多程序代码都是相关联的,必须始终保持创建时的类名和引用时的名称一致,所以在敲代码时一定要细心,并且要先弄懂每行代码的含义,这样才能尽量避免代码中的错误。
本周代码托管截图
其他(感悟、思考等,可选)
本周主要学习了继承与接口的相关知识点,虽然内容较多,对我来说也有一定难度,但是经过对教材的反复研读与琢磨,还是可以慢慢理解和掌握的,当然我也有过因为理解不了代码的含义而烦躁的时候,也想过直接按照书上的代码敲,放弃理解不懂的内容,但是静下心来,还是决定要好好学这门课,其实教材的讲解很详细,代码实例也都与我们所熟悉的内容相关,比如第六章是游戏中的角色,第七章是开发一个海洋乐园游戏,还有类图以及其他的图片解释,这些都方便了我的理解,所以,尽管在学习Java的过程中有许多困难,但是只要自己不放弃就能一一解决问题。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4500行 | 30篇 | 350小时 | 能将java运用自如 |
第一周 | 150/150 | 2/2 | 15/15 | 学习了与java相关的基础知识 |
第二周 | 200/350 | 1/3 | 20/35 |
学习了java的基本语法 |
第三周 | 450/800 | 1/4 | 25/60 |
学习了对象和封装的相关知识 |
第四周 | 687/ 1487 | 1/5 | 30/90 |
学习了继承与接口的相关知识 |
参考资料
20145216史婧瑶《Java 程序设计》第4周学习总结的更多相关文章
- 20145216史婧瑶《网络对抗》Web安全基础实践
20145216史婧瑶<网络对抗>Web安全基础实践 实验问题回答 (1)SQL注入攻击原理,如何防御 攻击原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些 ...
- 20145216史婧瑶《网络对抗》Web基础
20145216史婧瑶<网络对抗>Web基础 实验问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签.表单域.表单按钮. (2)浏览器可以 ...
- 20145216史婧瑶 《网络对抗》 MSF基础应用
20145216史婧瑶 <网络对抗> MSF基础应用 实验回答问题 用自己的话解释什么是exploit,payload,encode. exploit:渗透攻击模块,测试者利用它来攻击一个 ...
- 20145216史婧瑶《网络对抗》逆向及Bof进阶实践
20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢 ...
- 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可以 ...
随机推荐
- Memcached 之 .NET(C#)实例分析
一:Memcached的安装 step1. 下载memcache(http://jehiah.cz/projects/memcached-win32)的windows稳定版(这里我下载了memcach ...
- Python--进阶处理7
# ====================第七章:函数========================= # 为了能让一个函数接受任意数量的位置参数,可以使用一个* 参数# 为了接受任意数量的关键字 ...
- Spring-AOP的五种通知和切面的优先级、通知变量声明
SpringAOP的通知分为以下五种: 1前置通知(@before)在连接点执行之前执行的代码 2后置通知(@after)在连接点执行之后执行的代码,不管连接点执行后是否出现异常,后置通知都会执行,但 ...
- C/C++编译过程
C/C++编译过程 C/C++编译过程主要分为4个过程 1) 编译预处理 2) 编译.优化阶段 3) 汇编过程 4) 链接程序 一.编译预处理 (1)宏定义指令,如#define Name Token ...
- content: "\e600"
w图标生成原理. <style> @font-face { font-family: iconfont-sm; src: url(//at.alicdn.com/t/font_143340 ...
- 关于spring的applicationContext.xml配置文件的ref和value之自我想法
今天在做SSH的一个项目的时候,因为需要定时操作,所以就再sping里面加入了一个quartz的小定时框架,结果在运行时候,发生了一个小bug. Caused by: org.springframew ...
- android开发笔记(二)导入项目到eclipse和另一个项目
NND,eclipse里导入工程出现问题了,整了半天,来个这问题,无效工程描述,找了半天看.projec文件是否工程名对应,看androidManifest.XML换里面的代码版本号,我擦都无济于事. ...
- alexnet,VGG,googlenet,resnet
非常好的一篇:https://my.oschina.net/u/876354/blog/1637819 alexnet和VGG没什么特别的,VGG深一些. Deep learning 实际上是一种 f ...
- 获取当前文件夹以及子文件夹下所有文件C++
void getFiles( string path,vector<string>& files) { //文件句柄 ; //文件信息 struct _finddata_t fil ...
- DNS 知识点
总结: DNS解析过程:主机查看本地缓存,然后向本地域名服务器进行递归查询,本地域名服务器向根,顶级,权限进行迭代查询 DNS 解析过程: 1.查看浏览器缓存 2.查看os缓存 w ...