Java 中的方法(在许多其他编程语言中称为“函数”)是一段代码,它被组合在一起并标记为可重用。方法很有用,因为它们允许您执行相同的操作或一系列操作,而无需重写相同的代码,这不仅意味着您可以减少工作量,还意味着在出现问题时需要维护和调试的代码更少。
方法存在于类中,因此标准的 Java 样板代码适用
package com.opensource.example;
public class Example {
// code here
}
在像这样的简单单文件应用程序中,包定义不是绝对必要的,但养成这种习惯是很好的,并且大多数 IDE 都会强制执行它。
默认情况下,Java 会在一个类中查找要运行的 main
方法。方法可以设置为 public 或 private,以及 static 或 non-static,但 main 方法必须是 public 和 static,Java 编译器才能识别和使用它。当方法是 public 时,它可以从类外部执行。要在程序启动时调用 Example
类,其 main
方法必须是可访问的,因此将其设置为 public
。
这是一个演示两个方法的简单示例:一个 main
方法,它在调用 Example
类时默认执行,另一个 report
方法,它接受来自 main
的输入并执行一个简单的操作。
为了模拟任意数据输入,我使用了一个 if-then 语句,该语句根据您启动应用程序的时间在两个字符串之间进行选择。换句话说,main
方法首先设置一些数据(在现实生活中,这些数据可能来自用户输入,或者来自应用程序中其他地方的某些其他方法),然后“调用”report
方法,提供处理后的数据作为输入
package com.opensource.example;
public class Example {
public static void main(String[] args) {
// generate some data
long myTime = System.currentTimeMillis();
String weather;
if ( myTime%2 == 0 ) {
weather = "party";
} else {
weather = "apocalypse";
}
// call the other method
report(weather);
}
private static void report(String day) {
System.out.printf("Welcome to the zombie %s\n", day);
}
}
运行代码
$ java ./Example.java
Welcome to the zombie apocalypse
$ java ./Example.java
Welcome to the zombie party
请注意,同一个 report
方法产生了两个不同的结果。当然,在这个简单的演示中,不需要第二个方法。同样的结果也可以从模拟数据生成的 if-then 语句中生成。但是,当一个方法执行复杂的任务时,例如将图像调整大小为缩略图,然后在屏幕上使用该调整大小后的图像生成小部件,那么额外组件的“成本”就变得非常有意义。
何时使用 Java 方法
很难知道何时使用方法,以及何时只将数据发送到 Java Stream 或循环中。如果您面临这个决定,答案通常是使用方法。原因如下:
- 方法很廉价。它们不会给您的代码增加处理开销。
- 方法减少了代码的行数。
- 方法是具体的。通常更容易找到名为
resizeImage
的方法,而不是在从驱动器加载图像的函数中的某个循环中找到隐藏的代码。 - 方法是可重用的。当您第一次编写一个方法时,您可能认为它只对您的应用程序中的一项任务有用。但是,随着应用程序的增长,您可能会发现自己正在使用您认为“完成”的方法。
函数式与面向对象编程
函数式编程使用方法作为执行任务的主要构造。您创建一个方法,该方法接受一种数据、处理该数据并输出新数据。将许多方法串在一起,您就拥有了一个动态且功能强大的应用程序。像 C 和 Lua 这样的编程语言就是这种编码风格的示例。
另一种考虑使用代码完成任务的方法是面向对象模型,Java 使用的就是这种模型。在面向对象编程中,方法是模板的组成部分。您不是将数据从一个方法发送到另一个方法,而是创建对象,可以选择通过使用它们的方法来更改它们。
这是从面向对象的角度来看的同一个简单的僵尸末日演示程序。在函数式方法中,我使用一个方法来生成数据,另一个方法来使用该数据执行操作。面向对象的等效方法是拥有一个表示工作单元的类。这个示例应用程序向用户展示每日消息,宣布这一天是僵尸派对还是僵尸末日。编程一个“day”对象,然后查询该天以了解其特征是有意义的。作为演示面向对象构造的不同方面的借口,新的示例应用程序还将计算有多少僵尸参加了派对(或末日)。
Java 对每个类使用一个文件,因此要创建的第一个文件是 Day.java
,它充当 Day 对象
package com.opensource.example;
import java.util.Random;
// Class
public class Day {
public static String weather;
public int count;
// Constructor
public Day() {
long myTime = System.currentTimeMillis();
if ( myTime%2 == 0 ) {
weather = "paradise";
} else {
weather = "apocalypse";
}
}
// Methods
public String report() {
return weather;
}
public int counter() {
Random rand = new Random();
count = count + rand.nextInt(100);
return(count);
}
}
在 Class
部分,创建了两个字段:weather
和 count
。Weather 是静态的。在一天(在这个虚构的情况下)中,天气不会改变。要么是派对,要么是末日,而且持续一整天。然而,僵尸的数量在一整天中都在增加。
在 Constructor
部分,确定了当天的天气。它是作为 constructor 完成的,因为它意味着只发生一次,即在类最初被调用时。
在 Methods
部分,report
方法仅返回构造函数确定和设置的天气报告。然而,counter
方法生成一个随机数并将其添加到当前的僵尸计数中。
换句话说,这个类做了三件非常不同的事情:
- 表示应用程序定义的“天”。
- 为当天设置不变的天气报告。
- 为当天设置不断增加的僵尸计数。
为了使用所有这些,创建第二个文件
package com.opensource.example;
public class Example {
public static void main(String[] args) {
Day myDay = new Day();
String foo = myDay.report();
String bar = myDay.report();
System.out.printf("Welcome to a zombie %s\n", foo);
System.out.printf("Welcome to a zombie %s\n", bar);
System.out.printf("There are %d zombies out today.\n", myDay.counter());
System.out.printf("UPDATE: %d zombies. ", myDay.counter());
System.out.printf("UPDATE: %d zombies. ", myDay.counter());
}
}
因为现在有两个文件,所以最容易使用 Java IDE 运行代码,但如果您不想使用 IDE,您可以创建自己的 JAR 文件。运行代码以查看结果
Welcome to a zombie apocalypse
Welcome to a zombie apocalypse
There are 35 zombies out today.
UPDATE: 67 zombies. UPDATE: 149 zombies.
“天气”保持不变,无论 report
方法被调用多少次,但当您调用 counter
方法的次数越多,失控的僵尸数量就越多。
Java 方法
方法(或函数)是编程中重要的构造。在 Java 中,您可以将它们用作单个类的一部分进行函数式风格的编码,也可以跨类使用它们进行面向对象的代码。两种编码风格都是解决同一问题的不同视角,因此没有对错之分。通过反复试验,并在积累一些经验之后,您将了解哪种风格最适合特定问题。
评论已关闭。