Java学习之路(七)
文章目录
前言
主要解决的问题:
关键字:final
抽象类和抽象方法
一、关键字:final
1.1 final的意义
final用来修饰一个类,意味着该类成为不能被继承的最终类。出于安全性的原因和效率上的考虑,有时候需要防止一个类被继承。
例如:Java类库中的String类,它对编译器和解释器的正常运行有着很重要的作用,不能轻易改变它,因此把它修饰为final类,使它不能被继承,这就保证了String类的惟一性。同时,如果你认为一个类的定义己经很完美,不需要再生成它的子类,这时也应把它修饰为final类。
1.2 final 修饰类
格式:
final class ClassName{ ...}
- final用来修饰一个类,意味着该类成为不能被继承的最终类。
- 声明为final的类隐含地声明了该类的所有方法为final方法。
- 声明一个类既为abstract,又为final是非法的,因为抽象类必须被子类继承来实现它的抽象方法。
1.3 final修饰成员变量
- 变量被声明为final后,成为常值变量(即常量),一旦被通过某种方式初始化或赋值,即不能再被修改。
- 通常static与final一起使用来指定一个类常量(全局常量)。例如:
static final int SUNDAY=0;
把final变量用大写字母和下划线来表示,这是一种编码规定。
- final标记的成员变量必须在声明时或在每个构造器中或代码块中显式赋
值,然后才能使用。
1.4 final修饰成员方法
- 用final修饰的方法为最终方法,不能再被子类重写,
可以被重载
。 - 方法被声明为final有时可以提高性能:编译器可以自由地内联调用它们,因为它“知道”它们不会被子类重写。
二、抽象类和抽象方法
2.1抽象类和抽象方法的意义
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模 板,是所有子类保留的行为方式。
在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
2.2抽象类与抽象方法
- 抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重
写父类的抽象方法,并提供方法体。 - 若没有重写全部的抽象方法,仍为抽象类。
- 含有抽象方法的类必须被声明为抽象类。
- 抽象方法:只有方法的声明,没有方法的实现。以分号结束
- 不能用abstract修饰变量、代码块、构造器;
- 不能用abstract修饰私有方法、静态方法、final的方法、final的类。
2.3 注意事项
2.3.1 关于抽象类的构造函数
的问题
- 抽象类的构造方法定义为 Protected, 因为它只被子类使用。
- 创建一个具体子类的实例时,它的父类的构造方法被调用以初始化父类中定义的数据域。
2.3.2抽象类与常规类的区别
- 抽象类不能使用new 操作符创建它的实例.
- 不能使用 new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。例如:
GeometricObject[] objects = new CeometricObject[10];
然后可以创建一个 CeometricObject 的实例, 并将它的引用赋值给数组,如下所示:
Objects[0] = new Triangle();