教材学习内容总结

· Chapter 继承与多态

继承:避免多个类间重复定义共同行为。继承可以理解为一个对象从另一个对象获取属性的过程。
所有Java的类均是由java.lang.Object类继承而来的,所以Object是所有类的祖先类,而除了Object外,所有类必须有一个父类。
将相同的代码提升为父类,继承消除重复代码。

public class Role{
    private String name;
    private int leval;
    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;
    }
}

使用estends关键字进行继承,扩充Role的行为。

public class SwordsMan extends Role{
    public void fight(){
        System.out.println("挥剑攻击");
    }
}
public class Magician extends Role{
    public void fight(){
        System.out.println("魔法攻击");
    }
    public void cure(){
        System.out.println("魔法治疗");
    }
}

从以下的程序结果可以看出继承。

public class RPG{
    public static void main(String[] args){
        demoSwordMan();
        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 coid demoMagician(){
        Magician magician =new Magician();
        magician.setname("Monica");
        magician.setLevel(1);
        magician.setBlood(100);
        System.out.printf("魔法师:(%s,%d,%d)%n",magician.getName(),magician.getLevel(),magician.getBlood());
    }
}

结果如图

教材中通过设计一款RPG游戏的部分代码向我们展示了“重复”程序代码的弊端,SwordsMan与Magician没有定义getName()等方法,但从Role得到继承,可以直接使用。

  • private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取

  • 子类只能继承一个父类(单一继承)

  • 类与类之间要有所属is-a “是一种”关系

Role role1= new SwordsMan();
SwordsMan swordsMan= role1;
SwordsMan swordsMan= (SwordsMan)role1;
   

//SwordsMan是一种Role
//role1为Role声明的名称,Role不一定是一种SwordsMan,编译失败
//别啰嗦!通过编译,后果自负

多态:使用单一接口操作多种类型的对象。具有更高的可维护性。用父类声明对象引用,用子类生成对象 就有了多态。
既可以通过Role类型操作SwordsMan对象,也可以通过Role类型操作Magician对象,这就是多态。

作用:多态的存在提高了程序的扩展性和后期可维护性
前提:需要存在继承或者实现关系 要有覆盖操作

Override:在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,称为重新定义(Overeide)在子类中某个方法前标注@Override,表示要求编译程序检查,该方法是不是真的重新定义了父类中某个方法。在重新定义父类中某个方法的时候,子类必须撰写与父类方法中相同的签署,加上@Override可用来检查该方法是否真的重新定义了父类中的某个方法,防止打错字,否则就会发生错误。

书中关于@Override描述不是很清晰,看了视频就可以得到一些补充。

  • Override也称函数覆盖,重写,复写
  • 父类中的私有方法不可以被覆盖
  • 在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取
  • 覆盖时,子类方法权限一定不能小于父类方法权限
  • 当子类需要父类的功能,而功能主题子类有自己特有内容时,可以override父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容

abstract:如果某方法区块中真的没有任何程序代码操作,可以使用abstruct标示该方法为抽象方法,该方法不用撰写{}区块,直接“;”结束即可。内含抽象方法的类,一定要在class前标示abstract。

public abstract class Role{
......略
public abstract void fight();
}

protected成员:相同包中的类可以直接存取,不同包中的类可以再继承后的子类直接存取。
权限大小: private<无关键字<protected<public

Super:如果想取得父类中的方法定义,可以在调用方法前,加上super关键字。不能定义为private(这就限定只能在类中使用)。重新定义方法要注意对于父类中的方法权限只能扩大不能缩小

