Java类复用的两种方法:
第一种:只需在新的类中产生现有类的对象。由于新的类是由现有类的对象所组成,所有这种方法称为组合。该方法只是复用了现有程序代码的功能,而非它的形式。
第二种:按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。这种神奇的方式称为继承,而且编译器可以完成其中大部分工装。继承是面向对象程序设计的基石之一。
初始化基类
在构造器中调用基类构造器来执行初始化,而基类构造器具有执行基类初始化所需要的所有知识和能力。Java会自动在导出类的构造器中插入对基类构造器的调用。
名称屏蔽
@Override注解可以防止在不想重载时而意外的进行了重载。
组合与继承之间选择
组合和继承都允许在新的类中防止子对象,组合是显式的,继承是隐式的。
在继承的时候,使用某个现有类,并开发它的一个特殊版本。通常,这意味着你在使用一个通用类,并为了某种特殊需要而将其特殊化。“is-a”(是一个)的关系是用继承来表达 ,而“has-a”(有一个)的关系则是用组合来表达。
向上转型
“为新的类提供方法”并不是继承技术中最重要的方面,其最重要的是用来表现新类和基类之间的关系。这种关系可以用“新类是现有类的一种类型”这句话加以概括。
package javaBCSK;
class Instrument{
public void play(){}
static void tune(Instrument i)
{
i.play();
}
}
public class JavaBCSX extends Instrument{
public static void main(String[] args) {
JavaBCSX j = new JavaBCSX();
Instrument.tune(j);
}
}
在此例中,tune() 方法可以接受Instrument引用。但在JavaBCSX.main()中,传递给tune() 方法的是一个Wind引用。这种动作称之为向上转型。
------------------------------------------------------------------------------------------------------------------------------
final关键字
final数据
final数据作用:
- 一个永不改变的编译时常量。
- 一个在运行时被初始化的值,而不希望它被改变。
对于编译期常量这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,也就是说,可以在编译时执行计算式,这减轻了一些运行时的负担。在Java中,这类常量必须是基本数据类型,并且以关键字final表示。在对这个常量进行定义时,必须对其进行赋值。
final参数
Java运行在参数列表中以声明的方式将参数指明为final。这意味着你无法在方法中更改参数引用所指向的对象。
final方法
使用final方法的原因有两个。第一个原因是把方法锁定,以防止任何继承类修改它的含义。这是出于设计考虑:想要确保在继承中使方法行为保持不变,并且不会被覆盖。
过去建议使用final方法的第二个原因是效率。在Java的早起实现中,如果将一个方法指明为final,就是同意编译器将针对该方法的所以调用都转为内嵌调用。当编译器发现一个final方法调用命令时,它会根据自己的谨慎判断,跳过插入程序代码这种正常方式而执行方法调用机制,(将参数压入栈,跳至方法代码处并执行,然后跳回并清理栈中的参数,处理返回值),并且以方法体中的十级代码的副本来替代方法调用。这将消除方法调用的开销。当然,如果一个方法很大,你的程序代码就会膨胀,因而可能看不到内嵌带来的任何性能提高,因为所带来的性能提高会因为花费于方法内的时间量而被缩减。
但是现版本的Java中虚拟机(特别是Hotspot技术)可以探测到这些情况,并优化去掉这些效率反而降低的额外的内嵌调用,因此不需要使用final方法来进行优化了。所以,现在只有在想要明确禁止覆盖时,才将方法设置为final。
final类
当将某个类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这样做。
----------------------------------------------------------------------------------------------------------------------------------