【问题标题】:What happens when assign a return value from a method to a Class type variable in Java?将方法的返回值分配给 Java 中的 Class 类型变量时会发生什么?
【发布时间】:2021-02-03 15:22:17
【问题描述】:

我有一个公共类 Dog。

方法一:

public Dog getDog(Dog dog){
    if(dog.size>0){
      return dog;
    }
    return null;
}
    

方法二:

public Dog getNewDog(){
   return new Dog();
}

最后,给方法返回值赋值:-

Dog mydog = new Dog();
Dog d2 = new Dog();

Dog c = mydog.getDog(d2);   // are we assigning a reference variable back to another reference?
Dog k = mydog.getNewDog(); // Are we assigning a new dog object itself to the Dog type variable.

现在,为什么我们总是将方法中的值分配给引用变量?我在 Java 中随处可见。

【问题讨论】:

  • 请尝试改进问题
  • @Aman ,我应该更具体吗?
  • 当你问为什么“我们”做“总是”做 X 时,不要忘记包括你认为我们可以做的而不是 X。

标签: java object methods reference parameter-passing


【解决方案1】:

让我尝试回答您作为 cmets 提出的问题: A. 为什么我们总是将一个方法的值赋给一个引用变量? - 不一定是真的。 有些类一旦给定了值,就无法更改。这称为Immutable。例如,String 是不可变的,因此一旦为它分配了一个值,就无法更改相同的字符串。下面我们来看看 示例:

String s1 = "1";
String s2 = s1.concat("2")
s2.concat("3");
System.out.println(s2); // print out 12

输出为 12。原因是,每当您调用更改值的方法时,您都必须将其分配回去,否则您将丢失新值。 如您所见,对于Immutable 对象,有必要重新分配。但是,这是特殊课程。对于Dog,您不必每次更改其属性时都分配它。除非您明确需要创建一个新的Dog 对象。

B.我们是否将一个新的狗对象本身分配给 Dog 类型变量? 每当您声明一个引用类型的变量(扩展 Object)时,它将被分配为 null。如果你尝试访问它的属性,它会导致NullPointerException。因此,请记住,您必须为其分配一个值。

请注意,Dog k = mydog.getNewDog(); 相当于在您的代码中说 Dog k = new Dog();

C.我们是否将引用变量分配回另一个引用? 让我们看看你的代码:

public Dog getDog(Dog dog){
    if(dog.size>0){
        return dog;
    }
    return null;
}
        
Dog d2 = new Dog();
Dog c = mydog.getDog(d2);

对于这段代码:

  • 如果dog.size > 0 为真,d2c 将引用同一个对象。因此,您对其中之一所做的任何更改都会同时反映在两者上。
  • 如果dog.size > 0为假,c将被分配null

【讨论】:

    【解决方案2】:

    所以你正在做的是将新的 Dog 对象分配给变量 c 和 k,这会导致覆盖以前保存的狗。

    不一定非要这样做,但至少在三种情况下会有用:

    • 有时这种方式会减少代码行数
    • 如果您在其他地方使用了之前链接的对象,您可能不想到处更改它。如果一个方法返回一个新的(转换后的)对象,你可以确保旧的对象仍然可以在其他地方使用
    • 此模式可用于构建器或链接。如果一个方法返回了一只狗(不管它是新的还是旧的),你可以直接在同一行继续编写更多的方法调用。示例:mydog.getNewDog().bark();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多