2011-10-15 145 views
0

所以我正在學習java。我有一個月的時間,我剛剛瞭解了建設者。但我沒有看到創建一個整體的目的。爲什麼和什麼時候我會想要使用一個?我認爲它沒有一個主要的方法,你可以從你的主類調用一個構造函數。任何人都可以在這個話題上給我啓發,這對我有很大的幫助。java構造函數有什麼意義?

+1

構造函數讓你在對象的成員上進行初始化和設置值,並且它們創建一個類的實例。你有沒有讀過這部分教程? http://download.oracle.com/javase/tutorial/java/javaOO/constructors.html – birryree

回答

7

構造函數是你用來初始化/設置你的類的實例。

如果你有一個對象在它可用之前需要一些處理(例如初始化成員),你應該在構造函數中這樣做。理想情況下,您不應該擁有「部分構建」的對象(即您持有引用的「活」對象,但這些對象不可用)。沒有構造函數,你會永久創建部分構建的對象,而且這很容易出錯。 (理論和實踐並不總是相匹配,但要牢記這一點)

1

它用於創建對象。對象是面向對象的主要概念,因此創建它們是重要的一步。主類方法只是您程序的入口點。如果你不創建對象,你的程序將是程序化的而不是面向對象的。這就是爲什麼使用的構造函數。

爲什麼要創建構造函數 - 有時您需要構造一個具有一些必需參數的對象。還有一個默認的無參數構造函數,但是如果您想用其他參數初始化對象 - 您可以創建一個構造函數來獲取這些參數。

+0

不回答問題。你不需要寫一個構造函數來獲取任何這個。 – EJP

+3

@EJP你是不對的。您不需要編寫構造函數,但默認情況下總是有一個構造函數,您必須使用它 – Bozho

+0

Nitpick:*某人*必須使用它。你可以直接調用getNewObject()方法來獲取對象而不用*調用任何構造函數。但'getNewObject'可能在某個時候需要新建一個對象,此時它會自動調用其中一個構造函數。 – cHao

5

您使用構造函數來創建新對象。是的,你可以可以只是使用靜態方法編寫Java - 但是你真的沒有編寫面向對象的代碼,你也很難使用大部分的標準庫。

你的大部分時間,你應該與合作,並在對象的角度思考 - 他們需要建設可以使用之前......而這就是構造函數來在他們創建一個對象,往往與。指定初始狀態或關於對象的其他重要信息的參數。

說實話,如果你還沒有看到這一點,那麼它可能不值得擔心它們。很有可能當你學到更多東西的時候,你會自然而然地開始使用更多的對象(例如,也許會從集合開始),然後你就會掌握它。請放心,它在Java中有構造函數很重要,但我相信你會明白爲什麼在時間的過程中。 (當然,如果這個答案已經幫助你瞭解它們的價值,我很高興 - 但是如果沒有,請不要擔心:)

-1

我會給你一個例子,想象你有一個汽車類..當你打電話給汽車類的構造函數時,你有一輛汽車目的。在這個汽車對象上可以使用不同的方法。你可以創建任意數量的汽車物件。

+1

不回答問題。你不需要寫一個構造函數來獲取任何這個。 – EJP

1

構造函數用於初始化一個類並給一個類提供參數。重要的是他們讓你在創建時設置類的狀態。這允許您使用具有不同數據字段值的類的特定實例,而不是依賴純靜態信息。採取下面的例子:

class Obj { 
    private int state = 0; 

    public Obj(int state) { 
    this.state = state; 
    } 

    public Obj() { 
    state = 1; 
    } 
} 

現在main(或任何)可以具有:

Obj obj1 = new Obj(); 
Obj obj2 = new Obj(2); 

兩個對象具有不同的狀態(一個處於狀態1,另一種是在狀態2) 。如果你依賴靜態方法和成員,這些對象將共享一個狀態,並且不會彼此獨立。

重要的是要注意構造函數(特別是new關鍵字)在內部爲給定對象分配內存,因此您不必擔心使用malloc和其他內存管理。所以它們在這個意義上也很重要。

2

看起來好像您無法理解對象和麪向對象編程的基本概念。以身作則解釋;此類表示類型的東西,即一輛車:

public class Car{ 

    // Licence plate number. This is private, so it can 
    // not be accessed directly from outside the class. 
    private String hiddenRegNr = ""; 
    private static String description = "This is a car". 

    // The constructor, which sets the value of hiddenRegNr 
    public Car(String regNr){ 
     hiddenRegNr = regNr; 
    } 

    // Method for reading hiddenRegNr, the only 
    // way to access it after instantiation. 
    public String getRegNr(){ 
     return hiddenRegNr; 
    } 

    // A static method. Can be used withouth instantiation. 
    public static String getDesc(){ 
     return description; 
    } 
} 

從一些其他類,你可以調用這個類,使它的實例;不同車輛的實際表示。它們代表不同的汽車,但是基於相同的「模型」,即Car類。

Car myFirstCar = new Car("SR12345"); 
Car myOtherCar = new Car("XZ54321"); 

現在你有兩個不同的汽車,有兩個不同的註冊號碼。這些是獨立的實例的類型汽車。它們存在於內存中,可能包含不同的值(在這種情況下,不同的註冊號)。

myFirstCar.getRegNr(); // Will return SR12345 
mySecondCar.getRegNr(); // will return xz54321 

這裏要注意的第一件事,就是你只能指定一次註冊號每車,即在創建。這是構造函數的要點:它設置值,並在創建對象(實例)時執行其他需要完成的操作。

現在,請注意getRegNr()和getDesc()之間的區別:關鍵字「Static」意味着第二個方法直接與類相關,而不是與每個實例相關。這意味着:

  • 呼叫至getDesc()是在該類製成,而不是一個實例:

    Car.getDesc();

  • 呼叫至getDesc()將返回該類車的所有實例相同的值

  • 變量描述(這也是靜態的)將是相同的所有實例汽車

  • 靜態方法getDesc()不能訪問變量hiddenRegNr,因爲該變量相關的SP獨特的實例。嘗試在靜態上下文中引用實例中的變量(如getDesc())將導致拋出異常。您可能會說hiddenRegNr在您撥打電話時不會設置爲

    Car.getDesc();

因爲構造函數從未被調用,所以它從來沒有被賦予任何值。

0

實際上,需要構造函數如果您需要爲類的實例指定唯一的初始狀態。在Java中,我只是剛剛意識到(我的朋友)我們可以這樣做:

public class MyClass1 { 
    private class MyClass2 {} 
    private MyClass2 myobj2 = new MyClass2(); 
} 

所以不需要隱式構造函數。 但是如果像下面這樣,你需要構造函數。

public class MyClass1 { 
    private class MyClass2 { 
     private int id_ = 0; 
     public MyClass2(int id) { id_ = id; } // how to reach this? 
    } 

    private MyClass2 myobj2 = new MyClass2(1); // (this doesn't work. Not unique) 

    public MyClass1(int id)  { myobj2 = new MyClass2(id); } // by this! 
} 
MyClass1 obj1 = new MyClass1(100); 
MyClass1 obj2 = new MyClass1(200); 
相關問題