【Java编程思想】第七章 复用类

复用代码是JAVA众多引人注目的功能之一,但要想成为极具革命性的语言,仅仅能够复制代码对对之改变是不够的

一、组合

这种方式最常用,因为构建新类的时候最可能的是需要某个类的某些功能。

二、继承

OOP语言必不缺少的特性。从实际中理解是,is-a的关系,新类和基类是同样的类型,新类是基类的特殊实现而已。

2.1 向上转型

继承最为重要的方面是用来表现新类和基类之间的关系,这种关系可以用"新类是基类的一种类型"
为什么向上转型:
这个是最重要的,我感觉是因为多态,然后有了动态链接,这样只有在运行的时候才确定调用哪段代码,使程序就有更高的复用性和可维护性。
在向上转型中,类接口唯一可能发生的事情就是丢失方法,而不是获取他们。这句话的意思就是,如果新类比基类多个mehtod1,在向上转型的过程中,method1会丢失,调用不到。

到底是试用继承还是组合,其中一个比较重要的判断标准:是否需要从新类向基类进行向上转型,如果需要一定要用继承,否则进行综合考虑

继承还有一个重要的功能:那就是体系,一系列类构成体系,这样代码就会非常明了。
还有就是很多的设计模式基本都是构建在继承或者实现体系上的,这让继承更有优势,这个也是我需要努力提高区分组合和继承的地方

2.2 final

2.2.1 final修饰数据

修饰基本类型代表改引用的值不能改变,修饰对象代表引用的地址不能改变,但是地址对应的对象是可以改变的。

如果static+fianl ,这个就是编译时常量,占据一段不能改变的存储空间。

JAVA允许空白final,也就是声明为final,但是不给他初始化

2.2.2 final修饰方法

final修饰的方法不能为覆盖。

什么是覆盖呢?覆盖只有在某些方法是基类的接口的一部分才回出现。

这就意味着,如果某个基类中有private 方法,那么即使新类中有和基类这个private相同的方法,这个也不是覆盖,只是新类的私有方法而已,因为向上转型的过程中,基类无法调用到改方法。所以private的方法无法覆盖

private方法都隐式的指定为final

2.2.3 final修饰类

final修饰的类无法被继承。

fianl修饰的类中方法都隐式的指定为fianl

当处于安全或者该类的设计永不需要变动可以考虑fianl,比如String、StringBuilder等等都是fianl的。

三、代理

其实我感觉这个不就是组合的特殊方式

package com.hfview.proxy;

/**
 * 太空飞船类
 * 演示继承和组合中庸之道-----代理
 * 虽然是组合,但是飞船控制器的所有接口方法都在新类太空飞船中实现了,又好像继承。
 * 其实我感觉这个不就是组合的特殊方式
 * 飞船和飞船控制器并非is-a关系,更像has-a关系
 * @author: zhw
 * @since: 2019/3/5 14:13
 */
public class SpaceShip {

    private SpaceShipControls spaceShipControls;

    public void up(){
        spaceShipControls.up();
    }

    public void down(){
        spaceShipControls.down();
    }

    public void forward(){
        spaceShipControls.forward();
    }

    public void back(){
        spaceShipControls.back();
    }

}

/**
 * 飞船控制器
 */
class SpaceShipControls{

    public void up(){

    }

    public void down(){

    }

    public void forward(){

    }

    public void back(){

    }
}

你可能感兴趣的:(读JAVA编程思想有感)