Java 构造器原理及用法解析

导读

构造器是编程的强大组件。使用它们来释放 Java 的全部潜力。

在开源、跨平台编程领域,Java 无疑(?)是无可争议的重量级语言。尽管有许多伟大的跨平台框架,但很少有像 Java 那样统一和直接的。

当然,Java 也是一种非常复杂的语言,具有自己的微妙之处和惯例。Java 中与构造器 constructor有关的最常见问题之一是:它们是什么,它们的作用是什么?

简而言之:构造器是在 Java 中创建新对象object时执行的操作。当 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变量,考虑到 Java 从 0 开始计数但 20 面的骰子没有 0 值的情况,roll 再加 1 ,然后打印结果。

import java.util.Random;
public class DiceRoller {
 private int dice = 20;
 private int roll;
 private Random rand = new Random();

最后,产生 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 应用程序,但是它有一点局限性。例如,如果你把游戏《龙与地下城》放在一边,晚上去玩一些《快艇骰子》,你将需要六面骰子。在这个简单的例子中,更改代码不会有太多的麻烦,但是在复杂的代码中这不是一个现实的选择。解决这个问题的一种方法是使用构造器。

构造函数的作用

这个示例项目中的 DiceRoller 类表示一个虚拟骰子工厂:当它被调用时,它创建一个虚拟骰子,然后进行“滚动”。然而,通过编写一个自定义构造器,你可以让掷骰子的应用程序询问你希望模拟哪种类型的骰子。

大部分代码都是一样的,除了构造器接受一个表示面数的数字参数。这个数字还不存在,但稍后将创建它。

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 的全部潜力。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java构造器使用方法及注意事项

