30天搞定Java--day14

每日一考和複習

每日一考

  1. 如何實現向下轉型?需要注意什麼問題?如何解決此問題?

使用強制轉型符()
可能會報錯ClassCastException
使用instance關鍵字判斷是否可以轉

  1. == 和 equals()有何區別?

==既可以比較數值,也可以比較對象(地址)
equals只能比較對象,重現前比較對象的地址

class User{
	String name;
	int age;
		//重寫其equals()方法
}
//參考答案,自動生成
class User{
	String name;
	int age;

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
  1. 寫出8種基本數據類型及其對應的包裝類
基本數據類型 包裝類
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
  1. 基本數據類型、包裝類與String三者之間如何轉換

自動裝箱、自動拆箱
基本數據類型、包裝類—>String:valueOf(Xxx xx)
String—>基本數據類型、包裝類:parseXxx(String s)

複習
day13的學習內容

面向對象

關鍵字:static

  1. static:靜態的

  2. static可以用來修飾:屬性、方法、代碼塊、內部類

  3. 使用static修飾屬性:靜態變量(或類變量)

     3.1 屬性,按是否使用static修飾,又分爲:靜態屬性  vs 非靜態屬性(實例變量)
     	實例變量:我們創建了類的多個對象,每個對象都獨立的擁有一套類中的非靜態屬性。
     		    當修改其中一個對象中的非靜態屬性時,不會導致其他對象中同樣的屬性值的修改
     	靜態變量:我們創建了類的多個對象,多個對象共享同一個靜態變量。
     			當通過某一個對象修改靜態變量時,會導致其他對象調用此靜態變量時,是修改過了的
     			
     3.2 static修飾屬性的其他說明:
     	① 靜態變量隨着類的加載而加載。可以通過"類.靜態變量"的方式進行調用
        ② 靜態變量的加載要早於對象的創建。
        ③ 由於類只會加載一次,則靜態變量在內存中也只會存在一份:存在方法區的靜態域中
        ④		類變量	實例變量
        類		yes		no
        對象		yes		yes
        
    3.3 靜態屬性舉例:System.out; Math.PI;
    
  4. 使用static修飾方法:靜態方法

     ① 隨着類的加載而加載,可以通過"類.靜態方法"的方式進行調用
     ②			靜態方法	非靜態方法
        類		yes		no
        對象		yes		yes
     ③ 靜態方法中,只能調用靜態的方法或屬性
       非靜態方法中,既可以調用非靜態的方法或屬性,也可以調用靜態的方法或屬性
    
  5. static注意點:
    5.1 在靜態的方法內,不能使用this關鍵字、super關鍵字
    5.2 關於靜態屬性和靜態方法的使用,從生命週期的角度去理解。

  6. 開發中,如何確定一個屬性是否要聲明爲static的?

    屬性是可以被多個對象所共享的,不會隨着對象的不同而不同的。
    類中的常量也常常聲明爲static

    開發中,如何確定一個方法是否要聲明爲static的?

    操作靜態屬性的方法,通常設置爲static的
    工具類中的方法,習慣上聲明爲static的。 比如:Math、Arrays、Collections

單例設計模式

所謂類的單例設計模式,就是採取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例,並且該類只提供一個取得其對象實例的方法。如果我們要讓類在一個虛擬機中只能產生一個對象,我們首先必須將類的構造器的訪問權限設置爲private,這樣,就不能用new操作符在類的外部產生類的對象了,但在類內部仍可以產生該類的對象。因爲在類的外部開始還無法得到類的對象,只能調用該類的某個靜態方法以返回類內部創建的對象,靜態方法只能訪問類中的靜態成員變量,所以,指向類內部產生的該類對象的變量也必須定義成靜態的

餓漢式

class Bank {

	// 1.私有化類的構造器
	private Bank() {}

	// 2.內部創建類的對象
	// 4.要求此對象也必須聲明爲靜態的
	private static Bank instance = new Bank();

	// 3.提供公共的靜態的方法,返回類的對象
	public static Bank getInstance() {
		return instance;
	}
}

懶漢式

class Order {

	// 1.私有化類的構造器
	private Order() {}

	// 2.聲明當前類對象,沒有初始化
	// 4.此對象也必須聲明爲static的
	private static Order instance = null;

	// 3.聲明public、static的返回當前類對象的方法
	public static Order getInstance() {
		if (instance == null) {
			instance = new Order();
		}
		return instance;
	}
}
  • 區分餓漢式和懶漢式
    • 餓漢式:
      壞處:對象加載時間過長
      好處:餓漢式是線程安全的
    • 懶漢式:好處:延遲對象的創建
      目前的寫法壞處:線程不安全—>到多線程內容時,再修改

類的成員之四:代碼塊

  1. 代碼塊的作用:用來初始化類、對象

  2. 代碼塊如果有修飾的話,只能使用static

  3. 分類:靜態代碼塊 vs 非靜態代碼塊

  4. 靜態代碼塊

    內部可以有輸出語句
    隨着類的加載而執行,而且只執行一次
    作用:初始化類的信息
    如果一個類中定義了多個靜態代碼塊,則按照聲明的先後順序執行
    靜態代碼塊的執行要優先於非靜態代碼塊的執行
    靜態代碼塊內只能調用靜態的屬性、靜態的方法,不能調用非靜態的結構

  5. 非靜態代碼塊

    內部可以有輸出語句
    隨着對象的創建而執行
    每創建一個對象,就執行一次非靜態代碼塊
    作用:可以在創建對象時,對對象的屬性等進行初始化
    如果一個類中定義了多個非靜態代碼塊,則按照聲明的先後順序執行
    非靜態代碼塊內可以調用靜態的屬性、靜態的方法,或非靜態的屬性、非靜態的方法

  • 對屬性可以賦值的位置:
    ①默認初始化
    ②顯式初始化/⑤在代碼塊中賦值
    ③構造器中初始化
    ④有了對象以後,可以通過"對象.屬性"或"對象.方法"的方式,進行賦值

執行的先後順序:① - ② / ⑤ - ③ - ④(顯示初始化、代碼塊誰寫在前面誰先執行)

關鍵字:final

  1. final可以用來修飾的結構:類、方法、變量

  2. final 用來修飾一個類:此類不能被其他類所繼承。
    比如:String類、System類、StringBuffer類

  3. final 用來修飾方法:表明此方法不可以被重寫
    比如:Object類中getClass();

  4. final 用來修飾變量:此時的"變量"就稱爲是一個常量
    4.1 final修飾屬性:可以考慮賦值的位置有:顯式初始化、代碼塊中初始化、構造器中初始化
    4.2 final修飾局部變量:
    尤其是使用final修飾形參時,表明此形參是一個常量。當我們調用此方法時,給常量形參賦一個實參。一旦賦值以後,就只能在方法體內使用此形參,但不能進行重新賦值。

static final 用來修飾屬性:全局常量

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