【问题标题】:What does "void" mean as the return type of a method? [duplicate]“void”作为方法的返回类型是什么意思? [复制]
【发布时间】:2016-03-04 00:20:20
【问题描述】:

我对“无效”感到困惑, 因为它与方法有关。

我不知道两种方法之间的区别是当一个有“void”而另一个没有时。

例如,如果我这样做:

Public meth (int amount)
{

    amount = initial * interest;
    return amount;

}

( 不确定取名为“amount”并将其命名为与我的形式参数相同的名称是否正确,甚至有效,但这里有意义的是您正在执行计算并返回结果)

然后,如果我做了类似的事情:

Public void Testing (int array[])
{

    //code that would modify the internals of an array

}

第二个是否没有“返回”,因为它更像是一种通用方法,可以应用于任何整数数组,而第一个是关于对特定变量进行处理?

如果我会或不会使用“void”和“return”,我还希望再举一两个例子。

另一件让我感到困惑的事情是调用方法。

我知道有时我会做一些事情,例如,使用上面的测试方法,

Testing(ArrayName);

其他时候,会是这样的:

NameOfWhateverImApplyingMethodTo.MethodName();

然后有时事情会通过以下方式正确完成:

Thing1.MethodName(Thing2);

在什么情况下我会切换这样的方法调用的语法?

【问题讨论】:

  • 如果你有两个问题,你应该问两个问题。关于“无效”的问题足以解决一个问题。您应该将“调用方法”部分作为一个单独的问题。

标签: java


【解决方案1】:
  1. Java区分大小写,所以修饰符Public无效,使用public
  2. 您不能将方法定义为 public methodName(int a),只有构造函数具有此签名,对于不返回任何内容的方法,方法必须是 public void methodName(<signature>),对于返回任何内容的方法,方法必须是 public <return type> methodName(<signature>)

