• 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. 继承与初始化

      啦啦啦

  • 相关阅读:
    《七哥说道》第十八章:何处不风雨,套路说江湖
    《七哥说道》第十七章:北漂青年,人海茫茫
    《闲扯Redis四》List数据类型底层编码转换
    《闲扯Redis三》Redis五种数据类型之List型
    《闲扯Redis二》String数据类型之底层解析
    《闲扯Redis一》五种数据类型之String型
    Js解析Json数据获取元素JsonPath与深度
    《七哥说道》第十六章:程序员,江湖见
    Swagger2.9.2进入API界面报NumberFormatException异常
    绝顶高手必经之路【资源共享】
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/7668827.html
Copyright © 2020-2023  润新知