我对" void"感到困惑, 因为它与方法有关。
我不知道两种方法之间的区别是什么?#34; void"而另一个没有。
例如,如果我这样做:
Public meth (int amount)
{
amount = initial * interest;
return amount;
}
(不确定是否正确,甚至有效,取名称"金额"并将其命名为与我的形式参数相同的东西,但这里有意义的是你是执行计算并返回结果)
然后,如果我做了类似的事情:
Public void Testing (int array[])
{
//code that would modify the internals of an array
}
第二个没有"返回"因为它更像是一种通用方法,可以应用于任何整数数组,而第一种方法是关于对特定变量的工作?
还会欣赏一两个我何时或不会使用的例子" void"和"返回"。
另一件让我感到困惑的事情是调用方法。
我知道有时我会做一些事情,例如,使用上面的测试方法,
Testing(ArrayName);
其他时候,它会像:
NameOfWhateverImApplyingMethodTo.MethodName();
然后有时候事情会通过以下方式妥善完成:
Thing1.MethodName(Thing2);
我会在哪种情况下切换方法调用的语法?
答案 0 :(得分:1)
Public
无效,请使用public
public methodName(int a)
,只有构造函数具有此签名,对于不返回任何内容的方法,方法必须为public void methodName(<signature>)
;对于方法,方法必须为public <return type> methodName(<signature>)
做。答案 1 :(得分:1)
将void
作为返回类型的方法不返回任何内容。例如,您想在班级中设置字段firstName
。您将编写类似
public void setFirstName(String n) {
this.firstName = n;
}
正如您所看到的,您只是设置一个类变量而不需要返回任何内容。
如果你不使用void,那么你必须为方法提供一个返回类型。就像你想为上面的变量写一个getter:
public String getFirstName() {
return this.firstName;
}
提供返回类型后,您必须返回该类型的值,否则您的代码将无法编译。
调用方法可以根据您调用它的位置以及使用的修饰符来完成:
firstName = getFirstName()
personObject.getFirstName()
Person.getFirstName();
答案 2 :(得分:0)
第一个例子,一个没有返回类型的方法,是constructor;在使用new
创建实例时使用。但是,您无法从构造函数返回值。像,
this.amount = initial * interest; // return amount;
将字段amount
设置为initial * interest
。
答案 3 :(得分:0)
Void基本上意味着该方法不会返回任何内容。
如果你做了
String name= "tim";
public void getName(){
return name;
}
这会导致错误,因为getName方法返回一个名为name的字符串对象,但方法声明是说我什么都没有返回 - 因为它是无效的。
相反,该方法应为:
String name = "tim";
public String getName(){
return name;
}
现在,当调用方法getName()时,它将返回一个字符串对象“name”,其中包含“tim”:)
您可能对set方法无效。例如,
String name = "tim";
public void setName(String newName){
this.name = newName;
}
调用此方法时,您将使用setName("Andy");
,并将name变量的值设置为“Andy”。此方法中没有返回任何内容,因为它正在设置某些内容,但不需要发回任何内容,因此我们在方法声明中使用void。
希望这有帮助。
答案 4 :(得分:0)
返回类型就是你得到的。当你打电话给它时,你还希望得到什么?例如,如果方法得到两个数的平均值,那么你期望一个数字返回,所以返回类型将是一个数字类型,如“int”(整数)。 您可以看到它应该使用该逻辑或查看单词return的方法 - 返回后返回的是返回的内容,其类型应该在方法中声明(例如,如果它表示“返回4;”它是返回一个int,应该是例如public int getFour()
您还询问了testing()vs testing(word) 我记得有同样的困难。两者之间的区别也与方法声明行有关。我会说明一下。
public String testing(){
return "a word";
}
通过执行“System.out.println(testing());”调用此方法应该打印“一个字”。通过执行“System.out.println(testing(”a word“))来调用此方法;”会给你一个问题 - 这是因为当你调用测试时,它会查看相应的方法:一个在正确的类中,具有正确的返回类型和正确的参数/参数。如果你正在调用测试(“一个单词”),这意味着你使用一个String作为参数(因为“一个单词”是一个字符串),所以它试图使用测试(String aString)方法 - 不存在。 所以当方法没有输入时你使用空括号,并且当方法需要东西时你把东西放在括号中。这应该比听起来更容易混淆,因为它通常是合乎逻辑的 - 如果你想调用一个返回平均值的方法,你需要问自己“ 的平均值?”您可能需要为其提供您想要的平均值。
接下来:(a)测试()与(b)AClass.testing()与(c)aclass.testing() -
在(a)中,没有指定类。因此,如果你从那个类中调用它,Java可以猜出哪个类:这个类,它会起作用。从任何其他课程,它不会知道你在说什么,甚至可能侮辱你。 在(b)中,您通常会指定一个类 - 因此它将知道要在哪个类中找到它 - 如果它是“静态方法”,它将起作用。 * [见底部] 在(c)中,您要指定要在*上运行“testing()”的AClass的实例。
例如,假设您创建了一个名为Business的类。通过为每个名称,编号,地址指定,可以创建一百个Business对象。 例如
Business b = new Business(name, number, address);
然后在Business类中,您有一个方法“getName()”。这个方法没有参数 - 你可以看到括号是空的 - 所以,如果从另一个类调用“Business.getName()”,它怎么知道你想要哪个名字?你刚刚做了一百家企业! 它根本不可能。因此,对于这样的方法,您将调用“b.getName()”(b是我们上面创建的业务),它将获得业务的此实例的名称 - 即b 。 我很乐意提供帮助,所以如果你对我刚写的任何特定部分感到困惑,请告诉我,我会尽力详细说明!
编辑:有点静态方法: 静态方法不属于该类的实例。例如,getName()将获得 this Business的名称 - 即Business类的这个实例。但是,让我们说在Business类中,你创建了一个方法,它将字符串中每个单词的第一个字母转换为大写字母 - 就像你想要在打印它们时使商业名称看起来更专业一样。
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"));
如果方法 需要访问更多业务实例信息(如业务的名称编号或地址),则无法成为实例变量。