2009-02-23 156 views
24

我想了解如何在Java中指定類構造函數。我開始明白,他們指定了由該類創建的對象的實例變量的類型。它們也可以用來設置實例變量的初始值。以下示例來自Sun網站上的Java教程:Java構造函數

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

在您的類源代碼中應該放置構造函數嗎?

這些參數是變量的名稱?(int startCadence,int startSpeed,int startGear)還是齒輪,節奏和速度變量的名稱?

(int startCadence,int startSpeed,int startGear)和齒輪,節奏和速度有什麼區別?

萬一我的導師或鹽湖社區學院的任何管理員遇到過這個問題,讓我明確我的意圖。這個問題張貼在學術誠實的最大精神。我問這個問題尋求一般建議,並幫助理解使用Java編程語言的正確方法。我絕不會利用別人的工作,並把它當作我自己的工作。我使用這裏提供的答案作爲我理解的一般幫助。我做所有我自己的工作,不要複製回答我的問題的人提供的工作。

回答

33

構造函數可以出現在類的代碼中的任何地方。然而,按照慣例,大多數人把它們放在非構造函數的其他函數之前。

至於變量名稱,所有6實際上是變量名稱,但範圍是不同的。指定爲構造函數的參數(startCadence,startSpeed,startGear)只能在構造函數中使用。其他3(齒輪,節奏,速度)可能是全班變量,可用於所有方法。然而,這個定義並沒有顯示在你的代碼片段中。全班會看起來像mroe:

class Bicycle 
{ 
    // class-level variables 
    private int gear; 
    private int cadence; 
    private int speed; 

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

    // another method (not a constructor) 
    public void ShiftUp() { 
     gear = gear + 1; // notice the 'gear' variable is available here too. 
    } 
} 

希望幫助!

1

你真正需要的Head First Java

+0

@Offensive vote:這不是真正的冒犯,只是不太有用。 – OscarRyz 2009-02-23 23:25:02

+0

Stackoverflow並不是亞馬遜會員鏈接的地方。請保留這些用於您的個人項目。 – 2013-12-04 14:06:03

+0

我沒有亞馬遜的聯屬賬戶。 – Fortyrunner 2013-12-04 22:59:19

