/*
-----------------------------------主函數---------------------------------------
主函數:是一個特殊的函數,作為程式的入口,可以被java虛拟機(JVM)調用。
主函數的定義:
public:函數的通路權限是最大的。
static:代表着主函數随着類的加載就已經存在。
void:主函數沒有具體傳回值。
main:不是關鍵字,但是是一個特殊的單詞,能被JVM所識别。
String[] args:函數參數。參數是一個數組,該數組中的元素是字元串,即字元串類型的數組。
JVM在調用主函數時傳入的是new String[0];
--------------------------------包和通路權限----------------------------------
1、将類放置到一個包中,需要使用package"包名"。
2、編譯時需要使用-d參數,該參數的作用是依據包名生成相應的檔案夾。
3、一個類的全名應該是"包名" + "." + "類名"。
4、包名的命名規範:
1、要求包名所有的字母都是小寫。
2、包名一般情況下是你的域名倒過來寫。
java當中的通路權限:public > protected > default > private
1、public:公共權限:可以修飾類、成員變量和成員函數。沒有任何通路權限,同一包中或者不同包中的類可以自由通路
2、private:私有權限:可以修飾成員變量和成員函數。隻能在本類中使用。私有權限是封裝的一種表現形式。
3、default:包級别通路權限(預設權限):可以修飾類、成員變量和成員函數。在同一個包中可以自由通路。
4、protected:受保護權限:protected權限首先擁有和default權限一樣的功能,其次又可以通路父類中有足夠通路權限的成員。該權限隻能修飾成員變量和成員函數。如果子類和父類不在同一個包中,子類可以繼承到父類當中的default權限的成員變量和成員函數,但是由于權限不夠,無法使用。
----------------------------------static關鍵字的作用---------------------------------------
作用:
1、定義靜态成員變量:靜态成員變量可以用類名直接調用。當對象中出現共享資料時,該資料就被靜态所修飾,存在于方法區,對象中的特有資料就定義成非靜态,存在于堆記憶體中。
2、定義靜态成員方法:靜态成員方法中不能包含非靜态成員變量。功能内部沒有通路到非靜态成員資料(對象特有資料)那麼該功能就可以定義成靜态的。
3、定義靜态代碼塊:靜态代碼塊是在類裝載的時候運作的。
注意:靜态成員變量在記憶體中隻有一份,在靜态函數中不能使用this,靜态代碼塊主要作用是為靜态成員變量指派。
靜态在記憶體中,不存在于堆記憶體中,而是存在于方法區(或叫共享區或資料區),可以單獨存取。
static的特點:
1、随着類的加載而加載,随着類的消失而消失。
2、優先于對象存在。(靜态先存在,對象後存在)
3、被所有對象所共享。
4、可以直接被類名所調用。
執行個體變量和類變量的差別?
1、存放位置:類變量随着類的加載而存在于方法區中。執行個體變量随着對象的建立而存在于堆記憶體中。
2、生命周期:類變量生命周期最長,随着類的消失而消失。執行個體變量生命周期随着對象的消失而消失。
(重點)靜态的使用注意事項:
1、靜态方法隻能通路靜态成員(變量和方法)。非靜态方法既能通路靜态成員,又可以通路非靜态成員(變量和方法)。
2、靜态方法中不可以有this、super關鍵字,因為靜态優先于對象存在,是以不可以有this、super。
3、主函數是靜态的。
使用靜态的利弊:
利:對對象的共性資料進行單獨空間存儲,節省空間,沒有必要每一個對象中都存儲一份,而可以被類名直接調用。
弊:生命周期過長,通路出現局限性(靜态雖好,隻能通路靜态成員)。
-----------------------------------對象的轉型------------------------------------------
什麼是向上轉型:
将子類的對象指派給父類的引用。
eg:Person p = new Student();
什麼是向下轉型:
将父類的引用指派給子類的引用。向下轉型的前提是先進行向上轉型。
eg:Person p = new Student();
Student s2 = (Student)p;
多态的規則:
1、多态自始至終都是子類對象在做着變化。
2、一個引用能夠調用哪些成員(變量和函數),取決于這個引用的類型。
3、一個引用調用的是哪一個方法,取決于這個引用所指向的對象。
4、非靜态成員函數在多态調用時,編譯時看左邊,運作時看右邊。
5、在多态中,成員變量,無論編譯還是運作,都是參考左邊。(引用型變量所屬的類)
6、在多态中,靜态成員函數,無論編譯還是運作,都參考左邊。
類類型的判斷:
類名 instanceOf 類名 傳回值為boolean。
-------------------------------equals方法和"=="--------------------------------------------
簡單說,"=="一般用于基本資料類型的比較,而equals一般用于引用資料類型的比較。
在Java規範中,它對equals()方法的使用必須要遵循如下幾個規則:
equals 方法在非空對象引用上實作相等關系:
1、自反性:對于任何非空引用值 x,x.equals(x) 都應傳回 true。
2、對稱性:對于任何非空引用值 x 和 y,當且僅當 y.equals(x) 傳回 true 時,x.equals(y) 才應傳回 true
3、傳遞性:對于任何非空引用值 x、y 和 z,如果 x.equals(y) 傳回 true,并且 y.equals(z) 傳回 true,那麼 x.equals(z) 應傳回 true。
4、一緻性:對于任何非空引用值 x 和 y,多次調用 x.equals(y) 始終傳回 true 或始終傳回 false,前提是對象上 equals 比較中所用的資訊沒有被修改。
5、 對于任何非空引用值 x,x.equals(null) 都應傳回 false。對于上面幾個規則,我們在使用的過程中最好遵守,否則會出現意想不到的錯誤。
在java中進行比較,我們需要根據比較的類型來選擇合适的比較方式:
1) 對象域,使用equals方法 。
2) 類型安全的枚舉,使用equals或== 。
3) 可能為null的對象域 : 使用 == 和 equals 。
4) 數組域 : 使用 Arrays.equals 。
5) 除float和double外的原始資料類型 : 使用 == 。
6) float類型: 使用Float.foatToIntBits轉換成int類型,然後使用==。
7) double類型: 使用Double.doubleToLongBit轉換成long類型,然後使用==。
至于6)、7)為什麼需要進行轉換,我們可以參考他們相應封裝類的equals()方法,
重寫equals方法的要點:
1. 使用==操作符檢查“實參是否為指向對象的一個引用”。
2. 使用instanceof操作符檢查“實參是否為正确的類型”。
3. 把實參轉換到正确的類型。
4. 對于該類中每一個“關鍵”域,檢查實參中的域與目前對象中對應的域值是否比對。
(1)、對于既不是float也不是double類型的基本類型的域,可以使用==操作符進行比較;
(2)、對于對象引用類型的域,可以遞歸地調用所引用的對象的equals方法;
(3)、對于float類型的域,先使用Float.floatToIntBits轉換成int類型的值,然後使用==操作符比較int類型的值;
(4)、對于double類型的域,先使用Double.doubleToLongBits轉換成long類型的值,然後使用==操作符比較long類型的值。
5. 當你編寫完成了equals方法之後,應該問自己三個問題:它是否是對稱的、傳遞的、一緻的?(其他兩個特性通常會自行滿足)如果答案是否定的,那麼請找到這些特性未能滿足的原因,再修改equals方法的代碼。
--------------------------------toString方法------------------------------------------
toString()方法在Object類中定義,其傳回值是String類型,描述目前對象的有關資訊在進行String與其它
類型資料的連接配接操作時,自動調用toString()方法可以根據需要在使用者自定義類型中重寫toString()方法
基本類型資料轉換為String類型時,調用了對應封裝類的toString()方法。
*/