天天看點

Lesson_for_java_day10--通路權限、static、對象轉型、equals方法、toString方法、主函數

/*
-----------------------------------主函數---------------------------------------
	
主函數:是一個特殊的函數,作為程式的入口,可以被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()方法。
	
*/