[英]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"
}
}
如您所見,當您將值傳遞給構造函數時,您正在使用參數,當您看到構造函數代碼時,您會看到參數名稱(接收該參數),然后將其分配給實例屬性。
gear
, cadence
和speed
是變量。 ints
傳遞給構造函數。 名稱( startCadence
, startSpeed
和startGear
被稱為形式參數 ,它們是您識別參數的方式。請參閱http://en.wikipedia.org/wiki/Parameter_(computer_science) 。 gear
, cadence
和speed
在課堂的其他地方定義。 類中的任何方法都可以引用它們。 別擔心 - 如果你工作,這種事情很快就會成為第二天。
哦,我可以建議您獲得一個好的IDE嗎? 對於初學者來說, BlueJ應該是好的,而對於更有經驗的程序員來說,它是NetBeans和Eclipse 。 源代碼突出顯示可能非常寶貴。
在封裝,導入,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)
參數是構造函數參數,它們將設置自行車字段的cadence
, speed
和gear
。 它們僅在構造函數中可用。 gear
, cadence
和speed
是每個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.