java -> final與static 關鍵字

來源:互聯網
上載者:User

標籤:company   特點   round   多態   rgs   記錄   父類   賦值   需要   

final的概念

  繼承的出現提高了代碼的複用性,並方便開發。但隨之也有問題,有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之後,就可以對其中的方法進行重寫,那怎麼解決呢?要解決上述的這些問題,需要使用到一個關鍵字final,final的意思為最終,不可變。final是個修飾符,它可以用來修飾類,類的成員,以及局部變數。不能修飾構造方法。

final的特點

  final修飾類不可以被繼承,但是可以繼承其他類。

  final 除了構造方法不能修飾,其餘的均可修飾;

  class Yy {}

  final class Fu extends Yy{} //可以繼承Yy類

  class Zi extends Fu{} //不能繼承Fu類

  final修飾的方法不可以被子類重寫但可以繼承,父類中沒有被final修飾方法,子類重寫後可以加final。

  class Fu {     

      // final修飾的方法,不可以被覆蓋,但可以繼承使用

      public final void method1(){}

      public void method2(){}

  }

  class Zi extends Fu {

      //重寫method2方法

      public final void method2(){}

  }

  final修飾的變數稱為常量,這些變數只能賦值一次。而且終身不變。

  final int i = 20;

  i = 30; //賦值報錯,final修飾的變數只能賦值一次

  參考型別的變數值為對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改。

  final Person p = new Person();

  Person p2 = new Person();

  p = p2; //final修飾的變數p,所記錄的地址值不能改變

  p.name = "小明";//可以更改p對象中name屬性值

  p不能為別的對象,而p對象中的name或age屬性值可更改。

 

  修飾成員變數,需要在建立對象前賦值,否則報錯。可以通過構造方法進行賦值(當沒有顯式賦值時,多個構造方法的均需要為其賦值

  class Demo {

     //直接賦值

      final int m = 100;

      //final修飾的成員變數,需要在建立對象前賦值,否則報錯。

      final int n;

      public Demo(){

          //可以在建立對象時所調用的構造方法中,為變數n賦值

          n = 2016;

      }

  }

 

 

static概念

  當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過建立本類對象調用的。當在調用對象的某個方法時,這個方法沒有訪問到對象的特有資料時,方法建立這個對象有些多餘。可是不建立對象,方法又調用不了,這時就會想,那麼我們能不能不建立對象,就可以調用方法呢?

可以的,我們可以通過static關鍵字來實現。static它是靜態修飾符,一般用來修飾類中的成員。

static特點

  被static修飾的成員變數屬於類,不屬於這個類的某個對象。(也就是說,多個對象在訪問或修改static修飾的成員變數時,其中一個對象將static成員變數值進行了修改,其他對象中的static成員變數值跟著改變,即多個對象共用同一個static成員變數)

                  代碼示範:

class Demo {

    public static int num = 100;

}

 

class Test {

    public static void main(String[] args) {

        Demo d1 = new Demo();

        Demo d2 = new Demo();

        d1.num = 200;

        System.out.println(d1.num); //結果為200

        System.out.println(d2.num); //結果為200

    }

}

 

  被static修飾的成員可以並且建議通過類名直接存取。

  訪問靜態成員的格式:

    類名.靜態成員變數名

    類名.靜態成員方法名(參數)

  對象名.靜態成員變數名       ------不建議使用該方式,會出現警告

  對象名.靜態成員方法名(參數)    ------不建議使用該方式,會出現警告

                  代碼示範:

class Demo {

    //靜態成員變數

    public static int num = 100;

    //靜態方法

    public static void method(){

        System.out.println("靜態方法");

    }

}

class Test {

    public static void main(String[] args) {

        System.out.println(Demo.num);

        Demo.method();

    }

}

static注意事項

  靜態內容是優先於對象存在,只能訪問靜態,不能使用this/super。靜態修飾的內容存於靜態區。

class Demo {

    //成員變數

    public int num = 100;

    //靜態方法

    public static void method(){

        //this.num; 不能使用this/super。

        System.out.println(this.num);

    }

}

 

  同一個類中,靜態成員只能訪問靜態成員

class Demo {

    //成員變數

    public int num = 100;

    //靜態成員變數

    public static int count = 200;

    //靜態方法

    public static void method(){

        //System.out.println(num); 靜態方法中,只能訪問靜態成員變數或靜態成員方法

        System.out.println(count);

    }

}

 

l  main方法為靜態方法僅僅為程式執行入口,它不屬於任何一個對象,可以定義在任意類中。

l  多態調用方法中,編譯看=左邊,父類有,編譯成功,父類沒有,編譯失敗

運行,靜態方法,運行父類中的靜態方法,

運行,非靜態方法,運行子類的重寫方法

成員變數,編譯運行全是父類

定義靜態常量

開發中,我們想在類中定義一個靜態常量,通常使用public static final修飾的變數來完成定義。此時變數名用全部大寫,多個單詞使用底線串連。

定義格式:

public static final 資料類型 變數名 = 值;

如下示範:

class School {

    public static final String SCHOOL_NAME = "北京大學";

    public static void method(){

        System.out.println("一個靜態方法");

    }

}

當我們想使用類的靜態成員時,不需要建立對象,直接使用類名來訪問即可。

System.out.println(Company.SCHOOL_NAME);

Company.method(); // 調用一個靜態方法

 

 注意:

介面中的每個成員變數都預設使用public static final修飾。

所有介面中的成員變數已是靜態常量,由於介面沒有構造方法,所以必須顯示賦值。可以直接用介面名訪問。

interface Inter {

    public static final int COUNT = 100;

}

         提供者中的靜態變數

Inter.COUNT

java -> final與static 關鍵字

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.