2009-02-23 162 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; 
} 
}