 public String toString(){
      return "剑士" + super.toString();

垃圾回收:在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?(Java垃圾回收机制:http://www.cnblogs.com/dolphin0520/p/3783345.html)


· 接口与多态

抽象类:java可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的就是抽象类。抽象类和抽象方法必须用abstruct关键字来修饰。

interface:接口定义行为但不可定义操作。 接口中的成员修饰符是固定的。类与接口是实现关系,而且类可以继承一个类的同时实现多个接口。

public interface Swimmer{
    public abstract void main swim();
}

implements:类要操作接口,使用implements关键字,操作接口时,对接口中定义的方法的两种处理方式:1.操作接口中定义的方法,2.将该方法标示为abstract

例如:

public abstract class Fish implements Swimmer {
protected String name;
public Fish(String name){
    this.name = name;
}
public String getName(){
    return name;
}
@Override
public abstract void swim();
}

类与类之间存在着继承关系,类与接口中间存在的是实现关系。继承用extends,实现用implements

在interface接口中常常可以定义枚举常数(例:public static final int),实际上,在interface接口中也只能定义public static final的枚举常数,并且一定要使用=指定值,否则就会编译错误。

抽象类与接口的区别
1:抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都有抽象方法,需要子类去实现。
3:抽象类使用的是 is a 关系。
接口使用的 like a 关系。
4:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。全都是public的。

enum:enum语法可用于定义枚举常数,enum实际上定义了类,而enum中列举的常数实际上是public static final,无法撰写程序直接实例化枚举类型,因为构造函数权限设定为private,只有类中才可以实例化。enum 可定义枚举常数,但实际上 enum 定义了特殊的类,继承自 java.lang.Enum,编译过后会产生 Action.class 文件,可用这个 Action 声明类型

public class Game {
    public static void main(String[] args){
        play(Action.RIGHT);
        play(Action.UP);
//只能传入 Action 实例
    }

    public static void play(Action action){
// action 参数声明为 Action 类型,所以只接受 Action 的实例,这样就不需要必须使用 default 检查,编译程序在编译时期会进行类型检查
        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;
        }
    }
}

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

刚开始学习继承的时候敲第一个角色游戏代码出现错误,在继承的时候,需要将完整的代码都放在同一个文件夹下,书中有时候只是展现一部分代码,但前面的角色定义还要敲上去,保证代码的完整性,这样子类才会继承父类。
教材中的一些内容讲得十分详尽,例如多态与is-a,翻来覆去讲不同的语句可能出现的编译失败的情况及原因,这部分的学习也十分重要,关系到以后写出来的东西有没有弹性、好不好维护的问题;书中也有一些表述比较少,让人看得不是很懂的地方,例如instanceof运算符,Override等,只能通过视频加以学习。现阶段还停留在敲书上代码的过程,希望自己能够在接下来提出些更有价值的问题。

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

interface Some {
    protected static final int x = 10;
}
public class Main {
    public static void main (String[] args){
        System.out.println(Some.x);
    }
}

被声明为protected的成员,相同包中的类可以直接存取,不同包中的类需要在继承后的子类中存取。代码中没有继承关系不同类,编译失败,删去protected编译通过结果为10

本周代码托管截图













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

随着编写的代码越来越长,即使是按着书上敲代码,有时候也会弹出来很多错误,有的是因为大小写没有正确书写,有的是因为代码片段不全导致编译错误,还是实践的时候缺少动脑去思考,思考为什么语句要这样写,语法遵循着怎样的格式,这都是需要多看代码,多敲代码才能形成的一种思维能力。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 4000行 16篇 400小时
第一周 200/200 2/2 20/20
第二周 300/400 1/3 25/45
第三周 500/900 1/4 40/85
第四周 800/1700 1/5 45/130

参考资料

20145232 韩文浩 《Java程序设计》第4周学习总结的更多相关文章

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

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

  2. 20155213 2016-2017-2 《Java程序设计》第二周学习总结

    20155213 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 关于Unicode和UTF 很抱歉,没能读完娄老师推荐的网址,关于Unicode和UTF的介 ...

  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. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  8. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  9. 学号 20175212 《Java程序设计》第九周学习总结

    学号 20175212 <Java程序设计>第九周学习总结 教材学习内容总结 一.MySQL数据库管理系统 1.在官网上下载并安装MySQL 2.在IDEA中输入测试代码Connectio ...

  10. 20165223《JAVA程序设计》第二周学习总结

    20165223 <JAVA程序设计>第二周学习总结 教材学习内容总结 第二章要点 标识符与关键字 基本数据类型 类型转换运算 输入输出数据 数组 第三章要点 运算符与表达式 语句概述 i ...

随机推荐

  1. IIS站点报拒绝访问Temporary ASP.NET Files的解决办法

    IIS站点本来运行的好好的,突然就出现了:Temporary ASP.NET Files拒绝访问的问题.遇到此类问题,请逐步排查,定可解决. 原因:Windows操作系统升级导致. 办法: 1.检查C ...

  2. python 面向对象编程 之 反射

    1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  3. laravel中类似于thinkPHP中trace功能

    答案来自https://segmentfault.com/q/1010000007716945 一楼: 到 https://packagist.org 上搜索你想要的关键词,比如查debugbar 列 ...

  4. android开发中一个activity如何调用另一个xml中的控件

    有时候,我们需要在一个activity中使用另一个activity中的控件,这时候就不能直接findViewById,不然会报错指向空对象,这时就需要像下面这样做. LayoutInflater fa ...

  5. C# 切换到二级域名,使用Cookie

    之前的网站一直用的是一级域名,现因为其他原因,需要使用一个二级域名访问,原先的域名不用了. 使用二级域名后,发现Cookie一直取不到,分析代码发现,原来是需要在设置cookie的时候,把二级域名加上 ...

  6. LibreOJ #6002. 「网络流 24 题」最小路径覆盖

    #6002. 「网络流 24 题」最小路径覆盖 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

  7. Netty 源码 Channel(一)概述

    Netty 源码 Channel(一)概述 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Channel 为 Netty ...

  8. 【C++】c++中栈 队列 的应用

    C++中提供了STL模板statck 在使用的时候更为方便 除了一般的队列外 还有STL更有双向队列可以使用 #include<deque> 声明:deque <type > ...

  9. delphi 中如何访问另一个类中到私有方法?(转载)

    原始连接 http://rvelthuis.blogspot.tw/2018/01/accessing-private-methods-of-another.html Accessing privat ...

  10. Enjoy Markdown!

    有一个神奇的语言,比HTML简单,它巧妙地将内容与格式结合在一起,它就是Markdown! 下面是一个用C语言写的四则运算小测试~ #include <stdio.h> #include ...