【问题标题】:Setting object value with method in main class?在主类中使用方法设置对象值?
【发布时间】:2018-10-19 14:31:25
【问题描述】:

我正在尝试使用方法设置数组中对象的特定值。

public class BankAccount
{
private String name;

//constructor
public BankAccount(String firstName, String LastName)
{

name = firstName + " " + lastName;

}

public String getName()
{
return name;
}

上面是我的BankAccount 类,我还有另一个类名为BankAccountList

public class BankAccountList {
    public static void main(String args[]){

    BankAccount bankAccount[] = new BankAccount[2];

    bankAccount[1] = giveName("MR", "Travis");
    }

    public static void giveName (String firstName, lastName){

    }
}

如何使用以下giveName() 方法将BankAccount[1] 中的对象名称设置为“Mr Travis”?我不知道用给定的参数在giveName 中输入什么。任何提示将不胜感激。

【问题讨论】:

  • 您基本上是在尝试使用给定名称分配一个新的银行帐户对象。因此,您可以通过该方法传递银行帐户对象,也可以从 giveName 方法返回一个新的银行帐户。如果您通过它,则不需要创建新对象,因为您只需传入 BankAccount[1] 类型的 BankAccount。
  • 我的第一个提示是:应用正确的格式,这将使您的代码更具可读性。其次,您创建了一个BankAccount 数组,但请注意该数组尚未包含任何BankAccount 对象。
  • 您的代码不可读且奇怪。这是基本的java知识。不用于论坛讨论...
  • 老实说,我很喜欢这个问题。这绝对是一个有点奇怪的结构,但并非不可读。以后可能对许多其他人没有帮助,但在您采用一些标准之前,它引发了很多关于如何最好地优化代码以及了解学习编码有多难的讨论。

标签: java arrays methods


【解决方案1】:

您的giveName 方法应返回BankAccount 类型:

public static BankAccount giveName (String firstName, String lastName){
   return new BankAccount(firstName, lastName);
}

编辑

简单地声明new BankAccount[] 不会填充数组中的任何条目(根据使用其他语言的经验,您可能会期望)。该数组最初为空,有多种填充方式:

在循环中你可以:

  • 直接调用BankAccount构造函数
  • 委托给另一个返回新.collect(Collectors.toSet())的方法(如上例所示)

与大多数编程决策一样,此选择主要是个人喜好。对于具有 2 个字符串字段的简单 DTO,委派给另一个方法可能是矫枉过正。

对于需要验证的更复杂的 DTO,委托给另一个方法有助于将验证逻辑封装在一个易于测试的位置。

【讨论】:

  • lastName 参数需要一个类型。
  • 确实 :) 复制了 OP 的代码并添加了返回类型。现已修复。
  • 我认为 OP 可能认为创建数组将包含对象。但是,值得一提的是,新创建的数组只包含定义类型对象的空槽,因此数组中不存在任何对象。但是,此方法实际上会创建对象,将其返回,然后将其提供给数组。只是让你知道会发生什么!但是,这里的 giveName 方法并不是真正需要的,因为您可以完全跳过它,而是说 | bankAccount[1] = new BankAccount("MR", "Travis");直接在main方法里面
  • @KjetilNordin 是的,在这里简单地调用构造函数可能就足够了。除了尝试遵循 OP 的原始代码之外,我还喜欢将对象的创建委托给另一个方法,因为该方法可以在创建对象之前封装对象的任何验证。这个微不足道的例子显然不需要,但这只是我多年来采用的一种风格。我会在空数组初始化上添加一点,谢谢。
【解决方案2】:

这里有几件事值得一提。

首先,您似乎对静态和动态之间的区别没有完全了解。这是可以理解的,即使我现在也很难轻松地解释它,即使我理解它是如何工作的。您的 BankAccountList 类有一个 main 方法,从静态标准 main 方法开始。您的 bankAccount 数组是在这个 main 方法中定义的,这意味着它不存在于整个类中,只存在于正在运行的 main 方法中。

然后您想为列表中的银行帐户命名。在这里,您创建了另一个静态方法,它对 main 方法中的内容一无所知,并且它不包含任何可以提供参数的对象。换句话说,您现在拥有的空函数无法为银行帐户设置任何参数,因为该方法中不存在银行帐户。

我建议将giveName 方法设为动态方法(这意味着只需删除 static 关键字),并将该方法移至BankAccount 类。然后,您将有效地拥有 name 的 get 和 set 方法,它们是动态的,这意味着它对类的每个对象实例都有效。之后,可以先引用数组中的一个对象,然后直接在该特定对象上调用giveName()方法,这将设置名称:

