2012-02-09 140 views
1

這些是來自github上的spring amqp樣本,在 https://github.com/SpringSource/spring-amqp-samples.git 這些是什麼類型的java構造函數?他們對於吸氣者和二傳手是否是一個短手?什麼類型的java構造函數是這些?構造函數鏈接?

public class Quote { 

    public Quote() { 
     this(null, null); 
    } 

    public Quote(Stock stock, String price) { 
     this(stock, price, new Date().getTime()); 
    } 

爲oppossed這一個

public class Bicycle { 

public Bicycle(int startCadence, int startSpeed, int startGear) { 
    gear = startGear; 
    cadence = startCadence; 
    speed = startSpeed; 
} 
+0

可能重複(HTTP:/ /stackoverflow.com/questions/285177/how-do-i-call-one-constructor-from-another-in-java) – 2015-03-02 12:27:26

回答

5

這些構造函數重載調用使用this(...)另一個構造。第一個無參數構造函數使用空參數調用第二個無參數構造函數。第二個調用第三個構造函數(未顯示),它必須採用StockStringlong。這種被稱爲的構造函數鏈通常用於提供多種實例化對象的方法,而無需重複代碼。具有較少參數的構造函數使用缺省值填充缺失的參數,例如使用new Date().getTime(),否則僅傳遞null

注意,有必須至少有一個構造函數,它不叫this(...),而是提供了隨後的構造實施super(...)通話。如果在構造函數的第一行中未指定this(...)super(...),則暗示將調用super()的無參數。

因此,假如沒有在Quote類的詳細構造函數鏈,第三個構造很可能是這樣的:

public Quote(Stock stock, String price, long timeInMillis) { 
    //implied call to super() - the default constructor of the Object class 

    //constructor implementation 
    this.stock = stock; 
    this.price = price; 
    this.timeInMillis = timeInMillis; 
} 

還要注意,調用this(...)仍然可以依次執行,雖然這從偏離鏈接模式:

public Quote(Stock stock, String price) { 
    this(stock, price, new Date().getTime()); 

    anotherField = extraCalculation(stock); 
} 
+0

+1爲構造函數鏈的術語。 – 2012-02-09 02:29:35

+0

@Paul Bellora - 希望你不介意我把你的描述添加到了問題中去,讓它更清晰 – 2012-02-09 02:44:15

+0

@chohi - 不要介意,很高興這很有幫助。 – 2012-02-09 03:01:15

1

這就是我們所說的伸縮模式。但是你在Quote類中使用的方式沒有用。舉例來說,在你的課堂上,你有一個必需的屬性和兩個可選的屬性。在這種情況下,您需要爲構造函數提供必需的屬性,然後在該構造函數中需要使用可選參數的默認值調用其他構造函數。

// Telescoping constructor pattern - does not scale well! 
public class NutritionFacts { 
private final int servingSize; // (mL) required 
private final int servings; // (per container) required 
private final int calories; // optional 
private final int fat; // (g) optional 
private final int sodium; // (mg) optional 
private final int carbohydrate; // (g) optional 
public NutritionFacts(int servingSize, int servings) { 
this(servingSize, servings, 0); 
} 
public NutritionFacts(int servingSize, int servings, 
int calories) { 
this(servingSize, servings, calories, 0); 
} 
public NutritionFacts(int servingSize, int servings, 
int calories, int fat) { 
this(servingSize, servings, calories, fat, 0); 
} 

我從中提取有效的Java版這java代碼2.

0

它調用構造函數的整數參數。

這是我的Java教程頁面發現:

你可以參照從一個實例方法或使用該構造方法中到當前對象的任何成員。

在這種情況下,它從ArrayList類調用某些東西。這也在Java教程部分:

在構造函數中,還可以使用this關鍵字來調用同一個類中的另一個構造函數。這樣做被稱爲顯式構造函數調用。

那麼你在這種情況下,看到的是一個顯式構造函數調用

來源:https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

的[我如何從另一個調用一個構造函數的Java?]