簡體   English   中英

Java構造函數

[英]Java Constructors

我試圖學習如何在Java中指定類構造函數。 我開始明白它們指定了從該類生成的對象的實例變量的類型。 它們還可用於設置實例變量的初始值。 以下示例來自Sun網站上的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)和gear,cadence和speed之間的區別是什么?

在極少數情況下,我的導師或鹽湖社區學院的任何管理員都遇到過這個問題,讓我明白我的意圖。 這個問題是以最大的學術誠信精神張貼的。 我要求這個問題尋求一般性的建議,並幫助理解使用Java編程語言的正確方法。 我絕不會使用他人的作品,而是把它當作我自己的作品。 我使用這里提供的答案作為我理解的一般幫助。 我做自己的所有工作,不復制回答我的問題的人提供的工作。

構造函數可以出現在類的代碼中的任何位置。 但是,按照慣例,大多數人將它們放在任何非構造函數的其他函數之前。

至於變量名,所有6個實際上都是變量名,但范圍是不同的。 指定為構造函數的參數(startCadence,startSpeed,startGear)僅在構造函數中可用。 其他3(齒輪,節奏,速度)可能是全班變量,適用於所有方法。 但是,您的代碼段中未顯示該定義。 完整的課程看起來像是:

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.
    }
}

希望有所幫助!

gear,cadence和speed是類的成員變量(在別處聲明),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;

    }
}

在你的類源代碼中你應該把構造函數放在哪里?

我使用以下內容:

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,int startSpeed,int startGear)和gear,cadence和speed之間的區別是什么?

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

拿這個樣本:

 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"         


     } 
 }

如您所見,當您將值傳遞給構造函數時,您正在使用參數,當您看到構造函數代碼時,您會看到參數名稱(接收該參數),然后將其分配給實例屬性。

  1. 這完全取決於你。 我通常從所有變量開始,然后是構造函數,然后是方法,但這只是個人偏好。
  2. 參數的名稱完全不相關,只要您不將它們命名為與變量相同的名稱。 在這個例子中, gearcadencespeed是變量。
  3. 你是(或某人)將三個ints傳遞給構造函數。 名稱( startCadencestartSpeedstartGear被稱為形式參數 ,它們是您識別參數的方式。請參閱http://en.wikipedia.org/wiki/Parameter_(computer_science)
    gearcadencespeed在課堂的其他地方定義。 類中的任何方法都可以引用它們。

別擔心 - 如果你工作,這種事情很快就會成為第二天。

哦,我可以建議您獲得一個好的IDE嗎? 對於初學者來說, BlueJ應該是好的,而對於更有經驗的程序員來說,它是NetBeansEclipse 源代碼突出顯示可能非常寶貴。

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

gear,cadence和speed是類變量,可能是在某個構造函數之外定義的。 startCadence,startSpeed和startGear也是變量,但它們是傳遞給構造函數的參數。

您可能還會看到以下內容:

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

它從同名參數中設置類變量。

你真的需要一個Head First Java的副本

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

class NumberAsString {

   private String numAsStr;

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

}

在此示例中,構造函數參數實際上並未存儲在任何位置,但其值對於計算一個或多個成員變量值是必需的。

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

int startCadence和cadence之間的基本區別不在於變量,而在於它們的范圍。 如果變量是在方法內部定義的,就像構造函數一樣,它只存在於此方法中,但不存在於外部。 如果在類中定義了變量,那么它將存在於該類的任何位置,這樣的變量具有全局范圍。 變量startCadence只存在於構造函數中,因此如果要在其他地方使用它的值,可以將它傳遞給另一個具有全局范圍的變量。 這就是這里發生的事情:cadence = startCadence;

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

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

或者你可以創建一個移動的自行車,其節奏是60轉,速度是10英里/小時,在3檔如下:

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

構造函數的放置是無關緊要的,但通常構造函數放在類定義的開頭。

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.然后,構造函數將成員變量初始化為其“start”對應變量。

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;  
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM