這一節我們來說說類類型參數和匿名對象.
我們繼續用之前的小汽車類吧
~~~
class Car
{
int num;//這是輪胎數屬性
String color;//這是顏色屬性
String brand;//這是品牌性
void start()//啟動行為
{
System.out.println("小汽車已啟動");
}
void run()//這就是運行行為
{
System.out.println(num+"..."+color+"..."+brand);
}
}
~~~
對于我們的Car類,如果我們要創建多個相同的小汽車我們應該怎么做呢?
對于我們初學者,我們肯定會用這樣的操作:
~~~
class CarDemo
{
public static void main(String[] args)
{
//定義第一輛車
Car myCar1 = new Car();
myCar1.num = 4;
myCar1.color = "red";
myCar1.brand = "BWM";
//定義第二輛車
Car myCar2 = new Car();
myCar1.num = 4;
myCar1.color = "red";
myCar1.brand = "BWM";
//定義第三輛甚至更多時,只能這樣不斷的寫代碼
}
}
~~~
我們可以說說,上面的代碼確實很爛了,我們做了很多相同的操作,如果我們要定義很多相同的車時,代碼的復用性確實太差了.
那么我們該怎么做呢,很顯然,我們必須要提高代碼的復用性,也就是說我們可以把相同功能的代碼封裝起來以重復使用,那么就可這樣做:
~~~
class CarDemo
{
public static void main(String[] args)
{
//定義第一輛車
Car myCar1 = new Car();
assemble(myCar1);
System.out.println("myCar1是一輛"+myCar1.color+"顏色的"+myCar1.brand+"品牌的小汽車,它有"+myCar1.num+"個輪子");
//定義第二輛車
Car myCar2 = new Car();
assemble(myCar2);
System.out.println("myCar2是一輛"+myCar2.color+"顏色的"+myCar2.brand+"品牌的小汽車,它有"+myCar2.num+"個輪子");
//定義第三輛可以直接復用assemble(Car car)這個組裝功能即可
}
//我們可以封閉一個汽車組裝的功能,然后調用這個功能就可以
public static void assemble(Car car)//類類型的參數一定要指向對象,要么就是null
{
car.num = 4;
car.color = "red";
car.brand = "BWM";
}
}
~~~
從上面的代碼我們很容易就實現了相同車輛的組裝,提高了代碼的復用性,同時我們注意到,封裝的功能的參數是一個類類型的形式參數,它指向的是一個Car類型的對象.
我們來看一下上面代碼的結果:

我們從結果上看到確實實現了我們想要實現的相同汽車.
我們再簡單來看一下比較特殊的情況,就是匿名對象.
匿名對象顧名思義就是沒有名字的對象
~~~
new Car();//匿名對象,其實就是定義對象的簡寫格式
~~~
那么匿名對象一般怎么用呢?
我們先看一例子,比如我們要創建一輛車,并運行run方法,那么我們會這樣做:
~~~
Car c = new Car();//這個是有名對象
c.run();
~~~
對于上面這種情況,我們可以簡寫為如下一句代碼:
~~~
new Car().run;
~~~
那么我們就看到匿名對象的**第一種用法**:
當對象對方法僅進行一次調用的時候,就可以簡化成匿名對象.
我們看一段代碼:
~~~
class CarDemo
{
public static void main(String[] args)
{
new Car().num = 5;
new Car().color = "green";
new Car().run();
}
}
~~~
我們看一下結果:

對于這三句語句,每執行一名,在堆內存中都會創建新的空間,而不是只創建一個對象.當執行下面的一句語句時,前面的語句已經被釋放了,所以上面的前兩句代碼沒有意義.但是最后一句會被執行,因為該對象對方法只進行了一次調用.
匿名對象的**第二種用法**:
匿名對象可以作為實際參數進行傳遞.
比如前面我們的方法assemble(Car car),我們可以這樣使用:
~~~
assemble(new Car());
~~~
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現