### 1.0 匿名對象的基本知識 * 匿名對象 顧名思義,匿名對象指的就是沒有名字的對象,在使用中理解為實例化一個類對象,但是並不把它賦給一個對應的類變數,而是直接使用。在理解匿名對象前,我們先創建一個類便於後面的使用。 * 匿名對象具有以下特征: 語法上:只創建對象,但不用變數來接收,例如:假設 ...
1.0 匿名對象的基本知識
- 匿名對象
顧名思義,匿名對象指的就是沒有名字的對象,在使用中理解為實例化一個類對象,但是並不把它賦給一個對應的類變數,而是直接使用。在理解匿名對象前,我們先創建一個類便於後面的使用。 - 匿名對象具有以下特征:
語法上:只創建對象,但不用變數來接收,例如:假設現在Student類如上所示,通常情況我們在使用這個類時需要先實例化類對象,然後調用類的屬性和方法 - 匿名對象的使用:
匿名對象本質上仍然是一個對象,所以它具備對象的所有功能
每次創建一個匿名對象都是一起全新的對象,即每次創建的匿名對象都是不同的對象,它們在堆記憶體中具有不同的地址。而且一個匿名對象只能使用一次。
缺點:
一個匿名對象只能使用一次,造成記憶體空間的浪費。
優點:
由於匿名對象不需要在實例化後賦給變數,因此當大量需要使用匿名對象時,可以節省保存變數所需的棧空間
JVM的垃圾回收會根據對象是否可達來判斷是否為垃圾,如果不可達,則在下一次的垃圾回收中進行回收。而匿名對象創建後只能使用一次,當使用結束後它就是垃圾了,這樣便於JVM快速回收,節省堆記憶體空間。
2.0 通過實驗代碼進行匿名對象的學習
2.1
寫一個名為Account的類模擬賬戶。該類的屬性和方法如下圖所示。
該類包括的屬性:賬號id,餘額balance,年利率annualInterestRate;
包含的方法:訪問器方法(getter和setter方法),取款方法withdraw(),存款方法deposit()。
2.2
創建Customer類。
a. 聲明三個私有對象屬性:firstName、lastName和account。
b. 聲明一個公有構造器,這個構造器帶有兩個代表對象屬性的參數(f和l)
c. 聲明兩個公有存取器來訪問該對象屬性,方法getFirstName和getLastName返回相應的屬性。
d. 聲明setAccount 方法來對account屬性賦值。
e. 聲明getAccount 方法以獲取account屬性。
2.3
寫一個測試程式。
(1)
創建一個Customer ,名字叫 Jane Smith, 他有一個賬號為1000,餘額為2000元,年利率為 1.23% 的賬戶。
(2)
對Jane Smith操作。
存入 100 元,再取出960元。再取出2000元。
列印出Jane Smith 的基本信息
3.0 代碼實現
3.1 Account.java
package classTest.Account;
// 虛擬賬戶練習
public class Account {
private int id; //賬號
private double balance; //餘額
private double Rate; //年利率
public Account(int i, double b, double a){
id = i;
balance = b;
Rate = a;
}
public int getId() {
return id;
}
public double getBalance() {
return balance;
}
public double getRate() {
return Rate;
}
public void setId(int id) {
this.id = id;
}
public void setBalance(double balance) {
this.balance = balance;
}
public void setRate(double rate) {
Rate = rate;
}
public void withdraw(double amount){ //取錢
if(amount <= 0){
System.out.println("輸入金額不合法");
}
else if(amount > balance){
System.out.println("餘額不足");
}
else {
System.out.println("取錢成功: " + amount);
balance -= amount;
}
}
public void deposit(double amount){ //存錢
if(amount > 0){
balance += amount;
System.out.println("成功存入:" + amount);
}
else{
System.out.println("數據不合法");
}
}
}
3.2 Customer.java
package classTest.Account;
public class Customer {
private String firstName;
private String lastName;
private Account account;
public Customer(String f, String l){
firstName = f;
lastName = l;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public Account getAccount() {
return account;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setAccount(Account account) {
this.account = account;
}
}
3.3 測試程式CustomerTest.java
package classTest.Account;
import java.util.concurrent.CountDownLatch;
public class AccountTest {
public static void main(String[] args) {
// Customer實例
Customer cus = new Customer("Jane", "Smith");
// Account實例
Account ac = new Account(1000, 2000, 0.0123);
// 客戶和賬戶取得聯繫
cus.setAccount(ac);
// cus.setAccount(new Account(1000, 2000, 0.0123)); // 也可以直接這樣寫 -> 匿名對象
// ac.deposit(100);
// ac.withdraw(960);
// ac.withdraw(2000);
cus.getAccount().deposit(100);
cus.getAccount().withdraw(960);
cus.getAccount().withdraw(2000);
System.out.println(cus.getFirstName() + " " + cus.getLastName() + " has a account id: " + ac.getId() + ", annualInterestRate is " + ac.getRate() + ", balance is " + ac.getBalance());
}
}
4.0總結
可以看出可以直接使用
cus.setAccount(new Account(1000, 2000, 0.0123));
來進行匿名對象的定義
- 1.匿名對象只能使用一次
- 2.匿名對象往往作為形參傳遞給方法的實參