上一篇:类和对象之初始化和清除
类的组合的实现很简单,只需要在新类中置入对象句柄即可:
class Door{
//字段和方法
}
class Wheel{
//字段和方法
}
public class Car{
Door d = new Door();
wheel w = new wheel();
//其他字段和方法
}
类的继承需要使用关键字extends. 创建一个类时肯定会使用继承,因为每个类都是继承自根类Object.
class animal{
int year;
void play(){
System.out.println("play");
}
}
class dog extends animal{
void run{
System.out.println("run");
}
}
继承中衍生类的初始化问题:
继承中方法名的隐藏问题:
有一个方法名被“过载”使用多次,在衍生类里对那个方法名的重新定义就不会隐藏任何基础类的版本。所以无论方法在这一级还是在一个基础类中定义,过载都会生效(和C++不同)。效果如下:
组合 or 继承?
其实这涉及到设计模式的问题----组合模式。如果一个问题可以描述成整体和部分的关系,组合模式是最合适的,比如上面的汽车类和车门、轮子、发动机类之间的关系。而继承则适用于属于关系,如上面的动物类和狗类、猫类之间的关系。
因为组合有着极大的简洁性和灵活性,所以一般情况优先考虑利用组合。有一种情况必须使用继承--上溯造型。
上溯造型:取得 一个对象句柄,并将其作为基础类型句柄使用。
继承的一个好处是它支持“累积开发”,允许我们引入新的代码,同时不会为现有代码造成错误。这样可将 新错误隔离到新代码里。
final关键字:
Java中用final关键字来声明某个东西不能被改变。对于基本数据类型,final 会将值变成一个常数;但对于对象句柄,final 会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。然而,对象本身是可以修改的。
final参数:方法的参数可以设置为final,这意味着在这个个方法的内部,我们不能改变参数句柄。
final方法:第一是方法“上锁”,防止任何继承类改变它的本来含义。第二是程序执行的效率。
只要编译器发现一个final 方法调用,就会忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。相反,它会用方法主体内实际代码的一个副本来替换方法调用。这 样做可避免方法调用时的系统开销。当然,若方法体积太大,那么程序也会变得雍肿,可能受到到不到嵌入代码所带来的任何性能提升。Java 编译器能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个 final 方法。然而,最好还是不要完全相信编译器能正确地作出所 有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为 final。 类内所有private 方法都自动成为final。
final类:将类定义成 final 后,结果只是禁止进行继承——没有更多的限制。然而,由于它禁止了继承,所以一个 final 类中的所有方法都默认为 final。