1. 程式人生 > >面向對象之static與final關鍵字

面向對象之static與final關鍵字

span 基本類型 不可 但是 num [] 進行 面向對象 繼承

final關鍵字和static關鍵字

final關鍵字

final:在翻譯過來的意思就是最後的,最終的,不可改變的意思。在Java中同樣也是這個意思。那到底什麽時候可以用到final來修飾呢?都知道,繼承的應用提高了代碼的復用性,通過繼承,子類可以對父類的方法進行重寫,那如果有些父類中的方法是固定的,不想讓子類進行重寫,要解決這個問題就要用到final關鍵字,final關鍵字可以用來修飾類,類的成員,以及局部變量。

1、修飾類:final修飾的類是最終類,不能有子類,不能被繼承,但是可以繼承其他類,使用的方式不變,可以創建對象,調用方法。

2、修飾方法:final修飾的方法不能被子類重寫。

3、修飾變量:修飾變量的時候也分幾種情況

a、修飾局部變量:修飾的變量稱為常量,只能被賦值一次,賦值後終生不變。所以final一般做固定值的修飾。

b、修飾引用變量:變量保存的是內存的地址,被final修飾後就不能再重新創建。(因為如果再次用new進行創建就會再次產生新的地址),但是地址內的對象屬性值可以修改。

成員變量的兩種賦值方式:一種是定義時直接賦值,另一種是通過構造方法賦值(註意:不能用set方法進行賦值)。但是一般都是直接賦值,不通過構造方法賦值。

c、修飾成員變量:修飾成員變量,固定住的不是內存中的默認值,固定住的是手動賦給成員變量的值。如:final int a=1;

 1 package com.oracle.demo01;
 2 /*final修飾類:(太監類)
 3     被final修飾的類不能被繼承,但可以繼承別的類
 4 final修飾成員方法:
 5     1.該方法可以被子類繼承,但不能被重寫
 6     2.從父類那裏繼承繼承來的方法,重寫後可以加final關鍵字
 7 final修飾變量(基本類型還是引用數據類型):
 8     一次賦值  終身不變
 9 final修飾成員變量:
10     1.成員變量的初始值不能為系統賦的默認值(需要手動賦初始值)
11     2.可以通過構造方法賦值
12     3.一次賦值終身不變*/
13 public class Test { 14 public static void main(String[] args) { 15 Zi zi=new Zi(); 16 zi.method1(); 17 zi.method2(); 18 final int a=1; 19 final Fu fu=new Fu(); 20 //System.out.println(a); 21 } 22 }

static關鍵字

定義類的時候,類中都會有相應的屬性和方法,然而對這些方法的使用,都是通過創建本類的對象進行調用的,當調用對象的某個方法時,這個方法沒有訪問到對象的特有數據時,方法創建這個對象有些多余,但是不創建這個對象,方法又調用不了,那這種情況如何解決呢?這是我們就要用到static關鍵字了。Static是靜態修飾符,一般用來修飾類中的成員。

static的特點:

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

代碼演示

 1 class Demo {
 2 
 3     public static int num = 100;
 4 
 5 }
 6 
 7  
 8 
 9 class Test {
10 
11     public static void main(String[] args) {
12 
13         Demo d1 = new Demo();
14 
15         Demo d2 = new Demo();
16 
17         d1.num = 200;
18 
19         System.out.println(d1.num); //結果為200
20 
21         System.out.println(d2.num); //結果為200
22 
23     }
24 
25 }

2、被static修飾的成員可以並且建議通過類名直接訪問。

類名.靜態成員變量名

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

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

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

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

Static註意事項:

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

2、同一個類中,靜態成員只能訪問靜態成員,不能直接調用非靜態的。如果想要使用,要先創建對象。原因:生命周期不同,靜態優於非靜態存在於內存中,靜態存在時,非靜態還不存在。

代碼

 1 class Demo {
 2 
 3     //成員變量
 4 
 5     public int num = 100;
 6 
 7     //靜態成員變量
 8 
 9     public static int count = 200;
10 
11     //靜態方法
12 
13     public static void method(){
14 
15         //System.out.println(num); 靜態方法中,只能訪問靜態成員變量或靜態成員方法
16 
17         System.out.println(count);
18 
19     }
20 
21 }

使用場景:

成員變量使用static 根據具體的事物,具體分析問題,定義事物的時候,,將共性的數據定義為靜態的成員變量。

方法跟著變量走,如果方法中沒有調用非靜態成員變量,需要加靜態。

靜態調用:

多態調用:編譯都看父類,如果有,編譯成功,否則編譯失敗。運行時:靜態方法運行父類中的靜態方法,,非靜態方法:運行子類中重寫的方法。成員變量:運行編譯都看父類。註意:靜態方法與對象沒有關系。

定義靜態常量:

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

定義格式:

public static final 數據類型 變量名 = 值;

如:

class Company {

    public static final String COMPANY_NAME = "盧肖正";

    public static void method(){

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

    }

}

當我們要使用靜態類時,不需要創建對象,直接使用類名來訪問即可:

1 System.out.println(Company.COMPANY_NAME); //打印姓名
2 
3 Company.method(); // 調用一個靜態方法

註意:

接口中的每個成員變量都默認使用public static final修飾。

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

如:

interface Inter {

    public static final int COUNT = 100;

}

  // 訪問接口中的靜態變量

Inter.COUNT

圖解:

技術分享圖片

面向對象之static與final關鍵字