Java final介绍

来源:互联网 发布:照片分析软件 编辑:程序博客网 时间:2024/06/05 18:01

一、final变量
final关键字可用于变量声明,被final修饰的变量就不能更改值的大小,例如:

final double PI = 3.14

如果再次对final的常量赋值则编译器就不会接受。
final定义的变量必须在声明时对其进行进行赋值操作,final除了能修饰基本数据类型的常量,还可以修饰对象引用,所以final可以修饰数组,一个对象引用被修饰为final之后是无法将其改变指向另一个对象的(一个既是static又是final的字段只占据一段不能改变的存储空间)。
例子:

import java.util.Random;import static java.lang.System.out;class Test1 {    int i = 0;}public class FinalData {    static Random rand = new Random();    private final int VALUE_1 = 1;//声明一个final常量    private static final int VALUE_2 = 2;//声明一个final,static常量    private final Test1 test1 = new Test1();//声明一个final引用    private Test1 test2 = new Test1();//声明一个不是final的引用    private final int[] a = { 1, 2, 3, 4, 5 };//声明一个final修饰的数组    private final int i4 = rand.nextInt(20);    private static final int i5 = rand.nextInt(20);    public String toString() {        return i4 + " " + i5 + " ";    }    public static void main(String[] args) {        FinalData data = new FinalData();        //可以对指定为final的引用中的成员变量进行赋值,但不能讲定义为final的引用指向其他引用        // data.test1 = new Test1();        // data.VALUE_2++;        data.test2 = new Test1();        for(int i = 0; i < data.a.length;i++){            //a[i] = 9;        }        System.out.println(data);        System.out.println("--------");        System.out.println(new FinalData());    }}

运行结果是:
这里写图片描述
由结果可以看出i5被static final修饰,所以i5是固定不会变的。而i4是只能赋值一次之后,不能再对其赋值。
再看下面一个例子:

import java.util.Random;import java.lang.*;public class FinalStaticData {    private static Random rand = new Random();// 实例化一个random类对象    // 随机产生一个0-15之间的数赋予定义为final的a1    private final int a1 = rand.nextInt(15);    private static final int a2 = rand.nextInt(15);    public static void main(String[] args) {        FinalStaticData fdata = new FinalStaticData();// 实例化对象        // 调用定义为final对象的a1        System.out.println("a1 " + fdata.a1);// a1的值        // 调用定义为final,static对象a2        System.out.println("a2 " + fdata.a2);// a2的值        // 实例化另一个对象        FinalStaticData fdata1 = new FinalStaticData();        System.out.println("第二个a1 " + fdata1.a1);        System.out.println("第二个a2 " + fdata1.a2);    }}

结果是:
这里写图片描述
上面的代码验证了定义为static,final的值是不变的。

二、final方法
final定义的方法是可以防止子类覆盖父类的方法,执行效率也要远高于非final方法,定义为private的方法隐式的就是final型 ,所以定义为private方法是不愿要再定义为final型的

package com.example.finalmethod;class Parents {    private final void doit() {        System.out.println("父类的第一个方法");    }    final void doit1() {        System.out.println("父类的第二个方法");    }    public void doit2() {        System.out.println("父类的第三个方法");    }}class Sub extends Parents {    public final void doit() {        System.out.println("子类的第一个方法");    }    // final void doit1(){    // System.out.println("子类的第二个方法");    // }    public void doit2() {        System.out.println("子类的第三个方法");    }}public class FinalMethod {    public static void main(String[] args) {        Sub s = new Sub();        s.doit();        Parents p = s;        // p.doit();//private修饰的是无法覆盖的        p.doit1();        p.doit2();    }}

运行结果
这里写图片描述

结果证明父类中的定义的final方法是不能覆盖重写的,但是貌似定义为final和static是可以覆盖的,但是在main方法中,我们不难发现p是不能调用doit方法的,所以说在子类的方法中只是新的方法,并不是覆盖了父类的方法。

三、final类
定义为final类不能被继承,而且其他类是不能对其修改的

package com.example.finalmethod;public class FinalClass {    int a = 2;    void doit() {    }    public static void main(String[] args) {        FinalClass fclass = new FinalClass();        int b = (fclass.a) + 1;        System.out.println(b);    }}

结果如下
这里写图片描述

0 0
原创粉丝点击