• ThinkingInJava 学习 之 0000006 复用类


      1. 组合语法

        将对象引用置于新类中。

      2. 继承语法

        衍生类自动获得基类中所有的域和方法

        super关键字表示基类。

        1. 初始化基类

          当创建一个衍生类的对象时,该对象创建一个基类的子对象并包含子对象。

          衍生类实例化时,首先实例化基类,然后在实例化衍生类。

          Java 会自动在衍生类的构造器中插入对基类默认构造器的调用。

          如果基类没有默认构造器,则必须在衍生类构造器中指定基类可用的构造器来初始化基类。

          基类在衍生类构造器可以访问它之前,就必须完成初始化。

      3. 代理

        第三种关系称为代理,Java并没有提供对它的直接支持。这是继承与组合之间的中庸之道,因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。

        例如,太空船需要一个控制模块,构造太空船的一种方式时使用继承(太空船SpaceShip继承控制模块SpaceShipControls)。然而,SpaceShip并非真正的SpaceShipControls类型,更准确地讲,SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法在SpaceShip中都暴露了出来。

        代理解决了此难题:

          Class :SpaceShipControls

    package lime.thinkingInJava._007003;
    
    public class SpaceShipControls {
        void up(int velocity){}
        void down(int velocity){}
        void left(int velocity){}
        void right(int velocity){}
        void forward(int velocity){}
        void back(int velocity){}
        void turboBoost(int velocity){}
    }

          Class : SpaceShipDelegation

    package lime.thinkingInJava._007003;
    
    public class SpaceShipDelegation {
        private String name;
        private SpaceShipControls controls = new SpaceShipControls();
    
        public SpaceShipDelegation(String name) {
            this.name = name;
        }
    
        public void back(int velocity){
            controls.back(velocity);
        }
        public void down(int velocity){
            controls.down(velocity);
        }
        public void forward(int velocity){
            controls.forward(velocity);
        }
        public void left(int velocity){
            controls.left(velocity);
        }
        public void right(int velocity){
            controls.right(velocity);
        }
        public void turboBoost(int velocity){
            controls.turboBoost(velocity);
        }
        public void up(int velocity){
            controls.up(velocity);
        }
       public static void main(String[] args){
           SpaceShipDelegation protector = new SpaceShipDelegation("Lime Protector");
           protector.forward(100);
       }
    }

        可以看到,上面的方法是如何传递给了底层的controls对象,而其接口由此也与使用继承得到的接口相同了。但是,我们使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集,或在调用底层的controls对象的方法时执行其他逻辑。如:

        public void forward(int velocity){
            System.out.println("执行其他逻辑。。。");
            controls.forward(velocity);
            System.out.println("执行其他逻辑。。。");
        }

      4. 结合使用组合和继承

        1. 确保正确清理

        2. 名称屏蔽

      5. 在组合与继承之间选择

      6. protected关键字

      7. 向上转型

        1. 为什么称为向上转型

        2. 再论组合与继承

      8. final关键字

        1. final数据

          1.final参数

        2. final方法

          1. finali和private关键字

        3. final类

        4. 有关final的忠告

      9. 初始化及类的加载

        1. 继承与初始化

      啦啦啦

  • 相关阅读:
    如何在 Windows 7 上安装 TeX Live 2018
    CF 964C Alternating Sum
    WF 18 A 想法
    CLion 使用笔记
    数理统计学复习
    ssh无密码访问设置(ssh-keygen 的详解)
    mysql开启远程连接的方法
    mysql命令大全
    Linux下创建仓库的软件包createrepo
    Linux 格式化分区 报错Could not stat --- No such file or directory 和 partprobe 命令
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/7668827.html
Copyright © 2020-2023  润新知