20145107 《Java程序设计》第四周学习总结
20145107 《Java程序设计》第4周学习总结
教材学习内容总结
本周进行了Java第四周的学习,学习的主要内容使6,7两张,内容比较多,也非常的重要。
第六章的内容是继承与多态:
6.1.1
继承作为面向对象的第二大特征,基本上就是避免多个类间重复定义共同行为。即当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的那个类即可。我们也把单独抽取出来的那个类称为父类,其他的多个类称为子类。这样做的好处有很多,继承的出现提高了代码的复用性,也让类与类之间产生了关系,提供了多态的前提。书中用了一个游戏开发的例子向我们讲述了应用继承的好处。在书中有如下代码:
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;
}
}
这个代码就是所谓的父类,在这个代码中,程序定义了角色名称,角色等级,角色血量等基本信息,以及一些基本的调用项目。而后,书中又编写了两个小程序,这两个小程序可以看做是上面那个代码的子类,同时这两个小程序又为主类定义了新的方法他们的代码如下:
package cc.openhome;
public class SwordsMan extends Role
{
public void fight()
{
System.out.println("剑士攻击");
}
}
还有:
package cc.openhome;
public class Magician extends Role
{
public void fight()
{
System.out.println("魔法攻击");
}
public void cure()
{
System.out.println("魔法治疗");
}
}
最后,书中用一个例子来对继承进行总结:
package cc.openhome;
import javax.management.relation.*;
public class RPG extends Role
{
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.printf("剑士:(%s,%d,%d)%n",swordsMan.getName(),
swordsMan.getLevel(),swordsMan.getBlood());
}
static void demoMagician()
{
Magician magician = new Magician();
magician.setName("Moinca");
magician.setLevel(1);
magician.setBlood(100);
System.out.printf("魔法师:(%s,%d,%d)%n",magician.getName(),
magician.getLevel(),magician.getBlood());
}
}
最后一个程序即调用了上面的父类,他在上面继承了一些方法,所以在子程序中就不必声明。这样做还有很多的好处,当我们要对name,level,blood等进行修改时,只需要修改Role.java中的内容就行了。程序在idea上的运行如下所示:
6.1.2
多态与is-a:
java语言中只支持单继承,不支持多继承,子类只能继承一个父类,这种子类父类之间的关系就是is-a关系。通俗的来讲:
至于多态,书中的定义是:多态就是使用单一接口操作多种类型的对象,书中给出了一个很经典的范例:代码为:
package cc.openhome;
public class RPG2
{
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.setLevel(1);
magician.setBlood(100);
showBlood(swordsMan);
showBlood(magician);
}
static void showBlood(Role role)
{
System.out.printf("%s 血量 %d%n",role.getName(),role.getBlood());
}
}
程序在idea上的运行如下所示:
他给我们举出的例子想要说明的是:在showBlood方法中,我们可以使用Role这个父类对SwordsMan和Magician两个对象进行操作,而不用在子类中对他们分别进行操作,这种方法显然给我们带来了更大的便捷。
6.1.3 重新定义的行为:
子类在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。要注意重新定义父类中某个方法时,子类必须撰写与父类中相同的签署。书中给出了如下的代码:
package cc.openhome;
public class RPG3
{
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("Moinca");
magician.setLevel(1);
magician.setBlood(100);
drawFight(swordsMan);
drawFight(magician);
}
static void drawFight(Role role)
{
System.out.print(role.getName());
role.fight();
}
}
程序在idea中的运行如下所示:
6.2.5 有关继承语法中的Java.lang.Object:
我们在前面已经学过:Java.util.Scanner以及Java.math.BigDecimal,这里有接触到了新的东西,<java.lang.Object>是最上层父类,Java中所有对象一定是一种Object.在Java中,自来只能继承一个父类,如果在定义类的时候没有指定要继承哪一类,那么这个类就一定是继承<java.lang.Object>。书中给了我们一个数组收集对象的程序,以下定义的ArrayList类可以不限长度的收集对象,程序如下:
package cc.ArrayList;
import java.util.Arrays;
class ArrayList
{
private Object[] list;
private int next;
public ArrayList(int capacity) {
list=new Object[capacity];
}
public ArrayList() {
this(16);
}
public void add(Object o) {
if(next==list.length) {
list=Arrays.copyOf(list, list.length*2);
}
list[next++]=o;
}
public Object get(int index) {
return list[index];
}
public int size() {
return next;
}
}
书中还有使用自定义的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());
}
}
}
程序在idea中的运行如下所示:
第七章:
第七章的内容是接口与多态。
对于接口的定义行为在Java中可以使用
eg:在interface中,可以定义常数。
public interface Action
{
public static final int STOP=0;
public static final int RIGHT=1;
public static final int LEFT=2;
public static final int UP=3;
public static final int DOWN=4;
}
eg:枚举常数:
import static java.lang.System.out;
public class Game{
public static void main(String[] args){
play(Action.RIGHT);
play(Action.UP);
}
public static void play(int action){
switch(action){
case Action.STOP:
out.println("播放停止动画");
break;
case Action.RIGHT:
out.println("播放向右动画");
break;
case Action.LEFT:
out.println("播放向左动画");
break;
case Action.UP:
out.println("播放向上动画");
break;
case Action.DOWN:
out.println("播放向下动画");
break;
default:
out.println("不支持此动作");
}
}
}
将以上两个程序放在同一个包中,运行下面那个程序,既有如下结果:
类要操作接口,必须使用
1.操作接口中定义的方法
2.再度将该方法标示为abstract。
关键字接口具有如下特点:
1.接口是对外暴露的规则。2.接口是程序的功能扩展。3.接口可以用来多实现。4.类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。5.接口与接口之间可以有继承关系。
相应程序范例如下,书中例子较多,这里只举一个。
public class Ocean{
public static void main(String[] args)
{
doSwim(new Human("贾斯汀"));
doSwim(new Submarine("黄色一号"));
}
static void doSwim(Swimmer swimmer){
swimmer.swim();
}
}
教材学习中的问题和解决过程
这两周的学习任务越来越重,但已经逐渐进入了Java中最为关键的部分,对对象的理解也更加的深入了好多,在一开始并不知道接口的用法,也不知道继承怎样使用,只是好多代码在idea中都运行不了,这是非常苦恼的事,后来,在同学的帮助下,我对一些代码进行了整合,把特定组合的代码放在特定的包里,这样代码才能运行,Java相对于c语言来说还是有很多的高级之处的,。
代码调试中的问题和解决过程
在一开始的继承问题中,我先是写了父类的Java文件。单独运行不了,再写子类的文件单独运行,也是运行不了效果就像这样:
后来,同学说,要把这两个文件放在一个包里,这样才可以运行,后来一试,果然成功了!
本周代码托管截图
本周代码数量统计情况:
其他(感悟、思考等,可选)
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 250/300 | 2/4 | 18/38 | |
第三周 | 300/500 | 3/7 | 22/60 | |
第四周 | 500/750 | 2/9 | 30/90 |