第7章 复用类 - 《Java编程思想》读书笔记

第7章 复用类

7.2 继承语法

7.2.1 初始化基类

  • Java会自动在导出类的构造器中插入对基类构造器的调用
  • 如果没有默认的基类构造器,就必须用super显式地调用基类构造器

7.3 代理

  • 太空船控制模块:
public class SpaceShipControls{
    void forward(int velocity){}
    void back(int velocity){}
}
  • 可以使用继承的方式构造太空船
public class SpaceShip extends SpaceShipControls{
    private String name;
    public SpaceShip(String name){
        this.name = name;
    }
    public static void main(String[] args){
        SpaceShip protector = new SpaceShip("NSEA Protector");
        protector.forward(100);
    }
}
  • 但SpaceShip并非真正的SpaceShipControls类型
  • 事实上,SpaceShip包含了SpaceShipControls,却可以直接使用SpaceShipControls中的方法
  • 代理:将一个成员置于所要构造的类中(就像组合),但与此同时,在新类中暴露了该成员对象的所有方法(就像继承)
public class SpaceShipDelegation{
    private String name;
    private SpaceShipControls controls = new SpaceShipControls();
    public SpaceShipDelegation(String name){
        this.name = name;
    }
    void forward(int velocity){
        controls.forward(velocity);
    }
    void back(int velocity){
        controls.back(velocity);
    }
    public static void main(String[] args){
        SpaceShipDelegation protector = new SpaceShipDelegation("NSEA Protector");
        protector.forward(100);
    }
}

7.7 向上转型

7.7.2 再论组合与继承

  • 如果必须向上转型,则继承是必要的
  • 如果不需要向上转型,则应当好好考虑自己是否需要继承

7.8 final关键字

7.8.1 final数据

  • 编译时常量:编译器可以将常量值代入任何可能用到它的计算式中,减轻运行时的负担

  • 在Java中,使用final关键字修饰编译时常量,必须是基本类型(引用不变,但指向的对象可以变,意义不大),定义时必须赋值

  • 既是static又是final的常量至占据一段不能改变的存储空间,通常用大写表示,并用下划线分割单词

  • final参数:无法在方法中更改参数并用所指向的对象

7.8.2 final方法

  • 使方法的行为保持不变,并且不会被重写
  • 在Java的早起实现中, final方法可以转为内嵌调用,提高效率,但现在不需要这么做
  • 所有private方法都隐式地指定为final

7.8.3 final类

  • final类不允许继承,数据可以选择是否final,方法默认final
posted @ 2021-03-02 16:39  一天到晚睡觉的鱼  阅读(61)  评论(0)    收藏  举报