上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.1.2 最终类
1.final类
有一种类是不能派生出子类的,我们称这种类为最终类。即我们用final来修饰的类。在设计类时候,如果这个类不需要有子类,该类的实现细节不允许改变,并且确信这个类不会再被扩展,或者是为了特殊原因不让其他开发人员继承使用,那么就将该类设计为final类,比如Java提供的java.lang.String类。
2.final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。final方法不能被覆盖,即子类的方法构型不能与父类的final方法构型相同。
【例3-2】 使用final方法的例子。
class Test1 {
public void f1() {
System.out.println("f1");
}
// 无法被子类覆盖的方法
public final void f2(){
System.out.println("f2");
}
}
public class Test2 extends Test1{
public void f1() {
System.out.println("Test1父类方法f1被覆盖!");
}
public static void main(String[] args) {
Test2 t = new Test2();
t.f1();
t.f2();// 调用从父类继承过来的final方法
}
}
程序的运行结果如下:
Test1父类方法f1被覆盖! f2
如上面的例子所示,如果与重写f1()一样来重写f2(),则编译器就会给出出错信息。
特别提示:
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是由final修饰的。
3.final变量(常量)
final变量实际上是Java语言的符号常量,可在定义时赋初值或在定义后的其他地方赋初值,但不能再次赋值。习惯上使用大写的标识符表示final变量。例如:
final double PI=3.1416; final double G=9.18;
另外,final变量定义的时候,可以先声明,而不给初值,这种变量也称为final空白,空白final变量在对象初始化时必须被初始化。
工作分解-操作方案
(1)分析类及类结构;
(2)按照类图编制出类框架;
(3)实现类方法;
(4)创建对象;
(5)调用对象中的方法完成具体功能。
工作实施
1.分析类及关系
2.定义抽象类Animal
类图如图3-1所示。
图3-1 类图
abstract class Animal{ private final String type; public String getType() { return type; } public abstract void sound();//抽象方法 public Animal(String type){//为空白final属性赋初值 this.type = type; } }
3.Dog类利用构造方法为type属性赋值
public Dog() {
super("狗");
}
4.Dog类实现Animal的sound()
public void sound() { System.out.print(type+"的叫声是汪汪汪..."); }
5.main方法进行测试
public static void main(String args[]){ Dog d = new Dog(); d.sound(); }
6.完整源代码
abstract class Animal{ private final String type; public String getType() { return type; } public abstract void sound(); public Animal(String type) { this.type = type; } } class Dog extends Animal{ public Dog() { super("狗"); } public void sound() { System.out.print(super.getType()+"的叫声是汪汪汪..."); } }
程序运行结果:
狗的叫声是汪汪汪...