【问题标题】:Java Void Methods ReturnJava 无效方法返回
【发布时间】:2015-11-14 15:05:31
【问题描述】:

Java: 如果它返回这个,为什么是一个名为void 的方法(即它不返回任何东西):

System.out.println("Something");

例如:

public static void sayHello() {
        System.out.println("Hello");
}

它确实返回了一些东西,这条消息!

【问题讨论】:

标签: java methods void


【解决方案1】:

sayHello() 没有返回语句;因此,它是一个void 方法。根据您的假设,唯一真正的 void 方法如下所示:public static void wowSuchVoid(){ }。有什么意义?

【讨论】:

    【解决方案2】:

    这很简单直接,因为你要求他执行一些东西而不是返回一些东西。您的方法返回一个 void,这意味着什么。作为一名 c 程序员,在 C 中,不返回任何内容的方法称为过程。更多结帐What is the difference between a "function" and a "procedure"?

    【讨论】:

      【解决方案3】:

      在这种情况下,“返回”意味着一个值通过堆栈传回,该堆栈可以分配给调用代码中的变量。在您的示例中并非如此。

      Object o = sayHello(); // WRONG - Compile error
      

      一个 void 方法可以做一些事情 - 在你的情况下打印到屏幕上。这不是这里描述的“回报”。

      由于问题在页面顶部显示为“Java Void Methods Return”,“Void”上带有大写“V”,因此除了关键字“空白。”声明为返回 Void 的方法确实会返回一些东西 - 但如果这是您的情况,您应该查看该类的文档,因为它是一种特殊情况。

      【讨论】:

        【解决方案4】:

        在编程语言历史上,Algol68 可能是所有程序语言中最好的。它是第一个完全定义的语言,所有的东西都是打字的。就是这么说和表达的语言。

        其中 VOID 是具有单值 SKIP 的类型。一个PROC() VOID,一个方法,可以被强制为VOID,做一个调用。

        【讨论】:

        • # 考虑以下 UNION 数组 - 元素是 EMPTY 或 INT... 或 "undefined" # []UNION(VOID,INT) eis = (EMPTY, 666, SKIP); FOR i TO UPB eis DO printf(($"eis["d"]="g"; "$,i, CASE eis[i] IN (VOID):"e", (INT):"i" OUT "~" ESAC )) OD # Output "was": eis[1]=e; eis[2]=i; eis[3]=i; #
        • @NevilleDNZ 嗅探,谢谢。对于其他人:Algol68 使用反向关键字作为结束标记:DO OD、IF FI、CASE ESAC,CASE i IN ... : ..., .... OUT ... ESAC 是 switch 语句。
        • Re: do ~ od and case ~ esac blocks .... 我怀疑是 Dijkstra 创造了术语和概念“受保护的命令”... Cf。 cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD418.html
        • EWD 的论文日期为 1974 年,因此可能晚于 Algol68 的使用。参看。 “Guarded commands. non-determinacy and a calculus for the derivation of programs”。由 Edsger W.Dijkstra 提供
        【解决方案5】:

        这个方法做了一些事情(打印“Hello”),但它没有返回任何东西。如果它返回一个值,你就可以这样做:

        aVariableToAssignReturnValue = sayHello(); //you can't do it!
        

        例如阅读this

        【讨论】:

          【解决方案6】:

          考虑这两个例程。

          public void sayHello() { System.out.println("Hello"); }
          
          public int giveANumber() { System.out.println("Hi"); return 42; }
          

          你会怎么称呼他们?

          sayHello();
          int i = giveANumber();
          

          由于 sayHello 是无效的,所以调用它时没有等号,左侧也没有任何内容。但是,由于 giveANumber 返回一个 int,您应该使用等号和一个整数调用它以接收左侧的值。

          【讨论】:

          • 这个答案是错误的和/或误导性的,它建议您“应该”调用一个方法,该方法返回一个带有等号的值和一个变量来接收左侧的值边。确实,在许多实际情况下,您会这样做,但不需要捕获返回值。 "sayHello" 不返回值,因此将其设置为赋值的右侧是错误的(编译器错误)。 "giveANumber" 返回一个值,如果它对您有用,您可以可选地分配它。这个问题还有其他几个更好的答案。
          • @Brick,答案既不错误也不误导。您在评论中说“可选”;我在回答中说“应该”。
          • 您的回答说差异与调用方法的方式有关,这是错误的。差异是方法声明本身所固有的。我认为对此问题感到困惑的读者可能会得出结论,例如,giveANumber() 是一个 void 方法,如果您调用它而不将返回值分配给变量。但这是错误的。 giveANumber 方法无论你怎么称呼它都不是一个 void 方法。在您的示例中,如果您只想打印“Hi”,那么在这种情况下您完全可以 not 捕获返回的 42。事实上,在这种情况下,您不应该分配它。
          【解决方案7】:

          它不返回任何可以存储在变量中的东西

          所以它根本不返回任何东西。

          但它可以执行诸如打印到控制台之类的操作。

          【讨论】:

            【解决方案8】:

            我会说它会向标准输出打印一条消息,但它不会向调用语句返回任何内容。

            【讨论】:

              猜你喜欢
              • 2020-10-26
              • 2016-08-09
              • 1970-01-01
              • 1970-01-01
              • 2019-09-10
              • 1970-01-01
              • 1970-01-01
              • 2018-05-30
              • 1970-01-01
              相关资源
              最近更新 更多