    Java构造器使用方法及注意事项 超类的构造器在子类的构造器运行之前运行,也就是说,在创建对象时,先运行超类中的构造器,然后再运行子类中的构造器,此时,如果在执行超类构造器的时候,构造器执行了可覆盖的方法,那么就会去调用子类中的该方法,而此时子类还未被实例化,此时就有可能出问题. 以一个例子说明: public class Super { int age = 10; protected void say() { System.out.println("super"); } public

  • Java中构造器内部的多态方法的行为实例分析

    本文实例讲述了Java中构造器内部的多态方法的行为操作.分享给大家供大家参考,具体如下: 这篇文章主要讨论的是,若在一个构造器中调用正在构造的对象的某个动态绑定的方法时会出现的情况.在此之前,我们需要知道构造器是如何在复杂的层次结构中运作的,尽管构造方法并不具有多态性,因为它们实际上是static方法,只不过是隐式声明的static. 复杂层次结构中构造器的调用顺序 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用.这样做是因为,在Jav

  • Java私有构造器使用方法示例

    构造器作为Java类的一个特殊的成员同样可以设置关键字来控制其访问权限.在大多数情况下,我们一般把构造器设置为公有成员,即public的,在默认情况下,如果不写任何关键字,其访问权限也是public.这样,在我们新建一个类的对象的时候,构造器会创建对象后被自动调用,发生在其他类成员被设置为默认初始值之后,当然如果有字段初始器和初始化块的话,构造器的调用会发生在此之后.构造器的主要作用是在new将对象的引用返回之前初始化对象. 言归正传,什么叫私有构造器.所谓私有构造器,就是用private关键字

  • Java基础教程之构造器与方法重载

    在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员会根据其类型采用默认初始值. 显式初始化要求我们在写程序时就确定初始值,这有时很不方便.我们可以使用构造器(constructor)来初始化对象.构造器可以初始化数据成员,还可以规定特定的操作.这些操作会在创建对象时自动执行. 定义构造器 构造器是一个方法.像普通方法一样,我们在类中定义构造器.构造

  • 实例解析Java中的构造器初始化

    1.初始化顺序 当Java创建一个对象时,系统先为该对象的所有实例属性分配内存(前提是该类已经被加载过了),接着程序开始对这些实例属性执行初始化,其初始化顺序是:先执行初始化块或声明属性时制定的初始值,再执行构造器里制定的初始值. 在类的内部,变量定义的先后顺序决定了初始化的顺序,即时变量散布于方法定义之间,它们仍就会在任何方法(包括构造器)被调用之前得到初始化. class Window { Window(int maker) { System.out.println("Window(&quo

  • Java 7菱形语法与泛型构造器实例分析

    本文实例讲述了Java 7菱形语法与泛型构造器.分享给大家供大家参考,具体如下: 一 实战--泛型构造器 1 代码 class Foo { public <T> Foo(T t) { System.out.println(t); } } public class GenericConstructor { public static void main(String[] args) { // 泛型构造器中的T参数为String. new Foo("疯狂Java讲义"); //

  • Java Lambda表达式的方法引用和构造器引用实例分析

    本文实例讲述了Java Lambda表达式的方法引用和构造器引用.分享给大家供大家参考,具体如下: 一 点睛 如果Lambda表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用,以使得Lambda表达式更加简洁. 种类 示例 说明 对应的Lambda表达式 引用类方法 类名::类方法 函数式接口中被实现方法的全部参数传给该类方法作为参数. (a,b,...) -> 类名.类方法(a,b, ...) 引用特定对象的实例方法 特定对象::实例方法 函数式接口中被实现方法的全部参数传

  • Java 构造器原理及用法解析

    导读 构造器是编程的强大组件.使用它们来释放 Java 的全部潜力. 在开源.跨平台编程领域,Java 无疑(?)是无可争议的重量级语言.尽管有许多伟大的跨平台框架,但很少有像 Java 那样统一和直接的. 当然,Java 也是一种非常复杂的语言,具有自己的微妙之处和惯例.Java 中与构造器 constructor有关的最常见问题之一是:它们是什么,它们的作用是什么? 简而言之:构造器是在 Java 中创建新对象object时执行的操作.当 Java 应用程序创建一个你编写的类的实例时,它将检

  • Java图形界面Swing原理及用法解析

    这篇文章主要介绍了Java图形界面Swing原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JButton组件 布局管理器 FlowLayout 流式布局 BorderLayout 方位布局 GridLayout 表格布局 绝对布局 JLable 组件 文本框组件 JPanel轻量级容器 创建事件监听类 (更换监听类实现监听) 窗口监听适配器 都可使用匿名类实现监听 每个监听方法都可以返回一个Event对象来返回监听值 以上就是本

  • Java匿名内部类原理与用法详解

    本文实例讲述了Java匿名内部类原理与用法.分享给大家供大家参考,具体如下: 一 点睛 匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: new 父类构造器(实参列表) | 实现接口() { //匿名内部类的类体部分 } 从上面的定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口. 两条规则. 匿名内部类不能是抽象类. 匿名内部类不能定义构造器.由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以初始化块,可以通过初始

  • Java类加载器ClassLoader用法解析

    这篇文章主要介绍了Java类加载器ClassLoader用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 正文 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化. 一.类加载过程 1.加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说

  • SpringCloud断路器Hystrix原理及用法解析

    这篇文章主要介绍了SpringCloud断路器Hystrix原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在分布式环境中,许多服务依赖项中的一些必然会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互.Hystrix通过隔离服务之间的访问点.停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性 两个比较重要的类 HystrixCommand HystrixObserv

  • Java包装类原理与用法实例分析

    本文实例讲述了Java包装类原理与用法.分享给大家供大家参考,具体如下: 产生: 为了提高数据类型的的面向对象性,所以产生了包装类,包装类中有各种便利的方法 数据类型对应的包装类 使用: 包装类可以实现将基本类型转换成字符串(或者字符串转换成基本类型): 1.包装类中方法parseXXX 2.构造器 3.对于String,使用String中的valueof能将基本数据类型转换成字符串 包装类的实例可以与基本数据类型比较: 直接把实例中包装的数值拿出来比较 当如果是包装类实例的比较的话,比较的是所

  • Java内部类原理与用法实例总结

    本文实例讲述了Java内部类原理与用法.分享给大家供大家参考,具体如下: 一.非静态内部类 public class OutClass { private String name = "outclass"; public void show() { System.out.println(this.name); } public void innerShow() { InnerClass inner = new InnerClass(); inner.show(); inner.outS

  • java内部类原理与用法详解

    本文实例讲述了java内部类原理与用法.分享给大家供大家参考,具体如下: 概念 内部类:可以包含在另外一个类中的类 外部类:包含内部类的类 每个内部类都会被编译为一个独立的类,生成一个独立的字节码文件. 内部类可以方便地访问外部类的私有变量,内部类也可以声明为private从而实现对外完全隐藏. 分类 java中的四种内部类(根据定义的位置和方式划分) -静态内部类 -成员内部类 -方法内部类 -匿名内部类 分类介绍 -静态内部类 特征:在类的内部中存在另一个类,且该类被static修饰 使用范

  • Java 继承原理与用法实例分析

    本文实例讲述了Java 继承原理与用法.分享给大家供大家参考,具体如下: 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 类的继承格式 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下: class 父类 { } class 子类 extends 父类 { } 为什么需要继承 接下来

  • Java String的intern用法解析

    这篇文章主要介绍了Java String的intern用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java6中,intern方法返回的是对应字符串在永久态(方法区)中的地址:Java7以后,intern方法返回的是该字符串首次创建时候的堆内存的地址: 在java7中: package com.ecarx.daa.data.manager.utils; public class StringTest { public static

随机推荐