java程序設(shè)計:對Final的一點(diǎn)認(rèn)識

字號:

在編程的過程中,我們總是會遇到final關(guān)鍵字,那么我們對final怎么理解呢,下面是一點(diǎn)粗淺認(rèn)識,和大家共享。
    package zy.pro.jbd.demo;
    public class FinalDemo {
    final  int  numInt1=16;
    final String str="zy";
    final String str1;
    注意:str1在此沒有初始化,那么必須要在構(gòu)造函數(shù)中初始化,否則要報錯。也就是說,final變量必須要進(jìn)行初始化。
    public FinalDemo() {
    str1="zy";
    }
    public static void main(String[] args){
    System.out.println("-------------------------------------------------");
    }
    public void executeFinalTest(){
    }
    private void testFinalInt(){
    numInt1+=1;
    上面,我們定義了numInt1為final變量,在次將會出現(xiàn)一個錯誤:cannot assign a final value to final variable numInt1 at line 24
    由此可見,如果一個基本型別的變量被定義成了final,那么此變量將不能再被改變。
    System.out.println(numInt1);
    }
    private void testFinalString(){
    str=str+"aaaaa";
    此處同樣也會報錯。
    System.out.println(str);
    }
    }
    我們再作一個測試:
    (1)先創(chuàng)建一個類:A.java
    package zy.pro.jbd.testbase;
    public class A {
    int t=10;
    public A() {
    }
    public void setT(int t){
    this.t=t;
    }
    public int getT(){
    return this.t;
    }
    }
    (2)寫如下測試代碼
    final A a = new A();
    public void testFinalObject() {
    a.setT(29);
    System.out.println("t:   " + a.getT());
    }
    測試輸出的結(jié)果是:
    t:   29
    由此可見,結(jié)果發(fā)生了改變,說明final定義的變量是可以改變的,但是改變的不是變量的引址(即reference),而是變量的內(nèi)容。
    我們?nèi)绻麑懭缦麓a
    /*
    * some error will be threw
    A b=new A();
    a=b;
    */
    則會發(fā)生錯誤,說明final類型的對象不能指向另外一個同類型的對象上邊說的比較亂,我們總結(jié)一下:
    總結(jié):
    (1)Final 修飾 基本類型變量,則此變量是不可改變的
    (2)Final 修飾 對象,則其指向是不能改變的,但是其值是允許改變的.(即對象中的任一個屬性發(fā)生改變都意味著此對象的值發(fā)生了改變)
    (3)Final 修飾方法,則此方法將不能被重載,但是能被繼承,也就是說在子類中可以調(diào)用父類的final方法;private方法僅允許在父類中調(diào)用.在子類中你也可以定義同名的方法,這意味著,private方法對子類來說是不可見的.
    附錄:
    1)  A.java
    package zy.pro.jbd.testbase;
    public class A {
    int t=10;
    public A() {
    }
    public void setT(int t){
    this.t=t;
    }
    public int getT(){
    return this.t;
    }
    public final void finalA(){
    System.out.println(" final  method  finalA");
    }
    private void privateA(){
    System.out.println("private method privateA");
    }
    private final void privateFinalA(){
    System.out.println("private final method privateFinalA");
    }
    }
    2)  AA.java 繼承自A.java
    package zy.pro.jbd.testbase;
    public class AA
    extends A {
    public AA() {
    }
    /*
    public final void finalA(){
    System.out.println(" final  method  finalA");
    }
    這幾行代碼是錯誤的
    */
    private void privateA() {
    System.out.println("private method privateA in class AA");
    } private final void privateFinalA() {
    System.out.println("private final method privateFinalA in class AA");
    }
    }
    3)我的測試程序FinalDemo.java
    package zy.pro.jbd.demo;
    /**
    * this demo is created to test the usage of the final reserved word
    */
    import zy.pro.jbd.testbase.A;
    public class FinalDemo {
    final int numInt1 = 16;
    final String str = "zy";
    final String str1;
    final A a = new A();
    public FinalDemo() {
    str1 = "zy";
    }
    public static void main(String[] args) {
    System.out.println("-------------------------------------------------");
    FinalDemo fd = new FinalDemo();
    fd.executeFinalTest();
    }
    public void executeFinalTest() {
    this.testFinalInt();
    this.testFinalString();
    this.testFinalObject();
    }
    private void testFinalInt() {
    //numInt1+=1;
    System.out.println(numInt1);
    }
    private void testFinalString() {
    //str=str+"aaaaa";
    System.out.println(str);
    }
    public void testFinalObject() {
    a.setT(29);
    System.out.println("t:   " + a.getT());
    /*
    * some error will be threw
    A b=new A();
    a=b;
    */
    }
    }