java中返回值的含义?

时间:2012-07-28 07:45:29

标签: java return return-value

我是一名初学者,我正在观看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();
}
}

正如您所看到的那样,主要方法及其作用是:它首先要求您的第一个女朋友的名字,然后将其存储在变量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方法?这对于方法间变量是绝对必要的吗?另外,为什么不能在girlname方法中返回setname

我不知道返回的事情,所以视频或文章会有很多帮助。另外,这就是你发现我上面说的奇怪的原因。

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

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

我现在真的很困惑所以请不要介意我是否表现得很傻。

8 个答案:

答案 0 :(得分:6)

首先,如果你给出的代码实际上是教程中使用的代码,那么选择另一个教程。它甚至不尊重标准的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来了解更多信息。

答案 1 :(得分:1)

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

returnname具有返回类型String,并且当您想要检索先前存储的内容时,将调用它。

这里使用的模式很少,是吸气剂/固定剂。他们有互补但非常不同(相反)的行为。

可以使用你的setter setname返回一个值 - 但这对于一个初学者来说是一个不必要的并发症 - 让我们不去那里,好吗?保持您的方法单一用途和专注。

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

关于:

  

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

你可以......就像tellname()调用returnname()一样。然后,您在class1中的代码可能会替换

  

class2obj.tellname();

  

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

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

答案 2 :(得分:1)

  1. setName什么都不返回。 说实话,这不是什么特别的类型 void ,这意味着什么。
  2. 可以从java语法的角度返回girlname,但在大多数情况下它没有任何意义,因为我们需要单独的getter。详细了解java beansgetter/setter。此方法也有两个责任(更改值,返回结果),这是不好的。
  3. 正如您已经了解的那样returnname是getter方法,并用于获取私有变量的值。详细了解java access modifierstellname只是打印机方法并显示标准输出女友名称。
  4. 因为returnname返回字符串对象,该变量在内存中保存,您可以使用System.out.println(class2Obj.returnname())将其打印出来。但你有打印它的方法,为什么你需要这样做?只需拨打class2Obj.tellname()(这是不好的方法)
  5. PS。不要调用java代码脚本的一部分:)

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

总之,它会带来更安全的系统,并允许开发人员控制如何访问变量以防止滥用。即使你正在研究一个非常简单的例子,但这是一个很好的实践,因为它在以后构建安全系统时非常重要。

答案 5 :(得分:0)

java函数是您编写的代码的一部分,用于执行某些操作。 有时在这个动作结束时你需要一个答案,有时你只需要完成一些事情。 当你想要一个答案时,你会编写一个函数来返回另一个明智的对象 将该函数设置为void。而且你不会退货。

当您调用setName时,您的操作是设置对象名称,因此您不需要任何回复。 当你调用returnName时,你确实需要一个答案 - 对象名称是什么,所以你可以使用 退货声明。

答案 6 :(得分:0)

因为girlnameprivate,所以任何其他对象都无法访问它,所以除非你提供一些方法来读取值,否则你永远无法获得值

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

girlname方法返回setname会很容易,但重点是什么。您已经传入了值,这表明您已经可以访问变量吗?

tellName只执行更多操作,然后显示一些文本,事实上,它使用returnname方法。

没有理由你不能打电话给returnname,但除非你把它分配给一个变量,否则没什么意义

您可能需要阅读Learnng the Java Language

答案 7 :(得分:0)

首先,这些脚本是实际的类源,但这是可以理解的 - 无论语言是什么,初学者都会错误地解释术语:)

这些来源显示的惯例非常糟糕,最有可能导致您的困惑,但最重要的是所有变量都有范围。简而言之,意味着可以使用变量,并且范围被视为在良好代码中处理的最重要的事情之一,以避免奇怪的副作用和难以修复的错误。

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

你也问

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());
    }
}