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关系。通俗的来讲:是可行的,但是<public class SwordsMan extends Role1,Role2...>这种继承就是不可行的。
至于多态,书中的定义是:多态就是使用单一接口操作多种类型的对象,书中给出了一个很经典的范例:代码为:

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

参考资料

posted @ 2016-03-27 00:46  20145107lcd  阅读(188)  评论(3编辑  收藏  举报