【讨论】:

    【解决方案2】:

    Void 基本上意味着该方法不会返回任何东西。

    如果你这样做了

    String name= "tim";
    public void getName(){
     return name;
    }
    

    这会导致错误,因为 getName 方法返回一个名为 name 的字符串对象,但方法声明说我什么都不返回 - 因为它是 void。

    方法应该是:

    String name = "tim";
    public String getName(){
    return name;
    }
    

    现在当方法 getName() 被调用时,它将返回一个字符串对象“name”,其中包含“tim”:)

    您可能对 set 方法有 void。比如

    String name = "tim";
    public void setName(String newName){
    this.name = newName;
    }
    

    调用此方法时,您将使用setName("Andy"); 并将名称变量的值设置为“Andy”。这个方法什么都没有返回,因为它是在设置一些东西,但是没有必要返回任何东西,所以我们在方法声明上使用了void。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      void 作为返回类型的方法不返回任何内容。例如,您想在您的班级中设置一个字段firstName。您将编写一个设置方法,如

      public void setFirstName(String n) {
       this.firstName = n;
      }
      

      如您所见,您只是设置了一个类变量,不需要返回任何内容。

      如果你不使用 void 那么你必须为方法提供一个返回类型。就像你想为上面的变量写一个 getter 一样:

      public String getFirstName() {
       return this.firstName;
      }
      

      一旦您提供了返回类型,您就必须返回该类型的值,否则您的代码将无法编译。

      可以根据您从哪里调用它以及使用什么修饰符来调用方法:

      • 如果你从同一个类调用方法,那么你可以简单地写firstName = getFirstName()
      • 如果您从另一个类调用方法,则需要方法类的对象作为限定符,如personObject.getFirstName()
      • 如果您正在调用静态方法,则需要类名作为限定符,例如 Person.getFirstName();

      【讨论】:

        【解决方案4】:

        返回类型是您从中得到的。当你调用它时,你希望得到什么?例如,如果该方法获取两个数字的平均值,那么您期望返回一个数字,因此返回类型将是一个数字类型,如“int”(整数)。 您可以使用该逻辑或通过查看方法中的单词 return 来查看它应该是什么 - return 之后的内容是返回的内容,并且它的类型应该在方法中声明(例如,如果它说“return 4;”它是返回一个 int,应该是例如 public int getFour()

        您还询问了例如测试()与测试(单词) 我记得有同样的困难。两者的区别还与方法声明行有关。我会举例说明。

            public String testing(){
                return "a word";
            }
        

        通过执行“System.out.println(testing());”调用此方法应该打印“一个词”。通过执行“System.out.println(testing("a word"));”调用此方法会给你一个问题 - 这是因为当你调用测试时,它会查看适当的方法:一个在正确的类中,具有正确的返回类型和正确的参数/参数。如果您正在调用 testing("a word"),这意味着您正在使用 String 作为参数(因为“a word”是一个字符串),因此它会尝试使用 testing(String aString) 方法 -不存在。 所以当方法没有输入时你使用空括号,当方法需要东西时你把东西放在括号里。这应该不像听起来那么令人困惑,因为它通常是合乎逻辑的——如果你想调用一个返回平均值的方法,你需要问自己“what 的平均值?”您可能需要为其提供您想要的平均值。

        继续:(a) testing() vs(b) AClass.testing() vs(c) aclass.testing() -

        在 (a) 中,没有指定类。因此,如果你从那个类中调用它,Java 可以猜出是哪个类:这个类,它会工作。在任何其他班级,它不会知道你在说什么,甚至可能会侮辱你。 在 (b) 中,您通常指定一个类 - 因此它会知道在哪个类中找到它 - 如果它是“静态方法”,它将起作用。 *[见底部] 在 (c) 中,您指定了要在 * 上运行“testing()”的 AClass instance

        例如,假设您创建了一个名为 Business 的类。您可以通过为每个业务对象指定名称、编号和地址来创建一百个业务对象。 例如

           Business b = new Business(name, number, address);
        

        然后在 Business 类中,您有一个方法“getName()”。这个方法没有参数——你可以看到括号是空的——所以如果你从另一个类调用“Business.getName()”,它怎么知道你想要哪个名字?你刚刚做了一百个生意! 它根本做不到。因此,对于这样的方法,您将调用“b.getName()”(b 是我们在上面创建的业务),它将获得业务的 this instance 的名称 - 即 b . 我很乐意提供帮助,所以如果您对我刚刚写的任何特定部分感到困惑,请告诉我,我会尽力详细说明!

        编辑:关于静态方法的一点: 静态方法不属于该类的实例。例如,getName() 将获取 this Business 的名称 - 即 Business 类的这个实例。但是假设在 Business 类中,您创建了一个方法,该方法将 String 中每个单词的首字母转换为大写 - 就像您想在打印出来时让公司名称看起来更专业一样。

        public static String stringToUpperCase(String aString){
            aString = aString.substring(0, 1).toUpperCase() + aString.substring(1);
            return aString;
        }
        

        要使用它,您可以从以下位置更改 getName() 方法:

        public String getName(){
            return name;
        }
        

        public String getName(){
            return stringToUpperCase(name);
        }
        

        这里使用新方法使名称的首字母大写——但这就是它与 Business 类的关系。您注意到它不会询问有关特定企业的名称、地址或号码的信息。它只需要你给它的一个字符串,对它做一些事情,然后把它还给它。无论您是没有企业还是有一百个企业都没有关系。 要调用此方法,您可以使用:

        System.out.println(Business.stringToUpperCase("hello"));
        

        这将打印 Hello。 如果它不是静态方法,则必须先创建一个新业务:

        Business b = new Business("aName", "aNumber", "anAddress"); 
        
        System.out.println(b.stringToUpperCase("hello"));
        

        如果方法确实需要访问更多业务实例信息(如业务的名称编号或地址),它就不能成为实例变量。

        【讨论】:

        • 感谢所有的回复,但这个真的是为我做的。
        • 听到这个感觉真好 :) 不久前我还在为这些东西苦苦挣扎,所以如果时间允许,我会尽量让你有空 - 你可以给我发问题StackOverflow 不接受,我会尽量回答他们
        • 请在答案旁边打勾
        • 我在思考我一直在练习的东西,这一切都说得通。方法需要一个类型,否则它将是一个构造函数,当我创建一个新对象(类实例)或在类文件中为它定义类和参数时调用它,对吗?如果您可以稍微解释一下您的意思,如果测试是静态方法,AClass.testing() 将起作用,这将是完美的!
        • 没错!并重新使用静态方法,请参阅我的答案-我对其进行了编辑
        【解决方案5】:

        第一个例子,一个完全没有返回类型的方法,是一个constructor;在使用new 创建实例时使用。但是,您不能从构造函数返回值。类似的,

        this.amount = initial * interest; // return amount;
        

        将字段amount 设置为initial * interest

        【讨论】:

          猜你喜欢
          • 2017-12-03
          • 2014-10-03
          • 1970-01-01
          • 1970-01-01
          • 2011-11-19
          • 2015-08-01
          • 1970-01-01
          • 2020-07-03
          • 1970-01-01
          相关资源
          最近更新 更多