【问题标题】:meaning of return value in java?java中返回值的含义?
【发布时间】:2012-07-26 19:23:33
【问题描述】:

我是一个初学者,我正在观看 youtube 上的教程,其中导师谈到了各种方法。他谈到了在 java 中返回值,但我对此一无所知。我将首先分享脚本,然后分享我的想法和疑问。

这是 class1 脚本:

import java.util.Scanner;
class class1{
public static void main(String args[]){
    System.out.println("This is class1.");
    Scanner x = new Scanner(System.in);
    System.out.print("Please enter the name of your first gf here:");
    String name = x.nextLine();

    class2 class2obj = new class2();
    class2obj.setname(name);
    class2obj.tellname();
}
}

正如你所看到的,它有 main 方法,它的作用是:它首先询问你第一个女朋友的名字,然后将它存储在变量 name 中。然后它链接我将在此之后共享的 class2 脚本并在 class2 中执行 setname 方法。

class2 脚本是:

class class2{
    private String girlname;
    public void setname(String name){
    girlname = name;
}
public String returnname(){
    return girlname;
}
public void tellname(){
    System.out.printf("your first girlfriend was %s",returnname());
}
}

class2 中,我可以看到setname 方法将name 的值设置为私有变量girlname,但我的问题是它返回了什么?为什么我们需要returnname 方法?对于方法间变量是否绝对必要?还有,为什么不能在setname方法中返回girlname呢?

我对退货一无所知,所以视频或文章会有很大帮助。另外,如果你觉得我上面说的很奇怪,这就是原因。

另外,请告诉我returnname 方法和tellname 方法在做什么。

另外,在class1 中我们执行了class2obj.tellname 为什么我们不执行class2obj.returnname

我现在真的很困惑,所以请不要介意我的行为很愚蠢。

【问题讨论】:

  • docs.oracle.com/javase/tutorial - 你需要阅读更多的教程和书籍。您似乎缺少很多基础知识,而且我不确定这个网站是否适合在一个问题中教您所有这些内容。

标签: java return return-value


【解决方案1】:

首先,如果您给出的代码确实是教程中使用的代码,那么请选择另一个教程。它甚至不尊重标准的 Java 命名约定。

然后,回答你的问题。对象是状态(字段)和行为(方法)的混合体。一些方法修改对象的状态。一些方法允许您访问对象的状态。有些方法允许两者都做。一些方法使用对象和其他对象的状态来做一些有用的事情。

void setName(String name) 方法不返回任何内容。如果它有一个 javadoc 注释,并且如果明智地选择了类和方法名,那么这个注释会说:

/**
 * Sets the name of this GirlFriend object. Replaces the previous name of
 * the girl friend with the new name given as argument
 */
public void setName(String newName) {
    this.name = newName;
}

这个方法修改了对象的状态,不需要返回任何东西。它的职责是更改名称,仅此而已。返回新名称没有任何用途,因为调用者已经知道它:它作为参数传递它。

以后,你可能有兴趣知道女朋友的名字:

/**
 * Returns the name of this GirlFriend object
 */
public String getName() {
    return this.name;
}

这个方法不需要任何参数:它允许向女朋友询问她的名字,并且该方法返回名字作为答案。

我会选择一本好书,或者通过official Java tutorial 了解更多信息。

【讨论】:

  • @user1512179:每个阅读您的代码的人都会关心。您需要学习的第一件事是让您的代码具有可读性非常非常重要。
  • @user1512179 你是对的,它不会影响代码运行的能力。但是,如果您需要与多人一起处理一个项目,那么遵循这些样式指南可以更容易地理解彼此的代码。
  • 即使您独自工作,不遵守良好的命名标准也会影响您。把你写的代码留一个星期,回来试着改进它,你会因为你选择的坏名字而受苦,因为它们与标准 API 的其余部分不一致。
【解决方案2】:

setname 的返回类型为void,这意味着它根本不返回任何内容。此函数的行为是存储名称以供以后检索。

returnname 的返回类型为 String,当您想要检索之前存储的内容时会调用它。

这里使用的模式是getter/setter,没有很好的举例说明。它们具有互补但非常不同(相反)的行为。

可以使用您的 setter setname 返回一个值 - 但这(无论如何对于初学者来说)是不必要的复杂性 - 我们还是不要去那里,好吗?让您的方法保持单一目的和重点。

tellname 是一个辅助函数,用于将与名称相关的输出打印到控制台。

关于:

另外,在 class1 中我们执行了 class2obj.tellname 为什么我们不执行 class2obj.returnname ?

您可以.. 就像 tellname() 称为 returnname()。您在 class1 中的代码可能会替换

class2obj.tellname();

System.out.printf("你的第一个女朋友是%s", class2obj.returnname());

最后,像其他人建议的那样重复/强调 - 去寻找一个新的教程。

