我正在尝试学习如何在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)与装备,节奏和速度有什么区别?
在极少数情况下,我的导师或盐湖社区学院的任何管理员都遇到过这个问题,让我明白我的意图。这个问题是以最大的学术诚信精神张贴的。我要求这个问题寻求一般性的建议,并帮助理解使用Java编程语言的正确方法。我绝不会使用他人的作品,而是把它当作我自己的作品。我使用这里提供的答案作为我理解的一般帮助。我做自己的所有工作,不要复制回答我问题的人提供的工作。
答案 0 :(得分:35)
构造函数可以出现在类的代码中的任何位置。但是,按照惯例,大多数人将它们放在任何非构造函数的其他函数之前。
对于变量名,所有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.
}
}
希望有所帮助!
答案 1 :(得分:6)
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;
}
}
答案 2 :(得分: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,int 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"
}
}
如您所见,当您将值传递给构造函数时,您正在使用参数,当您看到构造函数代码时,您会看到参数名称(接收该参数),然后将其分配给实例属性。
答案 3 :(得分:3)
gear
,cadence
和speed
是变量。ints
传递给构造函数。名称(startCadence
,startSpeed
和startGear
称为形式参数,它们是您识别参数的方式。请参阅{{3} }。gear
,cadence
和speed
在类中的其他位置定义。类中的任何方法都可以引用它们。别担心 - 如果你从事这项工作,很快就会出现这种情况。
哦,我可以建议您使用一个好的IDE吗? http://en.wikipedia.org/wiki/Parameter_(computer_science)应该对初学者有用,对于更有经验的程序员来说BlueJ和NetBeans。源代码突出显示非常有用。
答案 4 :(得分:3)
在封装,导入,Javadoc和静态/实例变量声明部分之后,我通常将构造函数放在文件顶部附近。
gear,cadence和speed是类变量,可能是在某个构造函数之外定义的。 startCadence,startSpeed和startGear也是变量,但它们是传递给构造函数的参数。
您可能还会看到以下内容:
public Bicycle(int cadence, int speed, int gear) {
this.gear = gear;
this.cadence = cadence;
this.speed = speed;
}
,它从同名参数中设置类变量。
答案 5 :(得分:1)
您确实需要Head First Java
的副本答案 6 :(得分:0)
实际上,构造函数的参数不必存储为对象的成员变量。这是一个例子:
class NumberAsString {
private String numAsStr;
public NumberAsString(double number) {
this.numAsStr = Double.toString(number);
}
}
在此示例中,构造函数参数实际上并未存储在任何位置,但其值对于计算一个或多个成员变量值是必需的。
您所见过的行为(其中所有参数都直接存储为成员变量)非常常见。特别是对于某些类,只为其成员变量提供“getter”和“setter”方法(不提供任何计算或转换函数)。在java世界中,这些类通常被称为“bean”。 (其中,是的,这是一个非常愚蠢的名字。)
答案 7 :(得分:0)
int startCadence和cadence之间的基本区别不在于变量,而在于它们的范围。如果变量是在方法内部定义的,就像构造函数一样,它只存在于此方法中,但不存在于外部。如果在类中定义了变量,那么它将存在于该类的任何位置,这样的变量具有全局范围。 变量startCadence只存在于构造函数中,因此如果要在其他地方使用它的值,可以将它传递给具有全局范围的另一个变量。这就是这里发生的事情:cadence = startCadence;
答案 8 :(得分:0)
(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);
构造函数的放置是无关紧要的,但通常构造函数放在类定义的开头。
答案 9 :(得分: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.然后,构造函数将成员变量初始化为“start”对应的变量。
答案 10 :(得分:-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;
}
}