为什么要在构造函数中重命名参数?

时间:2018-07-19 16:46:23

标签: java object constructor scope

我目前正在学习Java,由于这个问题,我经常被卡在编程中。也许因为我的Java词汇还不足以找到正确的答案。如果已经发布或有一个好的网页可以找到答案,请告诉我!

public class Car {

    private int numberOfDoors;
    private int maxSpeed;

public Car(int doors, int speed) {
    numberOfDoors = doors;
    maxSpeed = speed;
}

如果已经创建了int doorsint speed,为什么还要创建新的int numberOfDoorsint maxSpeed

5 个答案:

答案 0 :(得分:1)

  

如果已经创建了int numberOfDoors和int maxSpeed,为什么还要创建一个新的int门和int速度?

numberOfDoorsmaxSpeed是对象的当前状态。 int doorsint speed定义了要分配给对象的值。


只需将您的班级想象成蛋糕制作机

enter image description here

  • 您的机器(您的班级)需要2种成分(参数实参)才能制作蛋糕(制作对象)。

  • 糖和面粉槽类似于构造函数参数列表。 (创建对象所需的成分)

  • 添加到机器中的糖和面粉的实际数量是您在本课程中的贡献。

在代码中,这看起来像:

public class CakeMachine{

    private Sugar sugarInMachine;  //attribute
    private Flour flourInMachine;  //attribute

    //constructor
    public CakeMachine(Sugar sugarToBeAdded, Flour flourToBeAdded){
        sugarInMachine = sugarToBeAdded;  //assign argument to your attribute
        flourInMachine = flourToBeAdded;  //assign argument to your attribute
    }
}

答案 1 :(得分:0)

构造函数可以接收两个整数类型的参数。 每当创建一个类的实例时,它将需要两个参数,例如。

Car carinstance = new Car(4, 50);

在这里传递的这些参数将在构造函数中接收。构造函数变量的作用域是局部的。这些变量只能在构造函数中使用。

现在,这些局部变量将被分配给在类主体中声明的全局变量。这些变量是私有的(在一个类中),因此可以在该类的任何方法和构造函数中使用。

请参考任何Java教程,以了解Java中的类,构造函数,变量范围,访问修饰符和方法的概念。您可以从tutorialspoint开始获得基本概念。

答案 2 :(得分:0)

  

如果已经创建了int numberOfDoors和int maxSpeed,为什么还要创建一个新的int门和int速度?

首先,您真的不需要。您可以在一种情况下使用相同的名称:必须使用关键字this来区分这些变量的范围。

具有:

public class Car {

    private int numberOfDoors;
    private int maxSpeed;

    public Car(int doors, int speed){
       numberOfDoors = doors;
       maxSpeed = speed;
    }
}

此构造函数完全相同:

public Car(int numberOfDoors, int maxSpeed) {
   this.numberOfDoors = numberOfDoors;
   this.maxSpeed = maxSpeed;
}

关键字this始终引用类变量。如果不存在,并且构造函数的参数不包含任何其他同名变量,则它将根据我的答案中的第一个片段进行工作-找到了类变量。如果类和构造函数的参数都具有相同名称的变量,则会发生冲突并且仅识别构造函数的范围-因此需要用this来区分它们。

答案 3 :(得分:0)

在Java中,您具有字段,类,实例和本地(这是一种简化)的三种基本“种类”。

Class字段具有 static 修饰符。所有实例和所有方法共享这些字段。

实例字段是在任何方法之外定义的。实例的所有实例(非静态)方法共享这些字段。

局部字段定义在一个块内;方法是一种障碍。这些仅在块内共享。

参数是局部字段的一种特殊形式,其中方法是包含块。

在您的代码中,您有两组具有相同名称的字段,一组是实例,一组是本地(参数)。这导致本地字段“隐藏”了实例字段。

您有两种处理隐藏的方法。一种是重命名一组字段或另一组。这是我使用的方法。另一个是使用“ this”来“限定”实例字段。这告诉编译器您要始终查看实例以查找字段。

将值作为参数传递给构造函数的原因是为了初始化实例字段。这样,一旦构造函数完成并且调用了其他方法,实例将能够使用这些值。

答案 4 :(得分:0)

您想制造一辆汽车,因此您已经计划好汽车,将要开一些门,并为此提供最大速度。但是您只是计划了汽车,即您为汽车创建了一个蓝图(属于类)      您已经摆脱了梦想,开始构建梦想中的汽车,因此您必须使用“ new”关键字创建一个真实的对象。    Car car = new Car();   现在,您已经制造了一辆汽车,但是它没有按计划的那样开门和达到最大速度。

you can add those doors and max speed by using Car reference 

像这样
     car.numberOfDoors = 4;      car.maxSpeed = 200;

但是看起来很乏味并且不节省空间吗?    因此,java设计人员添加了一个名为Constructor的工具。

which is 
   public Car(int doors, int speed){
   numberOfDoors = doors;
   maxSpeed = speed;
 }

 the benefit of this is you can directly add numberOfDoors and maxSpeed when you are creating the object.

这是您的问题      您必须明确地告诉JVM哪个参数初始化哪个变量,否则JVM会造成混淆,并最终导致汽车以最大速度4行驶200门。我确定您无法处理它。电脑真的很笨,不要忘了您在屏幕上观看的所有内容都是由沙子制成的。您对他们的期望是您告诉他们的。