Real 焜

Stay Simple. Stay NexT.

Java中的接口

在软件工程中,存在许多场景需要不同团队的程序员达成一份明确软件交互方式的”契约”。每个团队都应能在完全不知晓其他团队代码实现细节的情况下编写自己的代码。通常而言,Interface 正是这样的契约。

例如,设想一个未来社会:计算机控制的无人驾驶汽车在城市街道上载客行驶,无需人类操作员。汽车制造商编写软件(当然是用Java语言)来操控车辆——停车、启动、加速、左转等等。另一类工业群体——电子导航仪器制造商——则生产计算机系统,这些系统接收全球定位系统(GPS)的位置数据以及无线传输的交通状况信息,并利用这些信息来驾驶汽车。

阅读全文 »

抽象方法和类

抽象类是一种声明为抽象的类——它可能包含抽象方法,也可能不包含。抽象类不能被实例化,但可以被继承。
抽象方法是指声明时未提供实现(不带大括号且后跟分号)的方法,例如:

abstract void moveTo(double deltaX, double deltaY);
阅读全文 »

Object类的方法

位于java.lang包中的Object类位于类层次结构树的顶端。所有类都是Object类的直接或间接子类。您使用或编写的每个类都继承了Object的实例方法。您无需使用这些方法,但若选择使用,则可能需要通过特定于您类的代码覆盖它们。本节讨论的从Object继承的方法包括:

  • protected Object clone() throws CloneNotSupportedException: 创建并返回此对象的一个副本。
  • public boolean equals(Object obj): 指示某个对象是否与此对象“相等”。
  • protected void finalize() throws Throwable: 当垃圾回收器确定对象不再被引用时,由垃圾回收器调用该对象。从Java 18开始,该方法已被废弃并计划移除。
  • public Class<?> getClass(): 返回此对象的运行时类。
  • public int hashCode(): 返回该对象的哈希码值。
  • public String toString(): 返回该对象的字符串表示形式。

请注意,自 Java SE 9 起,finalize() 方法已被弃用,并计划在 Java SE 18 中移除。强烈建议不要重写此方法。该方法终将不再被调用。更多信息请参阅本页末尾部分。

阅读全文 »

多态

多态性的字典定义指生物学中的一种原理,即生物体或物种可呈现多种形态或发育阶段。该原理同样适用于面向对象编程及Java等语言。类的子类可定义自身独特的行为,同时共享父类的部分功能。
通过对 Bicycle 类进行微小修改即可演示多态性。例如,可以在该类中添加一个printDescription()方法,用于显示实例当前存储的所有数据。

public void printDescription(){
    IO.println("\nBike is " + "in gear " + this.gear
        + " with a cadence of " + this.cadence +
        " and travelling at a speed of " + this.speed + ". ");
}
阅读全文 »

实例方法

子类中具有与父类实例方法相同签名(名称、参数数量及类型)和返回类型的实例方法,将覆盖父类的方法。
子类能够覆写方法的能力,使得类能够从行为“足够接近”的父类继承,然后根据需要修改行为。覆写的方法与被覆写的方法具有相同的名称、参数数量和类型,以及返回类型。覆写的方法还可以返回被覆写的方法返回类型的子类型,这种子类型称为协变返回类型。
在覆写方法时,建议使用 @Override 注解告知编译器你打算覆写父类中的方法。若因某种原因编译器检测到该方法在父类中不存在,则会报错。有关 @Override 的更多信息,请参阅注解章节。

阅读全文 »

继承

在前面的章节中,你已经多次看到继承的提及。在Java语言中,类可以从其他类派生,从而继承这些类的字段和方法。

定义:从一个类派生出来的类称为子类(也称为派生类、扩展类或子类)。被子类所派生的类称为超类(也称为基类或父类)。除Object类外,每个类都拥有且仅拥有一个直接父类(单继承)。在没有其他显式父类的情况下,每个类都隐式地成为Object类(Object)的子类。类可以从派生自其他类的类派生,这些类又可从更上层的类派生,如此递进,最终可追溯至最顶层的类Object。这样的类被称为继承链中所有类(直至Object)的后代。

阅读全文 »

装箱(Boxing) 和 拆箱(Unboxing)

Autoboxing 是指Java编译器在基本类型与其对应的对象包装类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,等等。如果转换方向相反,则称为Unboxing

以下是最简单的自动装箱示例:

Character ch = 'a';

本节其余示例均使用泛型。若您尚未熟悉泛型的语法,请参阅泛型章节。

阅读全文 »

StringBuilder 类

字符串对象类似于StringBuilder对象,区别在于它们可以被修改。在内部,这些对象被视为包含字符序列的可变长度数组。在任何时候,都可以通过方法调用改变序列的长度和内容。
除非String Builder能带来更简洁的代码(参见本节末尾的示例程序)或更优的性能,否则应始终使用字符串。在Java SE 9之前,若需连接大量字符串,向StringBuilder对象追加内容可能更高效。Java SE 9中已优化字符串连接操作,使其效率超越StringBuilder的追加方式。

阅读全文 »

创建字符串

字符串在Java编程中广泛使用,它是一系列字符的序列。在Java编程语言中,字符串是对象。
Java平台提供了 String 类来创建和操作字符串。
创建字符串最直接的方式是这样:

String greeting = "Hello, World!";

在此情况下,“Hello world!”是一个字符串字面量——即代码中用双引号括起来的一系列字符。编译器在代码中遇到字符串字面量时,会创建一个与其值相同的String对象——本例中即为Hello world!
与其他对象一样,你可以使用 new 关键字和构造函数创建 String 对象。String 类提供了十三个构造函数,允许你通过不同来源(如字符数组)为字符串提供初始值:

char[] helloArray = { 'H', 'e', 'l', 'l', 'o', '.' };
String helloString = new String(helloArray);
IO.println(helloString);
阅读全文 »

字符

大多数情况下,若使用单字符值,则采用 char 类型。例如:

char ch = 'a';
// Unicode for uppercase Greek omega character
char uniChar = '\u03A9';
// an array of chars
char[] charAarray = {'a', 'b', 'c', 'd', 'e'};

然而,有时你需要将字符作为对象使用——例如作为方法参数时,该参数要求传入对象。Java编程语言为此提供了一个包装类,它将字符”包装”成Character对象。Character类型的对象包含一个字段,其类型为字符。该Character类还提供了一系列有用的类方法(即静态方法)来操作字符。

阅读全文 »