Java 是(有争议地)开源、跨平台编程中无可争议的重量级选手。 虽然有很多很棒的 跨平台 框架,但很少有像Java那样统一和直接的。
当然,Java 也是一种非常复杂的语言,具有其自身的微妙之处和约定。 关于 Java 最常见的问题之一与**构造函数**有关:它们是什么以及它们用于什么?
简而言之:构造函数是在 Java 中创建新**对象**时执行的操作。 当您的 Java 应用程序创建您编写的类的实例时,它会检查构造函数。 如果构造函数存在,Java 会在创建实例时运行构造函数中的代码。 这是一个挤在几句话中的大量技术术语,但当您看到它在行动时会变得更清楚,因此请确保您已安装了 Java 并准备好进行演示。
没有构造函数的生活
如果您正在编写 Java 代码,您已经在使用构造函数,即使您可能不知道。 Java 中的所有类都有一个构造函数,因为即使您没有创建它,Java 也会在编译代码时为您创建它。 但是,为了演示起见,请忽略 Java 提供的隐藏构造函数(因为默认构造函数不添加任何额外功能),并了解一下没有显式构造函数的生活。
假设您正在编写一个简单的 Java 掷骰子应用程序,因为您想为游戏生成一个伪随机数。
首先,您可以创建骰子类来表示物理骰子。 知道你经常玩龙与地下城,你决定创建一个 20 面的骰子。 在此示例代码中,变量 **dice** 是整数 20,表示最大可能的骰子点数(20 面的骰子不能掷出超过 20 的点数)。 变量 **roll** 是最终将成为随机数的占位符,而 **rand** 用作随机种子。
import java.util.Random;
public class DiceRoller {
private int dice = 20;
private int roll;
private Random rand = new Random();
接下来,在 **DiceRoller** 类中创建一个函数来执行计算机必须采取的步骤来模拟掷骰子:从 **rand** 中取一个整数并将其分配给 **roll** 变量,加 1 以考虑 Java 从 0 开始计数,但 20 面的骰子没有 0 值,然后打印结果。
public void Roller() {
roll = rand.nextInt(dice);
roll += 1;
System.out.println (roll);
}
最后,生成 **DiceRoller** 类的一个实例并调用其主要函数 **Roller**
// main loop
public static void main (String[] args) {
System.out.printf("You rolled a ");
DiceRoller App = new DiceRoller();
App.Roller();
}
}
只要您安装了 Java 开发环境(例如OpenJDK),您就可以从终端运行您的应用程序
$ java dice.java
You rolled a 12
在此示例中,没有显式构造函数。 这是一个完全有效且合法的 Java 应用程序,但它有点局限性。 例如,如果您将晚上的龙与地下城游戏放在一边来玩 Yahtzee,您将需要 6 面的骰子。 在这个简单的例子中,更改代码并不会带来太多麻烦,但在复杂的代码中,这不是一个现实的选择。 您可以使用构造函数来解决此问题。
构造函数在行动
此示例项目中的 **DiceRoller** 类表示一个虚拟的骰子工厂:调用它时,它会创建一个虚拟骰子,然后“滚动”该骰子。 但是,通过编写自定义构造函数,您可以让您的 Dice Roller 应用程序询问您想要模拟哪种骰子。
大部分代码是相同的,但接受一定数量面的构造函数除外。 这个数字尚不存在,但稍后会创建它。
import java.util.Random;
public class DiceRoller {
private int dice;
private int roll;
private Random rand = new Random();
// constructor
public DiceRoller(int sides) {
dice = sides;
}
模拟滚动的函数保持不变
public void Roller() {
roll = rand.nextInt(dice);
roll += 1;
System.out.println (roll);
}
主要代码块会馈送您在运行应用程序时提供的任何参数。 如果这是一个复杂的应用程序,您将仔细解析参数并检查意外结果,但对于此示例,采取的唯一预防措施是将参数字符串转换为整数类型
public static void main (String[] args) {
System.out.printf("You rolled a ");
DiceRoller App = new DiceRoller( Integer.parseInt(args[0]) );
App.Roller();
}
}
启动应用程序并提供您希望骰子拥有的面数
$ java dice.java 20
You rolled a 10
$ java dice.java 6
You rolled a 2
$ java dice.java 100
You rolled a 44
构造函数已接受您的输入,因此在创建类实例时,会创建 **sides** 变量,并将其设置为用户指定的任何数字。
构造函数是编程的强大组件。 练习使用它们来释放 Java 的全部潜力。
8 条评论