复用类

Java中复用代码是引人注目的功能之一,通常有两种方法:

  • 在新的类产生现有类的对象,由于新的类是有现有类的对象,因此该方法称为组合,它复用了先有代码的功能,而非形式。

  • 按照现有类的形式创建新类,该方法称为继承

组合语法

非常简单,只需将对象的引用至于新类中,例如:

1
2
3
4
5
6
class A {
private B b;
A(){
b = new B();
}
}

所有非基本类型的的类都有一个toString()方法(该方法是Object类中的)。toString默认返回:类名@对象名,有需要可以自行重载返回的值。

继承

继承是面向对象不可获取的部分,任何类都是隐式继承Object类。使用extends关键字。当初始化子类时,先调用积累的构造函数,在调用子类的。

代理

除了组合继承之外,类之间还有一种神奇的关系,就是代理。它是组合和继承的和,我们定义一个新类,新类中有一个其他类的对象,但同时我们在新类中暴露了该其他类对象
的所有方法,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A{
void f1();
void f2();
void f3();
}
class B{
A a;
void f1(){
a.f1();
}
void f2(){
a.f2();
}
}

那么这么做什么好处呢?好处之一就是我们可以选择提供部分成员对象(a)的方法,而非全部。(不提供f3方法),Java不直接支持代理

protect关键字

声明为protected的方法和成员变量能被同一个包里的所有类所访问,也可以被其他包继承了该类的类的方法或对象使用。

向上转型

一定程度上,继承为多态提供了基础,它提供了一种新的关系,即子类时基类的一种类型,它可以保证基类的所有方法在子类中都有效,因此,子类就可以看成是基类,所有
向基类发送的消息同样能够想子类发送(多态)。

final关键字

final数据

Java中的关键字final表示这是无法改变的,它可作用于数据,方法和类。如果作用于数据,它表示这块数据是恒定不变的,一般有两种情况:

  • 一个永远不改变的编译时常量

  • 在运行时初始化,之后不希望改变它。

对于情况1中的编译时常量,在程序编译时将其带入了任何可能用到它的公式中,在编译时执行计算,从而减小运行时的压力。编译时常量必须是基本数据类型,并且在定义时必须赋值
而如果final修饰的是对象,即变量是个引用,那么表示它永远只能指向某个对象,不能指向其他对象,而对象本身是可变的。

一个既是static,又是final的变量,表示它只占据一个不可改变的存储空间。

final方法

作用于方法之上的final,可以把方法锁定,防止继承类修改它的含义;同时也保证该方法不会被覆盖,含义不会变。
private有隐式指定final的意思,因此private final并不会带来额外的效果。(ps:如果某个基类的方法是private,继承它的子类可以有同名的方法,但是不是覆盖的形式,也不能实现多态)

final类

表示该类不能被继承