【问题标题】:Why renaming arguments in constructors?为什么要在构造函数中重命名参数?
【发布时间】:2018-12-27 21:48:20
【问题描述】:

我目前正在学习 Java,并且经常因为这个问题而陷入编程困境。也许是因为我的 Java 词汇量还不足以找到正确的答案。如果已经发布或者有好的网页可以找到答案,请告诉我!

public class Car {

    private int numberOfDoors;
    private int maxSpeed;

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

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

【问题讨论】:

  • 您需要那些引用在构建时传入的值。
  • numberOfDoors 和 maxSpeed 是 Car 对象的 状态的一部分。 门和速度只是传递给特定构造函数的参数; Car 实例会在构造函数退出时忘记它们,除非您将它们复制到实例的状态中。
  • 以上解释也适用于方法,不仅仅是构造函数。
  • @Sox 我看了这个页面,但我觉得它是为更高级的人准备的。对于初学者来说,这个答案太复杂了,无法理解和构建。还是谢谢!

标签: java object constructor scope


【解决方案1】:

如果已经创建了 int numberOfDoors 和 int maxSpeed,为什么还需要创建新的 int door 和 int speed?

numberOfDoors & maxSpeed 是对象的当前状态。 int doors & int speed 定义了您要分配给对象的值。


把你的班级想象成一个蛋糕制作机

  • 您的机器(您的班级)需要 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
    }
}

【讨论】:

  • 感谢您的示例。我知道我必须这样写,但在理性和情感上,我仍然觉得我必须使用“糖槽”来说明机器中会有多少糖是不自然和不必要的。看到我的例子 f.e.,它首先声明 int numberOfDoors,然后是 int door。如果我遵循这个例子,我会在类中声明 int 门,并在连接器 int numberOfDoors 中声明。有没有一种传统的写法? like 方法总是需要动词。
  • @Marco 你觉得我们在重复自己,因为你需要写两次numOfDoors。但是,这是必需的,因为当您通过构造函数创建对象时,您可能并不总是需要提供类中声明的所有属性。例如,您可以在不知道 maxSpeed 的情况下制作汽车对象。那么你的构造函数将只有numOfDoors
  • @Marco 我不确定我是否理解这个问题。 Car 实例有属性,你需要给这些属性赋值;在这种情况下,两个属性需要值。他们如何获得他们的价值观?
【解决方案2】:

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

Car carinstance = new Car(4, 50);

这里传递的这些参数将在构造函数中接收。构造函数变量的范围是本地的。这些变量只能在构造函数中使用。

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

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

【讨论】:

  • 我正在阅读整个 Oracle 文档,但如果没有示例,它并没有真正进入我的脑海。这就是我现在尝试其他页面的原因,所以让我们看看我是否会掌握它.感谢您的帮助!
  • 最初不要使用 oracle 文档。首先参考一些教程网站。熟悉 java 之后,可以去 oracle java docs 获取详细帮助。
【解决方案3】:

如果已经创建了 int numberOfDoors 和 int maxSpeed,为什么还需要创建新的 int door 和 int speed?

首先要说,你真的不需要需要。您可以在一种情况下坚持使用相同的名称:您必须使用关键字 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 总是指类变量。如果不存在并且构造函数的参数不包含任何其他同名变量,它会根据我的答案中的第一个 sn-p 工作 - 找到类变量。如果类和构造函数的参数都具有同名变量,则会发生冲突,并且只能识别构造函数的范围 - 因此需要用this区分它们。

【讨论】:

  • 感谢您的回答。如果我添加更多对象,您的建议不会使任何事情复杂化吗?或者我可以将 this.numberOfDoors 用于我在此之后创建的任何对象吗?什么是写下来​​的传统方式?
  • 标准约定是我回答的第二个 sn-p。为简洁起见,使用关键字this 引用类变量始终是一个好习惯。
【解决方案4】:

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

类字段有一个 static 修饰符。所有实例和所有方法共享这些字段。

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

本地字段在块内定义;方法是一种块。这些仅在块内共享。

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

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

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

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

【讨论】:

    【解决方案5】:

    您想制造一辆汽车,因此您已经计划好您的汽车,将有一些车门,并希望为此提供最大速度。但是您只是为汽车计划了,即您为汽车创建了蓝图(这是类) 你已经从梦想中走出来,开始建造你梦想中的汽车,这样你就必须使用“new”关键字来制作一个真实的对象。 汽车 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 会混淆并最终建造一辆有 200 个门且最大速度为 4 的汽车。我相信您无法处理它。电脑真的很笨,别忘了你在屏幕上看到的一切都是用沙子做的东西处理的。你对他们的期望就是你告诉他们的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-25
      • 2013-07-06
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2017-07-07
      相关资源
      最近更新 更多