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()+"的叫声是汪汪汪...");
                }
            }

程序运行结果:

            狗的叫声是汪汪汪...