Java中變量類型等概念區分:變量類型、訪問控制符、抽象類與接口

一、局部變量、成員變量和類變量

1.1 區分表

   我先將局部變量、成員變量和類變量的區分表放在前面,以後的內容也會這樣,先把區分表放在內容之前。後面會詳細地對概念進行解釋,幫助同學們更深入地理解概念。如果是僅僅想看他們的區別的話,可以只看第一部分。

  局部變量 成員變量 類變量
聲明位置 方法或程序塊 類中方法外 類中方法外
生命週期 方法或程序塊 隨對象的創建和銷燬 類第一次調用生成,程序結束銷燬
默認值 0、null、false、0.0 0、null、false、0.0
修飾符 不可修飾 訪問修飾符,一般爲private static、final和訪問修飾符,一般爲private
內存分配 棧內存 堆內存 靜態存儲區
其他類中的使用方式 不可使用 對象名.變量名 類名.變量名

1.2 概念區分

1、局部變量:代碼和程序塊中的變量,只在代碼和程序塊中使用。局部變量存儲在棧內存中,隨代碼和程序塊的結束而銷燬。局部變量沒有修飾符。由於其內存會隨着代碼和程序塊的結束而被銷燬,所以在其他的方法和類中無法直接調用局部變量,除非是該代碼和程序塊的子程序塊。

2、成員變量:在類中定義的變量和方法叫做成員變量和成員方法。成員變量與成員方法在類中同級,通常成員變量定義在成員方法之前,成員變量可以在類的成員方法中被使用。可以通過訪問修飾符private、protected和public來進行修飾,如果不加訪問修飾符,則默認其爲default修飾,不同修飾符對變量產生的影響會在下面的訪問修飾符內進行區分。

    由於Java的封裝性,我們一般使用private修飾符修飾成員變量。在成員方法中直接使用成員變量的變量名或者通過“this.變量名”進行調用。在Java中我們在構建一個類的對象的時候,會通過類構造方法對類的成員變量進行賦值。如果沒有定義構造方法,Java會自動生成一個不帶參數的構造方法,爲根據對象的成員變量的類型爲其賦初始值,一般爲0、null、false、0.0。

    在理解上,我認爲成員變量屬於對象,而類變量屬於類。因爲成員變量的構建和銷燬是跟隨對象的,而類變量則是存儲在靜態存儲區,被所有類的對象所共享。

3、類變量:類變量和成員變量定義在一起,在某種角度來看,它算作一種特殊的成員變量,只不過它除了可以使用“對象.變量名”來進行調用,還可以通過類來進行調用,如果它是public的。這裏注意,所有成員方法可以正常調用類變量,靜態方法只能調用類變量。

   類變量同樣可以使用訪問修飾符來進行修飾,但是它需要使用static來進行修飾。存儲的位置也變成了靜態存儲區。除此之外,它還可以使用final來進行修飾,被final修飾後,它就相當於一個類的常量,無法被修改,且只能通過類進行調用。

1.3 實例驗證

   我們定義一個Person類,內容如下。爲了示範他們的功能,我們這裏儘量簡化代碼。我們可以看到類變量可以在成員方法中使用。但是被final控制的那個無法再進行賦值。

public class Person {
    //靜態變量
    private static Integer personCount;
    public static final String disc = "善良";
    //成員變量
    private Integer personNum = 0;

    public Person(Integer personNum) {
        //局部變量
        int tmpInt = 1;
        this.personNum = personNum;
        personCount++;
    }

    public void printPerson(){
        System.out.println(personNum+personCount+disc);
        /*錯誤,不可賦值
        disc = "中二";*/
    }
}

    我們再定義一個類,使用Person。可以看出一個公共的類變量可以通過類名直接進行調用。

public class TestSeason {
    public static void main(String[] args) {
        Person person = new Person(1);
        System.out.println(Person.disc);
        System.out.println(person.disc);
        person.printPerson();
    }
}

二、訪問控制修飾符

2.1 區分表

修飾符 當前類 同包類 不同包子類 不同包除子類 子類重寫方法的控制符
public Y Y Y Y public
protected Y Y 可繼承,不可調用 N protected、public
default Y Y N N default、protected、private
private Y N N N 不可重寫

如果你覺得這樣還是不好理解,可以這樣想:

1、訪問控制的寬鬆度:public>protected>default>private,在繼承的時候可以越來越寬鬆

2、default只能在同包的類中使用,當然,不是這個方法的子類無論在那裏都無法重寫父類方法。

3、protected因爲寬鬆度比default大,所以default能使用的地方,它一定可以。而它控制的方法一定能夠被該類的子類重寫。

2.2 概念區分

   訪問控制符是用來控制成員變量、成員函數和內置類的訪問權限,一般我們會將成員變量的訪問權限設置爲私有,方法設置爲共有。我們可以顯式設置變量或方法爲public、protected和private,如果不設置則爲default。這裏就不對概念做太多解釋了,權限控制,在上表中已經說的很清楚了。

三、抽象類與接口之間的區別

  抽象類 接口
是否可以被多繼承 N Y
方法抽象 可以,但不必須 必須全部
方法靜態 可以,但不必須 N
方法公有 可以,但不必須 必須是
方法是否有具體實現 Y N
變量修飾符 沒有要求 public static final
是否有構造方法 可以有 N
聲明關鍵字 abstract interface
是否可以實例化對象 Y N

四、static和final之間的區別

  final static
修飾 屬性、方法、類(包括內部類)、局部變量 屬性、方法、代碼段、內部類
初始化 編譯或運行 編譯
修飾屬性 創建後不可修改,相當於常量,可以在構造函數中初始化 所有該類對象所共有
修飾方法 不能被重寫 只能使用類進行直接調用

暫時只有這四個概念是我覺得比較模糊的,如果大家有哪裏看不懂或者有其他分不清的概念,可以給我留言,我會繼續補充

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