public class BankAccount
{
    private String name;

//constructor
public BankAccount(String firstName, String LastName)
{

    name = firstName + " " + lastName;

}

public String getName()
{
    return name;
}

public void giveName (String firstName, String lastName){
    name = firstName + " " + lastName;
}

和:

public class BankAccountList {
    public static void main(String args[]){

        BankAccount bankAccount[] = new BankAccount[2];

        bankAccount[1].giveName("MR", "Travis");
    }
}

更新:

我现在注意到另一件事。创建数组的行: BankAccount bankAccount[] = new BankAccount[2];

这不会创建填充数组,而是创建一个空数组。换句话说,您还没有创建一个包含银行账户的列表,您已经创建了一个可以持有银行账户的列表。您必须先创建一个银行帐户,然后才能为其命名。

BankAccount bankAccount[] = new BankAccount[2];
bankAccount[1] = new BankAccount("MR", "Travis");

现在,您的构造函数在创建时已经具有用于为帐户命名的参数。所以现在你真的不需要 giveName 方法了。除非您以后想更改它:

bankAccount[1].giveName("MRS", "Davis");

【讨论】:

  • 我看到很多其他答案提供了很多有效的解决方案和提示,但希望 OP 能够自动直观地理解他们的方法为何有效以及如何有效。我认为这是解决问题的最简单方法,无需编辑代码即可。话虽如此,我也会将 giveName 的名称更改为 setName 以遵循标准。
  • 嗯,这很有意义。我将giveName 方法解释为 BankAccountList 类中的辅助方法或类似的方法(假设BankAccount 中有一个setName,因为有一个getNamesetX公约),但这可能是 OP 真正想要的。只有他/她能说出来;)
  • 我第一次也犯了一个大错误...忘记实际填充数组空间...现在应该修复。我在数组中工作不多,更多列表...
【解决方案3】:

你真的不需要使用giveName 方法,你可以这样做:

bankAccount[1] = new BankAccount("MR", "Travis");

但是,如果你真的需要使用giveName 方法,你可以这样做:

// change signature to return `BankAccount` object
public static BankAccount giveName (String firstName, String lastName){
    return new BankAccount(firstName, lastName);
}

并这样称呼它:bankAccount[1] = giveName("MR", "Travis");


如果您需要giveName 以将void 作为返回类型,那么您需要传递数组以便在方法中添加BankAccount 以及它将被添加的位置。像这样:

// change in order to signature receive an array of `BankAccount`s and the position where it will be added
public static void giveName (String firstName, String lastName, BankAccount[] bankAccounts, int position) {
   bankAccounts[position] = new BankAccount(firstName, lastName);
}

然后这样称呼它:giveName("MR", "Travis", bankAccount, 1);


补充说明

  • 记住数组位置从索引0开始,而不是1,因此您可能需要考虑从0而不是1添加银行帐户,如下所示:
  • 如果giveName 属于BankAccountList 类,就会出现这种情况。否则,请选择KjetilNordin's answer

bankAccount[0] = giveName("MR", "Travis");

【讨论】:

  • 如果我错了,请纠正我,对于涉及更改对象值的事情,不可能将 void 作为返回类型?
  • @mrtammy 如果您只需要更改方法内部的某些内容并且根本不需要返回任何内容,则可以将void 作为返回类型。但在这种情况下,您需要将 BankAccount 类型的对象分配给 bankAccount[1],因此您需要将 BankAccount 作为返回类型返回,而不是 void。如果您需要 giveNamevoid 作为返回类型,请阅读我更新的答案。
  • @mrtammy 如果giveNameBankAccountList 类中,情况就是这样。否则,去 KjetilNordin 的 asnwer
【解决方案4】:

您定义了一个包含 BankAccount 对象的数组,因此要使用 giveName() 函数向其中添加元素,您需要修改该功能如下:

public class BankAccountList {
    public static void main(String args[]){

    BankAccount bankAccount[] = new BankAccount[2];

    bankAccount[1] = giveName("MR", "Travis");
    }

    public static BankAccount giveName (String p_firstName,String p_lastName){
      return new BankAccount(p_firstName, p_lastName)
    }
}

【讨论】:

  • YouneS p_lastName 参数需要一个类型
【解决方案5】:

您需要set 方法!

将此添加到 BankAccount 类中:

public void setName(String firstName, String lastName) {
            this.name = firstName + " " + lastName;
}

所以你应该调用 setName 而不是 giveName。像这样:

 bankAccount[1].setName(String firstName, String lastName)

另外,我建议你在你的对象的构造函数中使用set方法:

//constructor
public BankAccount(String firstName, String LastName)
{

   setName(String firstName, String lastName);

}

【讨论】:

  • bankAccount[1].setName(String firstName, String lastName)?有两个参数?
  • 只有一个属性'name'
  • 我从你的回答中复制了这个bankAccount[1].setName(String firstName, String lastName)...它有两个参数。
  • 两者的串联
  • 您还需要在构造函数中更正这一行:setName(String firstName, lastName);。不正确
猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多