复用类的主要方式有两种:组合,继承

组合

    例:

    class A {}

    class B {A a;}


继承

    继承是所有OOP语言和Java语言不可缺少的组成部分。当创建一个类时,总是在继承,因此,除非已明确指出要从其它类中继承,否则就是在隐式地从Java的标准根类Object进行继承。

    继承适用关键词:extends,继承会自动得到基类中所有的域和方法


super

    super关键字表示超类的意思,当前类就是从超类继承来的。调用超类方法:super.funcName();


初始化基类

    无参构造器,Java会自动在父类的构造器中插入对基类构造器的调用。

    带参构造器,就必须用关键词super显式地编写调用基类构造器的语句,并且配以适当的参数列表,而且super语句必须放在子类构造器的最开始位置,如:

    class A { A(int i) {print 'A'; }}

    class B extends B {B(int i) {super(i);print 'B'}}

    

代理

    使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象的方法的某个子集


protected关键字

    就类用户而言,这是private的,但对于任何继承于此类的导出类或其它任何位于同一个包的类来说,它却是可以访问的。projected也提供了包内访问权限

    尽管可以创建projected域,但是最好的方式还是将域保持为private;你应该一直保留"更改底层实现"的权利。然后通过projected方法来控制类的继承者的访问权限。


向上转型

    "为新的类提供方法"并不是继承技术中最重要的方法,其最重要的方面是用来表现新类和基类之间的关系。这种关系可以用"新类是现有类的一种类型" 这句话加以概括。

    将导出类引用转换为基类引用的动作,我们称之为向上转型

    由于向上转型是从一个较专用类型向较通用类型转换,所以总是很安全的。也就是说,导出类是基类的一个超集。它可能比基类含有更多的方法,但它必须至少具备基类中所含有的方法。在向上转型的过程中,类接口中唯一可能发生的事情就是丢失方法,而不是获取他们。这就是为什么编译器在"未曾明确表示转型"或"未曾指定特殊标记"的情况下,仍然允许向上转型的原因。

    在面向对象编程中,最常用的是直接开发类,或者运用组合技术使用现有类开发新的类。而继承技术其实是不太常用的,

而继承技术其实是不太常用的。因此,尽管在教授OOP的过程中我们多次强调继承,但这并不意味着要尽可能使用它。相反,应当慎用这一技术,其使用场合仅限于你确信使用该技术确实是有效的情况。到底是该用组合还是继承,一个最清晰的判断方法就是问一问自己是否需要从新类向基类进行向上转型。

如果必须向上转型,则继承是必要的。


final关键字

    根据上下文环境,Java的关键字final的含义存在着细微的区别,但通常它指的是"这是无法改变的"。不想做改变可能出于两种理由:设计和效率。由于这两个原因相差很远,所以关键字final有可能被误用


final数据

    一个既是static又是final的域只占据一段不能改变的存储空间。

    当对对象引用而不是基本类型运用final时,对于基本类型,final使数值恒定不变;而用于对象引用,final

使引用恒定不变。

    即是static又是final的域(即编译器常量) 将使用大写表示,并使用下划线分隔各个单词;




final参数

    Java允许在参数列表中以声明的方式将参数指明为final。这意味着你无法在方法中更改参数引用所指向的对象


空白final

    Java允许生成 "空白final",所谓空白final是指被声明为final但又未给定初值的域。无论什么情况,编译器都确保空白final在使用前必须被初始化。但是,空白final在关键词final的使用上提供了更大的灵活性,为此,一个类中的final域就可以做到根据对象而有所不同,却又保持其恒定不变的特性。

    如:

    public class Test {

        private final int i;

        private final String[] arr;

        public Test() {

            i = 1;

            arr = {"a","b"};

        }

        

        public Test(int i, String[] arr) {

            this.i = i;

            this.arr = arr;

        }

    }


final方法

    使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义。这是出于设计的考虑: 想要确保在继承中使方法行为保持不变,并且不会被覆盖。


final类

    当将某个类的整体定义为final时(通过将关键字final置于它的定义之前),就表明了你不打算继承该类,而且也不允许别人这么做。换句话说,出于某种考虑,你对该类的设计永不需要做任何变动,或者出于安全的考虑,你不希望它有子类。