我是一名初学者,我正在观看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
?
我现在真的很困惑所以请不要介意我是否表现得很傻。
答案 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)
returnname
是getter方法,并用于获取私有变量的值。详细了解java access modifiers。 tellname
只是打印机方法并显示标准输出女友名称。returnname
返回字符串对象,该变量在内存中保存,您可以使用System.out.println(class2Obj.returnname())
将其打印出来。但你有打印它的方法,为什么你需要这样做?只需拨打class2Obj.tellname()
(这是不好的方法)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)
因为girlname
是private
,所以任何其他对象都无法访问它,所以除非你提供一些方法来读取值,否则你永远无法获得值
这是必要的吗?不,但这是一种很好的做法。这可以防止其他对象在您不知情的情况下更改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());
}
}