3分鐘弄明白JAVA三大修飾符

3分鐘弄明白JAVA三大修飾符


JAVA的三個修飾:static,final,abstract,在JAVA語言裏無處不在,但是它們都能修飾什麼組件,修飾組件的含義又有什麼限制,總是混淆。所以來總結對比一下。


1 static靜態修飾符


static修飾符能夠修飾屬性,方法,初始代碼塊。不能修飾局部變量和類。

首先要明白屬性分爲靜態和非靜態,靜態的稱爲靜態屬性,又叫類變量,非靜態的稱爲實例變量。

靜態變量和靜態方法統稱爲靜態成員。


修飾屬性

靜態屬性又稱類變量,它不屬於某個對象,是屬於類的,是所有對象共同享有。

eg:類名.靜態屬性 =對象1.靜態屬性=對象2.靜態屬性=同一塊內存裏所對應的地址

修飾方法

1:靜態方法可以直接類名.方法名調用。

2:靜態方法裏只能:訪問靜態成員,不能訪問非靜態成員。

3:靜態方法裏不能用this關鍵字。

4:靜態法法裏沒有多態,只能被靜態方法覆蓋。


修飾初始代碼塊

static修飾初始代碼塊稱爲靜態代碼塊。靜態代碼塊是在類加載的時候運行。這裏回顧一下類加載。



類加載:

//TestPerson .java

 class Person{ 

     static{

          System.out.println("static here");

     }

     public Person(){

          System.out.println("構造方法");

     }

}

public class TestPerson(){

     public static void main(){

         Person p1 = new Person();

         Person p2 = new Person(); 

     }

}

運行 TestPerson .java文件會編譯生成TestPerson .class 和 Person.class兩個class文件。

執行java  TestPerson 首先會啓動JAVA虛擬機(JVM),然後再硬盤上找到TestPeson.calss文件,並開始解釋執行,

此時JVM裏只有TestPerson.class這一個類的信息,順序執行到main方法,遇到,Person p1 = new Person(),

創建Person對象,JVM會根據CLASSPATH環境變量找到Person.class文件,把Person類的信息讀入到JVM裏,

保存起來。這個過程就是類加載。

類加載:加載類信息;

             執行靜態代碼塊;

             爲靜態屬性分配空間並初始化值。

以上例子的執行順序結果如下:

static here 

構造方法

構造方法


2final修飾符

final修飾符能夠修飾變量,方法,和類。



final修飾變量

final修飾的變量稱爲常量,一旦賦值不能更改。對於基本類型來說是其值不能改變,對於對象類型來說是其址不能改變。

final變量的賦值說明:一般的實例變量在創建時JVM會給其分配空創建默認值。但是final變量只能有一次賦值機會,所以,對於final變量,JVM不會爲其賦值,唯一的賦值機會留給程序員。

final類型的實例變量賦值在1:初始化屬性,

2:調用構造方法,兩種方式必須抓住其中一次機會,但不能試圖抓住兩種機會。

final修飾方法

final修飾方法,表示該方法不能被子類覆蓋。

eg:class A{ public final void a1(){.....}}

class B extends A{public void  a1(.....)}

//編譯錯誤無法覆蓋

final修飾類

final修飾類表示該類不能被繼承

一個類中有final方法,該類可以被繼承,但無法覆蓋final方法,但一個類是final類,則該類不能被繼承,更無從談起覆蓋。


eg:final賦值

class Person {

     final int num = 10 ; //初始化屬性

     public Perosn(int num){

         this.num = num; 

     }

}

class Person {

     final int num ; 

     public Perosn(int num){//構造方法賦值

         this.num = num;

     }

}

class Person {

     final int num = 10;    // 錯誤,兩種方式都抓住

     public Perosn(int num){//錯誤,兩種方式都抓住

         this.num = num;

     }

}



3 abstract修飾符

abstract可以修飾類和方法,


abstract修飾類

abstract修飾類稱爲抽象類。抽象類只能用來聲明引用不能用來創建對象。從某種意義上來說,抽象類就是讓子類去繼承,抽象類聲明引用,讓這個引用指向子類。子類去實現抽象方法。

抽象類中可以有非抽象方法,但一個類裏有抽象方法就一定要是抽象類。子類繼承抽象類要麼自己成爲抽象類,要麼實現父抽象類裏的所有抽象方法。

abstract修飾方法

abstract修飾方法,稱爲抽象方法。抽象方法指:只有聲明沒有實現的方法。

public abstract void  a1();//抽象方法。

public void a1(){};//空實現的方法


abstract class A{

         public void a1(){}//抽象類中可以有非抽象方法

         public abstract void a2();//但有了抽象方法就一定要是抽象類

}

class B extends A{

     public void a2(){

         System.out.print("子類要麼是抽象類,要麼實現父抽象類所有的抽象方法"); 

     }

}


public class TestA{

     public static void main(){

         A a ;//正確,抽象類可以用來引用

          a = new A();//錯誤,A抽象類,抽象類不能用來創建對象

          a = new B();//正確

          a.a2();//正確

     }

}


抽象類最大的作用就是,定義功能,具體實現由子類實現。

其充分體現了共性放在父類,這個基本原則裏。抽象和多態是聯繫緊密的,其思想大家可以參考JAVA三大特性。




限於文章篇幅原因,這裏僅僅介紹冰山一角。由於筆者的水平有限,編寫時間也很倉促,文中難免會出現一些錯誤或者不準確的地方,不妥之處懇請讀者批評指正。

以上內容希望對大家有所幫助。歡迎討論,共同進步。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章