1

我是初学者,我在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方法?对于方法间变量是否绝对必要?另外,为什么不能girlnamesetname方法中返回?

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

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

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

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

4

8 回答 8

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

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

我会选择一本好书,或者阅读官方 Java 教程来了解更多信息。

于 2012-07-28T07:55:42.130 回答
1

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

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

此处使用的模式(示例很差)是 getter/setter。它们具有互补但非常不同(相反)的行为。

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

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

关于:

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

你可以..就像tellname()所谓的那样returnname()。您在 class1 中的代码可能会替换

class2obj.tellname();

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

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

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

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

于 2012-07-28T08:05:33.897 回答
0

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

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

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

于 2012-07-28T07:54:04.067 回答
0

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

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

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

于 2012-07-28T07:55:05.013 回答
0

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

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

于 2012-07-28T07:57:02.400 回答
0

因为girlnameis private,它不能被任何其他对象访问,所以除非你提供某种读取值的方法,否则你将永远无法取回该值

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

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

tellName无非就是显示一些文字,其实就是用的returnname方法。

没有理由不能调用returnname,但除非将其分配给变量,否则没有多大意义

你可能读过Learnng the Java Language

于 2012-07-28T08:00:07.697 回答
0

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

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

class2上面,您实际上是正确的,returnname()实际上不需要方法调用tellname(),因为该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());
    }
}
于 2012-07-28T08:01:54.153 回答