一、局部變量、成員變量和類變量
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 | |
修飾 | 屬性、方法、類(包括內部類)、局部變量 | 屬性、方法、代碼段、內部類 |
初始化 | 編譯或運行 | 編譯 |
修飾屬性 | 創建後不可修改,相當於常量,可以在構造函數中初始化 | 所有該類對象所共有 |
修飾方法 | 不能被重寫 | 只能使用類進行直接調用 |
暫時只有這四個概念是我覺得比較模糊的,如果大家有哪裏看不懂或者有其他分不清的概念,可以給我留言,我會繼續補充