💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 2.5 方法、参数和返回值 迄今为止,我们一直用“函数”(Function)这个词指代一个已命名的子例程。但在Java里,更常用的一个词却是“方法”(Method),代表“完成某事的途径”。尽管它们表达的实际是同一个意思,但从现在开始,本书将一直使用“方法”,而不是“函数”。 Java的“方法”决定了一个对象能够接收的消息。通过本节的学习,大家会知道方法的定义有多么简单! 方法的基本组成部分包括名字、参数、返回类型以及主体。下面便是它最基本的形式: ``` 返回类型 方法名( /* 参数列表*/ ) {/* 方法主体 */} ``` 返回类型是指调用方法之后返回的数值类型。显然,方法名的作用是对具体的方法进行标识和引用。参数列表列出了想传递给方法的信息类型和名称。 Java的方法只能作为类的一部分创建。只能针对某个对象调用一个方法(注释③),而且那个对象必须能够执行那个方法调用。若试图为一个对象调用错误的方法,就会在编译期得到一条出错消息。为一个对象调用方法时,需要先列出对象的名字,在后面跟上一个句点,再跟上方法名以及它的参数列表。亦即`对象名.方法名(参数1,参数2,参数3...)`。举个例子来说,假设我们有一个方法名叫`f()`,它没有参数,返回的是类型为`int`的一个值。那么,假设有一个名为`a`的对象,可为其调用方法`f()`,则代码如下: ``` int x = a.f(); ``` 返回值的类型必须兼容x的类型。 象这样调用一个方法的行动通常叫作“向对象发送一条消息”。在上面的例子中,消息是`f()`,而对象是`a`。面向对象的程序设计通常简单地归纳为“向对象发送消息”。 ③:正如马上就要学到的那样,“静态”方法可针对类调用,毋需一个对象。 ## 2.5.1 参数列表 参数列表规定了我们传送给方法的是什么信息。正如大家或许已猜到的那样,这些信息——如同Java内其他任何东西——采用的都是对象的形式。因此,我们必须在参数列表里指定要传递的对象类型,以及每个对象的名字。正如在Java其他地方处理对象时一样,我们实际传递的是“引用”(注释④)。然而,引用的类型必须正确。倘若希望参数是一个“字符串”,那么传递的必须是一个字符串。 ④:对于前面提及的“特殊”数据类型`boolean`,`char`,`byte`,`short`,`int`,`long`,,`float`以及`double`来说是一个例外。但在传递对象时,通常都是指传递指向对象的引用。 下面让我们考虑将一个字符串作为参数使用的方法。下面列出的是定义代码,必须将它置于一个类定义里,否则无法编译: ``` int storage(String s) { return s.length() * 2; } ``` 这个方法告诉我们需要多少字节才能容纳一个特定字符串里的信息(字符串里的每个字符都是16位,或者说2个字节、长整数,以便提供对Unicode字符的支持)。参数的类型为`String`,而且叫作`s`。一旦将`s`传递给方法,就可将它当作其他对象一样处理(可向其发送消息)。在这里,我们调用的是`length()`方法,它是`String`的方法之一。该方法返回的是一个字符串里的字符数。 通过上面的例子,也可以了解`return`关键字的运用。它主要做两件事情。首先,它意味着“离开方法,我已完工了”。其次,假设方法生成了一个值,则那个值紧接在`return`语句的后面。在这种情况下,返回值是通过计算表达式`s.length()*2`而产生的。 可按自己的愿望返回任意类型,但倘若不想返回任何东西,就可指示方法返回`void`(空)。下面列出一些例子。 ``` boolean flag() { return true; } float naturalLogBase() { return 2.718; } void nothing() { return; } void nothing2() {} ``` 若返回类型为`void`,则`return`关键字唯一的作用就是退出方法。所以一旦抵达方法末尾,该关键字便不需要了。可在任何地方从一个方法返回。但假设已指定了一种非`void`的返回类型,那么无论从何地返回,编译器都会确保我们返回的是正确的类型。 到此为止,大家或许已得到了这样的一个印象:一个程序只是一系列对象的集合,它们的方法将其他对象作为自己的参数使用,而且将消息发给那些对象。这种说法大体正确,但通过以后的学习,大家还会知道如何在一个方法里作出决策,做一些更细致的基层工作。至于这一章,只需理解消息传送就足够了。