【讨论】:

    【解决方案3】:
    1. setName 不返回任何内容。 老实说,它不是什么都不是,它是一种特殊的 void 类型,没有任何意义。
    2. 可以从java语法点返回girlname,但在大多数情况下没有意义,因为我们需要单独的getter。阅读有关java beansgetter/setter 的更多信息。此外,此方法将有两个不好的职责(更改值,返回结果)。
    3. 正如您已经了解的returnname 是getter 方法,用于获取私有变量的值。阅读有关java access modifiers 的更多信息。 tellname 只是打印机方法并显示到标准输出的女朋友姓名。
    4. 因为returnname 返回字符串对象,所以该变量保存在内存中,您可以使用System.out.println(class2Obj.returnname()) 将其打印出来。但是您有打印它的方法,为什么需要这样做?只需致电class2Obj.tellname()(不过,这是一种不好的方法)

    PS。不要调用部分java代码脚本:)

    【讨论】:

      【解决方案4】:

      首先阅读 OOP 概念和 Java 基础知识以了解这一点。我将在这里简要解释一下。

      girlname 被声明为私有变量,这意味着它不能从class2 外部直接访问。因此,设置和返回 girlname 变量的 2 种方法被用于从类外部访问变量的值。

      您也可以使用 classobj2.returnname ,它将返回类 2 中的 girlname 变量的值并显示它。此处使用classobj2.tellname,直接简单打印变量的值。

      【讨论】:

        【解决方案5】:

        returnname()setname() 是 getter 和 setter 方法的示例(分别)。这些也称为mutator methods

        存在这些类型的方法的主要原因是为了尊重封装。本教程显然是一个非常简单的示例,但没有必要这样做,但假设您正在构建一个系统,您希望在该系统中让用户在数据库中查找信息。如果您不使用 setter 方法,而是让用户直接访问成为数据库运行查询的一部分的变量,那么他们可以插入各种讨厌的代码并破解您的数据库(这将被称为 @987654322 @)。您可以通过向用户隐藏变量来防止这种情况发生(在您的示例中,变量是 private)并通过 setter 方法设置值。此方法可能比您的示例更复杂,并查看输入以删除任何不需要的输入。当然,既然变量被隐藏了,我们需要一种方法让其他对象访问该值,因此需要 getter 方法。

        总之,它带来了一个更安全的系统,并让开发人员可以控制如何访问变量以防止误用。尽管您正在处理一个非常简单的示例,但学习它是一个很好的实践,因为它对于以后构建安全系统很重要。

        【讨论】:

          【解决方案6】:

          Java 函数是您为执行某些操作而编写的代码的一部分。 有时在这个动作结束时你想要一个答案,有时你只需要完成一些事情。 当你想要一个答案时,你编写一个返回某个对象的函数,否则你 将该功能设置为无效。而且你什么都不退。

          当您调用 setName 时,您的操作是设置对象名称,因此您不需要返回任何内容。 当您调用 returnName 时,您确实想要一个答案 - 对象名称是什么,所以您可以使用 返回语句。

          【讨论】:

            【解决方案7】:

            因为girlnameprivate,它不能被任何其他对象访问,所以除非你提供一些读取值的方法,否则你永远无法取回值

            这是必要的吗?不,但这是一种很好的做法。这可以防止其他对象在您不知情的情况下更改girlname。这实际上是 OOP 中一个非常重要的概念。

            setname 方法返回girlname 是非常可行的,但重点是什么。您已经传入了值,这表明您已经可以访问该变量?

            tellName只不过是显示一些文本而已,实际上它使用了returnname方法。

            没有理由不能调用returnname,但除非你把它赋值给一个变量,否则没有多大意义

            您可能会阅读Learnng the Java Language

            【讨论】:

              【解决方案8】:

              首先,这些脚本是实际的类源,但这是可以理解的 - 初学者确实会经常弄错术语,不管是什么语言 :)

              这些来源显示的约定非常糟糕,很可能会导致您的困惑,但最重要的是所有变量都有一个范围。简而言之,范围意味着可以使用变量的位置,并且范围被视为在良好代码中需要注意的最重要的事情之一,以避免奇怪的副作用和难以修复或根本无法修复的错误。

              在上面的class2 中,您实际上是正确的,在tellname() 中实际上不需要方法调用returnname(),因为private String girlname 字段 类中私有范围;也就是说,类中的所有方法都可以直接看到该特定字段。

              你也问

              why isn't it posible to return the girlname in the setname method?
              

              这实际上是可能的,但正如我已经提到的,这里的代码与普通 Java 非常不同,这肯定会引起一些混乱; getX/setX 方法命名约定就是所谓的属性模式,它是一个约定,其中具有Foo 类型的私有字段 的类公开两个公共范围允许类的用户修改该字段的方法。这个约定是 JavaBeans 的一部分,这是一个相当大的话题,现在需要一步一步来,所以你可能想自己阅读一下。显示此内容的简单类如下所示:

              public class FooFieldBean {
                  private Foo field;
              
                  public Foo getFoo() {
                      return field;
                  }
              
                  public void setFoo() {
                      this.field = field;
                  }
              }
              

              作为一个小红利,这里清理了两个类源以匹配常见的 Java 约定。注意大小写、空格的使用和缩进。

              import java.util.Scanner;
              public class Class1 {
                  public static void main(String[] args) {
                      System.out.println("This is Class1.");
                      Scanner x = new Scanner(System.in);
                      System.out.print("Please enter the name of your first gf here:");
                      String name = x.nextLine();
              
                      Class2 class2obj = new Class2();
                      class2obj.setName(name);
                      class2obj.tellName();
                  }
              }
              
              
              public class Class2 {
                  private String girlName;
              
                  public void setName(String name) {
                      girlName = name;
                  }
              
                  public String getName() {  
                      return girlName;
                  }
              
                  public void tellName() {
                      System.out.printf("your first girlfriend was %s",getName());
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 2010-09-11
                • 1970-01-01
                • 1970-01-01
                • 2015-06-20
                • 1970-01-01
                • 1970-01-01
                • 2012-12-22
                • 2016-11-27
                • 2012-01-10
                相关资源
                最近更新 更多