【问题标题】:Basic Java Returning Value基本 Java 返回值
【发布时间】:2014-11-30 11:22:21
【问题描述】:

嘿,我真的对 java 中的返回感到困惑。请帮我解决我的痛苦...提前谢谢:)

public static void main(String[] args){


    System.out.println(addThem(1,2));

}

public static int addThem(int a, int b){

    int c = a + b;

    return c;
}

我可以理解,在上面的代码中,将“c”作为新变量/添加结果返回。 这是另一种让我感到困惑的方法>>

public static void main(String[] args){

    int d = 5;
    tryToChange(d);

    System.out.println("tryToChange d = " + d);     
}

public static void tryToChange (int d){

    d = d + 1;
    System.out.println("tryToChange d = " + d);
}

当我尝试执行此代码时,它会返回

tryToChange d = 6
tryToChange d = 5

显示tryToChange方法中的值返回的是5+1的值,也返回了value。但是为什么是void呢?

【问题讨论】:

标签: java


【解决方案1】:

在这两种方法中,变量d 是一个方法范围的变量。这意味着它仅适用于方法本身。此外,这意味着变量d 实际上是两个独立的变量,每个方法中都有一个。 tryToChange 方法只改变它自己的局部变量(在签名中声明为参数),它不会改变main 方法中的d 变量(这是一个单独的变量)。

所以在main 中,d 会得到值 5,并在整个执行过程中保持这个值。在tryToChange 中,它将收到5 的值,添加1 并打印结果(6)。返回时,将打印main 方法的d-变量(并且此变量未更改,因此将打印5。)

在 Java 中,原始值(int、char 等)通过 by value 传递。这意味着更改此类参数不会更改方法本身之外的任何内容。另一方面,我们传递了by reference,它适用于对象(例如列表),这意味着您实际上可以修改列表本身(但不能修改调用方法中保存列表的变量。)

public void a() {
    final List<String> myList = new ArrayList<>();
    b(myList); 
}

public void b(List<String> something) {
   something.add("something"); //Changes myList in a().
   something = new ArrayList<>(); //Does nothing to myList in a().
}

【讨论】:

    【解决方案2】:
    1. tryToChange 不返回值,它只是将其打印到 out
    2. Java 中的基元是按值传递的,因此第二次打印到out 会打印5,这是局部变量d 的值。见:is-java-pass-by-reference-or-pass-by-value

    您可以将您的int“包装”在一个类中,以查看按引用传递(实际上它仍然是按值传递,但引用就是值)的行为方式:

    class IntWrapper {
       public int d;
    
       public IntWrapper(int d) {
           this.d = d;
       }
    }
    
    public static void main(String[] args){
    
        IntWrapper wrapper = new IntWrapper(5);
        tryToChangeWrapped (wrapper); // will print 6
    
       System.out.println("tryToChange d = " + wrapper.d); // will print 6
    }
    
    public static void tryToChangeWrapped (IntWrapper wrapper){
    
        wrapper.d = wrapper.d + 1; // or wrapper.d += 1 or wrapper.d++
        System.out.println("tryToChangeWrapped d = " + wrapper.d);
    }
    

    【讨论】:

      【解决方案3】:

      您的 tryToChange() 函数没有返回任何值。因此它是无效的。 很明显,您正在调用 tryToChange 函数,该函数执行打印传递给它的值的任务。

      【讨论】:

        【解决方案4】:

        第一:

        java 中的所有原语都是按值传递的,所以它只是将值传递给方法tryToChangetryToChange 只是在递增后打印它,它也不返回任何值,因为它的返回类型是 void

        第二:

        main 中,它只获取其局部变量d 并在本地打印它。这就是为什么输出是这样的。

        tryToChange d = 6
        tryToChange d = 5
        

        【讨论】:

          【解决方案5】:

          你只需要修改你的代码

          public static void main(String[] args) {
              int d = 5;
              System.out.println("Current value if d: " + d);
              d = tryToChange(d);// assign returning value to d 
              System.out.println("New value of d: "+d);
          }
          
          public static int tryToChange(int d) { // needs to return value from here
              d = d + 1;
              return d;
          }
          

          输出:

          Current value if d: 5
          New value of d: 6
          

          【讨论】:

            【解决方案6】:

            tour 两种情况都不同。首先你需要了解return语句的使用。 “返回”语句总是返回值。

            在你的第一种情况下:-

            public static void main(String[] args){
            
            
                System.out.println(addThem(1,2));
            
            }
            
            public static int addThem(int a, int b){
            
                int c = a + b;
            
                return c;
            }
            

            您正在调用 addThem() 方法。将两个值相加并将总和存储到 c 变量中,然后接下来您将返回变量 c。但实际上变量 c 没有返回,但作为 (a+b) 之和的 c 变量值正在返回。所以在这种情况下 jvm 返回变量 c 的值而不是变量 c。

            在你的第二种情况下:-

            public static void main(String[] args){
            
                int d = 5;
                tryToChange(d);
            
                System.out.println("tryToChange d = " + d);
            
            
            }
            
            public static void tryToChange (int d){
            
                d = d + 1;
                System.out.println("tryToChange d = " + d);
            }
            

            现在您正在调用 tryToChange() 方法。因为当这个方法被调用时,它取变量 d 的值而不是变量 d。并且 tryTOChange() 方法定义获取 d 的值。

            这里 main() 和 tryTOChange() 方法中的 d 变量是不同的。因为 d 变量声明为局部变量。 所以当 main() 方法在两个 d 变量中调用 tryTochange() 方法时具有相同的值。但是当 d 增加 1 时,主方法中 d 变量的值是 5 或 tryTOchange() 中的值是 6,因为范围不同。因此,当 tryToChange() 中的 sop print d 打印 6 并在 main 方法中打印 5 时。当 tryTochange() 方法完成主体时,它不会向 main 方法返回任何值。那为什么 main 方法中的 d 变量的值是 5

            【讨论】:

            • 非常感谢您的具体解释!:D 我现在明白它是如何工作的^^
            猜你喜欢
            • 1970-01-01
            • 2020-07-24
            • 2018-01-02
            • 2018-07-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-11
            • 1970-01-01
            相关资源
            最近更新 更多