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

字號(hào):

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