構造器采用與類相同的名稱。
默認構造器(default constructor):不接受任何參數的構造器,也叫無參構造器。
構造器也能帶有形式參數,就能在初始化對象時提供實際參數。
class Foo{
Foo(){
System.out.println("Foo's no-arg Constructor Foo()");
}
Foo(int i){
System.out.println("Foo's arg Constructor Foo ("+i+")");
}
}
public class ConstructorDemo {
public static void main(String[] args) {
new Foo();
new Foo(1);
}
}
定義:方法名不同而形式參數不同,適用於構造器和其它方法。
區分重載方法:每個重載的方法都必須有一個獨一無二的參數類型列表。
涉及基本類型的重載:基本類型從一個較小的類型自動提升到一個較大的類型。
以返回值區分重載方法:行不通,如下所示:
void f(){}
int f(){
return 1;
}
f();
Java無法判斷該調用哪個f()方法。
默認構造器沒有形式參數,作用是創建一個默認對象。若類中沒有構造器,則編譯器會自動創建一個默認構造器。
沒有提供構造器->編譯器認為需要一個構造器,我給你制造一個。
已經有了構造器->編譯器認為已寫了構造器,你知道你在做什麼,你是刻意省略默認構造器的。
class Banana{
void peel(int i){
System.out.println(this.toString()+" "+i);
}
}
public class BananaPeel {
public static void main(String[] args) {
Banana a = new Banana(),
b = new Banana();
System.out.println("a:"+a.toString()+"\nb:"+b.toString());
a.peel(1);
b.peel(2);
}
}
結果輸出:
a:Banana@610455d6
b:Banana@511d50c0
Banana@610455d6 1
Banana@511d50c0 2
同一個類的兩個對象,調用類的同一方法,是如何知道是被哪個對象調用的呢?
為了能用簡便,面向對象的語法來編寫代碼——即發送消息給對象,編譯器做了一些幕後工作,它暗自把“所操作對象的引用”作為第一個參數傳遞給peel()。所以a,b調用的兩個方法就變成了這樣:
Banana.peel(a,1);
Banana.peel(b,2);
從結果輸出也能看出來編譯器將所操作對象的引用傳遞給了peel()方法。
this關鍵字用於在方法內部獲得對當前對象的引用。表示對"調用方法的那個對象"的引用。
this的用法和其他對象引用沒有不同。
注意:在方法內部調用同一個類的另一個方法不必使用this,直接調用即可。
public class ThisDemo {
int i = 0;
ThisDemo increment(){
i++;
//返回對當前對象的引用
return this;
}
void print(){
System.out.println("i="+i);
}
public static void main(String[] args) {
ThisDemo thisDemo = new ThisDemo();
thisDemo.increment().increment().increment().increment().print();
}
一個類中有多個構造器,為避免重復代碼,可能在一個構造器中調用另一個構造器。使用this關鍵字調用其他構造器。
除構造器之外,編譯器禁止在其他任何方法中調用構造器。
static(靜態)方法就是沒有this的方法。在static方法的內部不能調用非靜態方法,反過來可以。
static方法的主要用途:可以在沒有創建任何對象的前提下,僅僅通過類本身來調用static方法。(很像全局方法,但是在Java中禁止使用全局方法,但在類中置入static方法就可以訪問其他static方法和static域)由於不存在this,所以靜態方法不是通過"向對象發送消息"的方式來完成的。
Java有垃圾回收器負責回收無用對象占據的內存資源。但有特殊情況:假定對象(並非使用new)獲得一塊特殊的內存區域,由於垃圾回收器只知道釋放那些經由new分配的內存,所以它不知道該如何釋放該對象的這塊特殊的內存。
針對上述特殊情況,Java允許在類中定義一個名為finalize()方法,在下一次垃圾回收動作發生時,才會真正回收對象占用的內存
在不再需要某個對象之前,如果必須執行某些動作,必須得自己去做。Java中並未提供"析構函數"或相似的概念。自己動手創建一個執行清理工作的普通方法來做類似的清理工作。
無論是垃圾回收還是終結,都不保證一定會發生。如果Java虛擬機並未面臨內存耗盡的情形,它是不會浪費時間去
執行垃圾回收以恢復內存的。
當垃圾回收器工作時,一面回收空間,一面使堆中的對象緊湊排列。堆指針就能很容易移動到更靠近傳送帶的開始處,盡量避免了頁面錯誤。