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

教材学习内容总结

继承

  • 继承基本上就是避免多个类间重复定义共同行为。要避免在程序设计上出现重复,可以把相同的程序代码提升为父类。

  • 关键字extends的用法:A extends B表示A会扩充B的行为,A继承了B的行为,也可以在A的程序中继续扩充B原本没有的行为。

  • 关于继承的代码如下。

      public class RPG1
    {
    public static void main (String[] args)
    {
    demoSwordsMan();
    demoMagician();
    }
    static void demoSwordsMan()
    {
    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 demoMagician()
    {
    Magician1 magician = new Magician1();
    magician.setName("Moinca");
    magician.setLevel(1);
    magician.setBlood(100);
    System.out.printf("魔法师 :(%s ,%d ,%d)%n",magician.getName(),
    magician.getLevel(),magician.getBlood()); }
    }
  • 运行结果如下。

  • 子类和父类之间有 is-a 的关系,检查语法逻辑是否正确的方法是看等号的右边类是不是左边类的子类。通过使用 is-a 规则,可以避免使用重载的繁琐,使程序具有更高的可维护性。代码如下。

      public class RPG2
    {
    public static void main(String[] args)
    {
    SwordsMan1 swordsMan = new SwordsMan1();
    swordsMan.setName("Justin");
    swordsMan.setLevel(1);
    swordsMan.setBlood(200); Magician1 magician = new Magician1();
    magician.setName("Monica");
    magician.setLevel(1);
    magician.setBlood(100); showBlood(swordsMan);
    showBlood(magician); }
    static void showBlood(Role1 role)
    {
    System.out.printf("%s 血量 %d%n",role.getName(),role.getBlood());
    }
    }
  • 运行结果如下。

  • 子类在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,这称为重新定义。要注意重新定义父类中某个方法时,子类必须撰写与父类中相同的签署。代码如下。

      public class RPG3
    {
    public static void main(String[] args)
    {
    SwordsMan3 swordsMan3 = new SwordsMan3();
    swordsMan3.setName("Justin");
    swordsMan3.setLevel(1);
    swordsMan3.setBlood(200); Magician3 magician3 = new Magician3();
    magician3.setName("Monica");
    magician3.setLevel(1);
    magician3.setBlood(100); drawFight(swordsMan3);
    drawFight(magician3); }
    static void drawFight(Role3 role)
    {
    System.out.print(role.getName());
    role.fight3();
    }
    }
  • 运行结果如下。

  • 内建的标准标注为@Override,表示要求编译程序检查该方法是不是真的重新定义了父类中某个方法。

  • 若某方法区块中没有任何程序代码操作,则可用abstract标示该方法为抽象方法,直接";"结束即可,表示这个类定义不完整。

继承语法

  • 如果父类中数据成员被定义为private无法直接在子类中存取,又不想开放访问权限时,可以定义这些数据成员为protected

  • 被声明为protected的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类直接存取。

  • Java中共有四个权限范围:private,无关键字,protected,public,权限依次从小到大。

  • 如果想取得父类中的方法定义,可以在调用方法前,加上super关键字,使用super关键字调用的父类方法,不能定义为private

  • 如果想执行父类中某构造函数,可以使用super()指定。子类构造函数中没有指定执行父类中哪个构造函数,默认会调用父类中无参数构造函数。

  • 如果class前使用了final关键字,表示这个类是最后一个,不会再有子类,也就是不能被继承。

  • 使用数组收集各种对象,可声明为Object[]类型,不限长度地收集对象代码如下。

      import java.util.Arrays;
    
      public 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());
    }
    }
    }
  • 运行结果如下。

  • 执行流程中,无法通过变量参考的对象,就是JVM垃圾收集机制认定的垃圾对象。

  • 在取得用户输入、显示结果的环境未定时,可以通过设计来解决。以猜数字游戏为例,可以将此程序分为GuessGame.javaConsoleGame.javaGuess.java三个部分。最后程序执行结果如下。

接口

  • 对于定义行为,可以使用interface关键字定义,接口中的方法不能操作,直接标示为abstract,而且一定是public

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

  • 操作同一个接口,提高可维护性的代码如下。

     public class Ocean{
    public static void main(String[] args)
    {
    doSwim(new Anemonefish("尼莫"));
    doSwim(new Shark("兰尼"));
    doSwim(new Human("贾斯汀"));
    doSwim(new Submarine("黄色一号"));
    } static void doSwim(Swimmer swimmer){
    swimmer.swim();
    }
    }
  • 运行结果如下。

  • 类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口,接口与接口之间可以有继承关系。各个类与接口代码已托管至开源中国,程序运行结果如下。