3
  1. 這完全取決於你的副本。我通常從所有變量開始,然後是構造函數,然後是方法,但這只是個人偏好。
  2. 參數的名稱完全不相關,只要您不將它們命名爲與變量相同的東西即可。在本例中,gearcadencespeed是變量。
  3. 你(或某人)將三個ints傳遞給構造函數。名字(startCadencestartSpeed,並且startGear被稱爲形式參數,他們是可以識別的參數的方式。見http://en.wikipedia.org/wiki/Parameter_(computer_science)
    gearcadencespeed在類中定義的其他地方。在任何方法這個類可以參考他們

別擔心 - 如果你在它的工作,這樣的事情將是第二自然很快

哦,我可能會建議你得到一個好的IDE?BlueJ是假設的d適合初學者,NetBeansEclipse適合有經驗的程序員。源代碼高亮可以是非常寶貴的。

3

我通常把我的構造函數放在我的文件的頂部附近,包,導入,Javadoc和靜態/實例變量聲明部分之後。

齒輪,節奏和速度是類變量,大概是在構造函數的某個地方定義的。 startCadence,startSpeed和startGear也是變量,但它們是傳遞給構造函數的參數。

你也可以看到這樣的事情:

public Bicycle(int cadence, int speed, int gear) { 
    this.gear = gear; 
    this.cadence = cadence; 
    this.speed = speed; 
} 

這臺從同一個名字的參數,類變量。

6

齒輪,節奏和速度是該類的成員變量(在別處聲明),startCadence,startSpeed和startGear是函數參數。

class Bicycle 
{ 
    private int gear, cadence, speed; 

    public Bicycle(int startCadence, int startSpeed, int startGear) 
    { 
     // set the value of member variables from passed parameters 
     gear = startGear; 
     cadence = startCadence; 
     speed = startSpeed; 

    } 
} 
0

實際上,構造函數的參數不必存儲爲對象的成員變量。下面是一個例子:

class NumberAsString { 

    private String numAsStr; 

    public NumberAsString(double number) { 
     this.numAsStr = Double.toString(number); 
    } 

} 

在這個例子中,構造參數實際上不存儲在任何地方,但其值是必要的一個或多個成員變量值的計算。

您看到的行爲,其中所有參數都直接存儲爲成員變量,這種行爲很常見。特別是對於爲其成員變量(不提供任何計算或轉換函數)提供「getter」和「setter」方法的某些種類的類。在java世界中,這些類通常被稱爲「bean」。 (這是一個非常愚蠢的名字。)

0

int startCadence和節奏之間的基本區別不在變量中,而是在它們的範圍內。如果一個變量是在一個方法內部定義的,比如一個構造函數,它將只存在於這個方法中,但不在外部。如果一個變量是在一個類中定義的,它將在該類中的任何地方存在,這樣的變量具有全局範圍。 變量startCadence wll只存在於構造函數內部,所以如果你想在其他地方使用它的值,你可以將它傳遞給另一個具有全局作用域的變量。這是在這裏發生的事情:節奏= startCadence;

5

在你的類源代碼中你應該放置構造函數嗎?

我使用以下命令:

package statement .... 
import statements.... 


public class MyClass { 
    // instance attributes 
    private int i; 

    // class attribute 
    private static int MAX; 

    // static methods 
    public static int getClassCount() { 
    } 

    // Constructor!! 
    public MyClass() { // constructor. 
    } 

    // public methods 
    // protected methods 
    // private methods 

    // public static void main 
} 

但他們可以去任何地方。我覺得這是更好的喲把東西按順序排列。例如,我寧願在私有方法之前使用公共方法(所以如果我正在尋找特定的公共方法,我知道它在文件的頂部)。出於同樣的原因,我通常會將構造函數置於頂部。

這些參數是變量名嗎?:

沒有必要,您可以根據需要命名它們。我通常使用相同的名字。

...或者是齒輪,節奏和速度變量的名字? ...

他們是實例變量名

是什麼(INT startCadence,詮釋startSpeed,INT startGear)和齒輪,節奏和速度之間的差異?

第一個是構造函數的參數名稱,前者是它自身的對象的屬性名稱。

藉此其他樣本:

public class Person { 
    private String name; // a person has a name. 

    public Person(String nameParameter) { 
     this.name = nameParameter; 
    } 
    public String toString() { 
     return "My name is : " + this.name; 
    } 

    public static void main(String [] args) { 

      // creates a new "instance" and assign "Patrick" as its name. 
     Person one = new Person("Patrick"); 
     System.out.println(one); // prints "My name is: Patrick" 

     // each person have its own name. 
     Person two = new Person("Oscar"); 
     System.out.println(two); // prints "My name is: Oscar"   


    } 
} 

正如你看到的,當你傳遞一個值給構造你使用的說法,當你看到構造函數的代碼,你看到的參數名稱(接收該參數),然後將其分配給實例屬性。

0

(int startCadence, int startSpeed, int startGear)參數是構造函數參數,它們將設置自行車字段cadencespeedgear。它們僅在構造函數中可用。 gearcadencespeed是每個Bicycle實例唯一的實例變量,可從其他方法引用。 構造函數參數允許您爲對象的初始化提供參數。在該示例中,可以創建一個自行車對象以1:1的齒輪,0節奏和0,像這樣的速度:

Bicycle bike = new Bicycle(0, 0, 1); 

也可以創建一個移動自行車,其中節奏是60轉,並且的速度爲10英里,在第三齒輪像這樣:

Bicycle bike = new Bicycle(60, 10, 3); 

構造的放置是不相關的,但通常的構造被放置在類定義的開頭。

0

1)構造函數的位置絲毫不重要。然而按照慣例去,我會親自地方它如下:

public class Bicycle { 

    public int gear, cadence speed; 

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

    public void otherFunction1() {} 
    public void otherFunction2() {} 
    public void otherFunction3() {} 

} 

2)齒輪,節奏和速度是類的成員變量;他們屬於每輛自行車,並且是每輛自行車的不同變量。然而,startCadence,startSpeed和startGear是局部變量,它們只屬於該函數。當我要求

new Bicycle(10, 15, 5); 

startCadence設置爲10,startSpeed設置爲15,並startGear設置爲5。然後,構造函數初始化成員變量他們的「啓動」對應的變量。

-2
public class Account 

{ 

    private static final Exception InsufficientFundsException = null; 

    private int accountNumber; 
    private double availableBalance; 
    private int pin; 
    public Account(int account, int pin,double amount) 
    { 

     this.accountNumber = account; 
     this.pin = pin; 
     this.availableBalance = amount; 
    } 

    public void credit(double amount) 
    { 
     this.availableBalance= this.availableBalance+amount; 
    } 

    public void debit(double amount) throws Exception 
    { 
     if(this.availableBalance>=amount) 
     { 
     this.availableBalance= this.availableBalance-amount; 
     } 
     else 
     { 
      throw new InsufficientFundsException(); 
     } 

    } 

    public int getAccountNumber() 
    { 
     return accountNumber; 
    } 

    public double getAvailableBalance() 
    { 
     return availableBalance; 
    } 
    public String toString() 
    { 
     return "Account="+accountNumber+"pin="+pin+"balance"+availableBalance; 
    } 
    public boolean validatePIN(int pin) 
    { 
     if(this.pin==pin) 
      return true; 
     else return false; 
} 
}