歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java編程思想學習筆記——初始化與清理

初始化

構造器保證初始化

構造器采用與類相同的名稱。

默認構造器(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);
  }
}

方法重載(Method Overloading)

定義:方法名不同而形式參數不同,適用於構造器和其它方法。

區分重載方法:每個重載的方法都必須有一個獨一無二的參數類型列表。

涉及基本類型的重載:基本類型從一個較小的類型自動提升到一個較大的類型。

以返回值區分重載方法:行不通,如下所示:

 void f(){}
 int f(){
     return 1;
 }

f();

Java無法判斷該調用哪個f()方法。

默認構造器

默認構造器沒有形式參數,作用是創建一個默認對象。若類中沒有構造器,則編譯器會自動創建一個默認構造器。

沒有提供構造器->編譯器認為需要一個構造器,我給你制造一個。

已經有了構造器->編譯器認為已寫了構造器,你知道你在做什麼,你是刻意省略默認構造器的。

this關鍵字

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的含義

static(靜態)方法就是沒有this的方法。在static方法的內部不能調用非靜態方法,反過來可以。

static方法的主要用途:可以在沒有創建任何對象的前提下,僅僅通過類本身來調用static方法。(很像全局方法,但是在Java中禁止使用全局方法,但在類中置入static方法就可以訪問其他static方法和static域)由於不存在this,所以靜態方法不是通過"向對象發送消息"的方式來完成的。

清理:終結處理和垃圾回收

Java有垃圾回收器負責回收無用對象占據的內存資源。但有特殊情況:假定對象(並非使用new)獲得一塊特殊的內存區域,由於垃圾回收器只知道釋放那些經由new分配的內存,所以它不知道該如何釋放該對象的這塊特殊的內存。

針對上述特殊情況,Java允許在類中定義一個名為finalize()方法,在下一次垃圾回收動作發生時,才會真正回收對象占用的內存

  1. 對象可能不被垃圾回收
  2. 垃圾回收並不等於"析構"

在不再需要某個對象之前,如果必須執行某些動作,必須得自己去做。Java中並未提供"析構函數"或相似的概念。自己動手創建一個執行清理工作的普通方法來做類似的清理工作。

finalize()的用途

  1. 垃圾回收只與內存有關

無論是垃圾回收還是終結,都不保證一定會發生。如果Java虛擬機並未面臨內存耗盡的情形,它是不會浪費時間去
執行垃圾回收以恢復內存的。

垃圾回收器如何工作

當垃圾回收器工作時,一面回收空間,一面使堆中的對象緊湊排列。堆指針就能很容易移動到更靠近傳送帶的開始處,盡量避免了頁面錯誤。

Copyright © Linux教程網 All Rights Reserved