繁体   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