为什么需要退货声明

时间:2016-04-18 12:11:00

标签: java

我非常愚蠢地怀疑为什么我们在方法中使用return语句。如果不在方法中使用return语句,我们也可以获得所需的值 例如

package testing;

public class ReturnMethod {
    static int a = 10;
    static int b = 5;
    static int c;
    static int d;

    public static void add() {
        c = a + b;

    }

    public static int returnAddValue() {
        d = a + b;
        return d;
    }

    public static void main(String[] args) {
        add();
        System.out.println("c: " + c);
        int value = returnAddValue();
        System.out.println("value: " + value);

    }

}

在以上两个例子中我得到了输出

c: 15
value: 15

所以我怀疑何时使用return语句以及为什么需要

9 个答案:

答案 0 :(得分:2)

使用return statementreturn value无需保存在任何全局,外部或成员变量中。

但是,如果没有return statement,您必须准备一些outer变量值来跟踪它。

答案 1 :(得分:1)

如果将方法的结果分配给静态变量(实际上,通过设置静态变量传入方法的"参数"),当两个方法调用该方法时,您会遇到问题并发线程,因为变量是为方法的所有调用共享的:

Thread t1 = new Thread(() -> {a = 1; b = 2; add(); }); t1.start();
Thread t2 = new Thread(() -> {a = 3; b = 4; add(); }); t2.start();
t1.join(); t2.join();

您不知道哪些线程首先运行,或者即使它们同时运行;因此,当您致电a时,您不知道badd()的价值,也不知道之后c中的值是否为第一个或第二个线程(或两者的混合)中的调用结果。

之后存储在c中的值可以是357中的任何一个(或任何其他值,如果有另一个的话题>同时在此代码之外同时调用add()

如果通过将ab作为方法参数传递,并将结果作为返回值接收,则将值保持在堆栈中,这样线程干扰问题就会完全消失。

即使您的代码是单线程的,只需写一下它就是丑陋的:

a = 1;
b = 2;
add();
int result = c;

而不是

int result = add(1, 2);

答案 2 :(得分:0)

当您需要返回值的方法时,应该使用return语句。

在您的情况下,两种方法都有效 但是当你不希望你的班级的某个领域被另一个班级改变时,你可以,并且应该使用返回的方法。

例如,当您创建与银行帐户相关的软件时,您希望money看到,而不是已更改。因此,您将money设为私有,并制作一个返还资金的方法。通过这种方式,其他类只能钱,但不能更改

答案 3 :(得分:0)

首先,您的功能不同,如您所见

public static **void** add()

public static **int** returnAddValue()

第一个不返回任何内容,因为它返回类型为void,第二个返回类型为int。 第一个起作用,因为c是一个全局变量。

答案 4 :(得分:0)

如果不将结果存储在类的(静态)变量中,通常会使用return。

public class ReturnMethod {
    static int a = 10;
    static int b = 5;

    public static void add() {
        int c = a + b;
    }

    public static int returnAddValue() {
        int d = a + b;
        return d;
    }

    public static void main(String[] args) {
        add();
        //not possible to access c here
        //System.out.println("c: " + c);
        int value = returnAddValue();
        System.out.println("value: " + value);
    }
}

在该修改示例中,您无法访问add()方法的结果。

您应该阅读Scopes in Java

答案 5 :(得分:0)

你有一个类变量c& d。这些变量与类关联并存储在堆中。如果为其分配一个值,则可以在没有显式return语句的情况下访问它。但是如果你在方法中声明了d,则需要使用return语句将值返回给调用者。

答案 6 :(得分:0)

您能够访问类变量c的值的原因是它已初始化为静态。如果不是这种情况,只要add方法结束,c变量中的信息就会丢失。方法具有返回值的原因是,如果对象数据中存在任何操作,则用户可以获取更新的值。在这种情况下,如果对数据进行一系列操作,则会出现非常小的情况。在这种情况下,最终值必须返回给调用对象,不能返回语句。

答案 7 :(得分:0)

您的代码片段中的变量C始终在类中被访问,并将一直存在,直到该类的对象存在。因此,您可以在方法外打印变量C的值。

但是,如果您在方法add()中声明了局部变量,则print语句System.out.println("c: " + c);将打印变量c的默认值。在这种情况下,这是零。

答案 8 :(得分:0)

它完全取决于我们的要求是从我们的方法返回值还是更新实例变量。有时我们只想处理一个值并返回结果,结果将以不同的方式使用,在这种情况下,我们需要从方法返回值。

例如

  

java.lang.Math.sqrt(double a)方法返回一个值,我们根据需要或要求使用返回值。你能想到如果这个方法没有返回任何值,那么它应该更新的内容,我认为如果它没有返回任何值,这个方法就没用了。