接口语法

  • 可使用interface来定义抽象的行为与外观,接口中的方法没有操作时,一定得是公开且抽象,此时可以省略public abstract

  • 使用匿名内部类,直接建立操作对象代码如下。

      public class MultiChat{
    public static void main(String[] args){
    Client c1=new Client("127.0.0.1","Caterpillar");
    Client c2=new Client("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);
    }
    }
  • 运行结果如下。

  • enum语法可用于定义枚举常数。enum定义了特殊的类,直接撰写程序继承Enum类会被编译程序拒绝。对enum的使用代码如下。

      import static java.lang.System.out;
    public class Game2{
    public static void main(String[] args){
    play(Action2.RIGHT);
    play(Action2.UP);
    }
    public static void play(Action2 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;
    }
    }
    }
  • 运行结果如下。

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

  • 问题:如果没有使用IDEA,还有什么方法可以让有继承和接口的程序正确执行?
  • 解决:尚未解决。

开源中国代码托管截图如下









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

进入java学习的第四周,完成每一周的学习任务已经成为一种习惯了,学会了怎样在周一发布学习任务后到周日提交博客前合理地分配学习时间,不会再像之前把任务都堆积到周末完成。这样的学习模式让我每一天过得更充实了。自己动手敲代码,让代码成功运行也成为了一种乐趣。本周还学会了统计代码行数,这让我对自己的学习情况有了量化指标的掌握,也更有了满足感。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 1/3 20/40
第三周 400/900 1/4 25/65
第四周 1236/2136 1/5 30/95

参考资料

20145214 《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. notpad++ 搭配 gcc

    notpad++ 搭配 gcc GCC 是 GNU 编译器套装的简称(GNU Compiler Collection),一套编程语言编译器,以 GPL 及 LGPL 许可证所发行的自由软件,也是 GN ...

  2. MongoDB入门---文档查询之$type操作符&limit方法&skip方法&简单排序(sort)操作

    上一篇文章呢,已经分享过了一部分查询操作了,这篇文章呢?就来继续分享哈.接下来呢我们直接看MongoDB中的$type操作符哈.它呢是基于BSON类型来检索集合中匹配的数据类型,并且返回结果,在Mon ...

  3. [Real World Haskell翻译]第24章 并发和多核编程 第一部分并发编程

    第24章 并发和多核编程 第一部分并发编程 当我们写这本书的时候,CPU架构正在以比过去几十年间更快的速度变化. 并发和并行的定义 并发程序需要同时执行多个不相关任务.考虑游戏服务器的例子:它通常是由 ...

  4. 黑匣子_KEY

    黑匣子 (box.pas/c/cpp) [ 问题描述] 某研究小组成员想发明一个黑匣子( 当然不是飞机上那个), 而是一个具有特殊功能的箱子. 这个箱子具有两个功能: 1. 存放一些正整数 x: 2. ...

  5. 成都Uber优步司机奖励政策(4月6日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. Spring源码分析——JdbcTemplate执行批量insert操作

    最近用到一个方法: @Override public int[] batchUpdate(String sql, final BatchPreparedStatementSetter pss) thr ...

  7. 单目、双目和RGB-D视觉SLAM初始化比较

    无论单目.双目还是RGB-D,首先是将从摄像头或者数据集中读入的图像封装成Frame类型对象: 首先都需要将彩色图像处理成灰度图像,继而将图片封装成帧. (1) 单目 mCurrentFrame = ...

  8. Redis系列五 Redis持久化

    Redis持久化 一.RDB(Redis DataBase) 1.介绍 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里. Red ...

  9. 「日常训练」 Counting Cliques(HDU-5952)

    题意与分析 题源:2016ACM/ICPC沈阳现场赛. 这题让我知道了什么是团,不过最恶心的还是这题的数据了,卡了无数次- - 解决方法是维护一个G数组,不能去遍历邻接矩阵.至少我改了这么一个地方就过 ...

  10. VIN码识别/车牌识别:是入口,是门面

    汽车后市场高速发展下,汽车用品.零配件及售后服务已经从实体店延伸至线上,无论是整车厂.4S店.传统的汽修店,还是汽配商,都渴望用更合理的.高效的方式,实现运营管理上的突破. 广州云实信息科技有限公司( ...