每日一考和複習
每日一考
- 如何實現向下轉型?需要注意什麼問題?如何解決此問題?
使用強制轉型符()
可能會報錯ClassCastException
使用instance關鍵字判斷是否可以轉
- == 和 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;
}
}
- 寫出8種基本數據類型及其對應的包裝類
基本數據類型 | 包裝類 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
- 基本數據類型、包裝類與String三者之間如何轉換
自動裝箱、自動拆箱
基本數據類型、包裝類—>String:valueOf(Xxx xx)
String—>基本數據類型、包裝類:parseXxx(String s)
複習
day13的學習內容
面向對象
關鍵字:static
-
static:靜態的
-
static可以用來修飾:屬性、方法、代碼塊、內部類
-
使用static修飾屬性:靜態變量(或類變量)
3.1 屬性,按是否使用static修飾,又分爲:靜態屬性 vs 非靜態屬性(實例變量) 實例變量:我們創建了類的多個對象,每個對象都獨立的擁有一套類中的非靜態屬性。 當修改其中一個對象中的非靜態屬性時,不會導致其他對象中同樣的屬性值的修改 靜態變量:我們創建了類的多個對象,多個對象共享同一個靜態變量。 當通過某一個對象修改靜態變量時,會導致其他對象調用此靜態變量時,是修改過了的 3.2 static修飾屬性的其他說明: ① 靜態變量隨着類的加載而加載。可以通過"類.靜態變量"的方式進行調用 ② 靜態變量的加載要早於對象的創建。 ③ 由於類只會加載一次,則靜態變量在內存中也只會存在一份:存在方法區的靜態域中 ④ 類變量 實例變量 類 yes no 對象 yes yes 3.3 靜態屬性舉例:System.out; Math.PI;
-
使用static修飾方法:靜態方法
① 隨着類的加載而加載,可以通過"類.靜態方法"的方式進行調用 ② 靜態方法 非靜態方法 類 yes no 對象 yes yes ③ 靜態方法中,只能調用靜態的方法或屬性 非靜態方法中,既可以調用非靜態的方法或屬性,也可以調用靜態的方法或屬性
-
static注意點:
5.1 在靜態的方法內,不能使用this關鍵字、super關鍵字
5.2 關於靜態屬性和靜態方法的使用,從生命週期的角度去理解。 -
開發中,如何確定一個屬性是否要聲明爲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;
}
}
- 區分餓漢式和懶漢式
- 餓漢式:
壞處:對象加載時間過長
好處:餓漢式是線程安全的 - 懶漢式:好處:延遲對象的創建
目前的寫法壞處:線程不安全—>到多線程內容時,再修改
- 餓漢式:
類的成員之四:代碼塊
-
代碼塊的作用:用來初始化類、對象
-
代碼塊如果有修飾的話,只能使用static
-
分類:靜態代碼塊 vs 非靜態代碼塊
-
靜態代碼塊
內部可以有輸出語句
隨着類的加載而執行,而且只執行一次
作用:初始化類的信息
如果一個類中定義了多個靜態代碼塊,則按照聲明的先後順序執行
靜態代碼塊的執行要優先於非靜態代碼塊的執行
靜態代碼塊內只能調用靜態的屬性、靜態的方法,不能調用非靜態的結構 -
非靜態代碼塊
內部可以有輸出語句
隨着對象的創建而執行
每創建一個對象,就執行一次非靜態代碼塊
作用:可以在創建對象時,對對象的屬性等進行初始化
如果一個類中定義了多個非靜態代碼塊,則按照聲明的先後順序執行
非靜態代碼塊內可以調用靜態的屬性、靜態的方法,或非靜態的屬性、非靜態的方法
- 對屬性可以賦值的位置:
①默認初始化
②顯式初始化/⑤在代碼塊中賦值
③構造器中初始化
④有了對象以後,可以通過"對象.屬性"或"對象.方法"的方式,進行賦值
執行的先後順序:① - ② / ⑤ - ③ - ④(顯示初始化、代碼塊誰寫在前面誰先執行)
關鍵字:final
-
final可以用來修飾的結構:類、方法、變量
-
final 用來修飾一個類:此類不能被其他類所繼承。
比如:String類、System類、StringBuffer類 -
final 用來修飾方法:表明此方法不可以被重寫
比如:Object類中getClass(); -
final 用來修飾變量:此時的"變量"就稱爲是一個常量
4.1 final修飾屬性:可以考慮賦值的位置有:顯式初始化、代碼塊中初始化、構造器中初始化
4.2 final修飾局部變量:
尤其是使用final修飾形參時,表明此形參是一個常量。當我們調用此方法時,給常量形參賦一個實參。一旦賦值以後,就只能在方法體內使用此形參,但不能進行重新賦值。
static final 用來修飾屬性:全局常量