Java 类和对象

类是面向对象编程的基本单元,在本教程中,学习编写 Java 类以及如何用 Java 创建对象

类是面向对象编程的基本单元,在本教程中,学习编写 Java 类以及如何用 Java 创建对象。

1. 类与对象

在 Java 中,对象是具有状态和行为的容器,如数据结构。对象代表系统或应用程序中的参与者。例如,在 HR 应用程序中,参与者是雇员,经理,部门或报告。对象是类的实例。

类是描述对象的状态和行为的通用模板。

2. 如何声明一个类

在 Java 中声明类的一般语法为:

<<modifiers>> class <<class name>> {
 
    // 类的成员: 字段或者方法
}
  • 一个类声明可以有零个或多个修饰符。
  • 关键字 class 用于声明一个类。
  • «class name»是用户定义的类名称,应为有效的标识符。
  • 每个类都有一个主体,该主体在一对大括号({……})中指定。
  • 类的主体包含其不同的组件,例如字段,方法等。

例如,

public class Main 
{
    // 空类
}

2.1 类的类型

在 Java 中,可以有两种类型的类。

  1. 抽象类 - 这些类是抽象的、不完整的类。这意味着您无法创建此类的实例,只能扩展这些类以完成其规范。
  2. 非抽象类 – 这些类定义其完整状态和行为。他们是完整的类。您可以创建此类的对象。

3. Java 类的渐进性

在 Java 中,类是对象的模板。Java 中的类可能包含五个主要组件。即

  1. 字段/属性
  2. 方法
  3. 构造函数
  4. 静态初始化块
  5. 实例初始化块

字段和方法也称为类成员。构造函数和两个初始化函数在类初始化期间使用,即使用类模板创建对象。

构造函数用于创建类的对象。我们必须为一个类至少拥有一个构造函数(如果我们明确声明,那么 JVM 将为我们注入默认构造函数)。

初始化程序用于初始化类的字段。我们可以有零个或多个静态或实例类型的初始化器。

3.1 字段

类的字段表示该类对象的属性(也称为状态属性)。这些字段在类的主体内声明。

在类中声明字段的一般语法为:

public class Main 
 
    // 生命一个字段
    <<modifiers>> <<data type>> <<field name>> = <<initial value>>;
}

比如 “人”类 Human.java 的每个对象都有两个属性:名称和性别。人类类应该包括两个字段的声明:一个代表姓名,另一个代表性别。

Human.java

public class Human {
 
    String name;
    String gender;
}

Human 类在此处声明两个字段:名称和性别。这两个字段都是 String 类型。Human 类的每个实例(或对象)都将具有这两个字段的副本。

3.2 方法

Java 方法是语句的集合,这些语句被组合在一起以执行操作。方法通常用于修改类字段的状态。通过调用其他对象中的方法,方法也可以用于委派任务。

在 Java 中,方法可以

  • 接受零个或多个参数
  • 返回 void 或单个值
  • 重载 – 意味着我们可以定义多个具有相同名称但语法不同的方法
  • 被覆盖 – 意味着我们可以在父类和子类中定义具有相同语法的方法

Human.java

public class Human {
 
    String name;
    String gender;

    public void eat() {

        System.out.println("I am eating");
    }
}

3.3 构造函数

构造函数用于在创建对象后立即初始化该类的对象。构造函数声明的一般语法为:

<<Modifiers>> <<Constructor Name>>(<<parameters list>>) throws <<Exceptions list>> {
 
    // Body of constructor goes here
}
  • 构造函数的访问修饰符可以为 publicprivateprotected 或 无修饰符。
  • 构造函数名称与类的简单名称相同。
  • 构造函数名称后跟一对左括号和右括号,其中可能包含参数。
  • 可选地,在右括号后面可以加上关键字 throws,而关键字 throws 之后是逗号分隔的异常列表。
  • 与方法不同,构造函数没有返回类型。
  • 我们甚至不能将 void 指定为构造函数的返回类型。如果有任何返回类型,则是普通方法。
  • 请记住,如果构造的名称与类的简单名称相同,则它可以是方法或构造函数。如果指定返回类型,则为方法。如果未指定返回类型,则为构造函数。

3.4 实例初始化块

我们看到,构造函数用于初始化类的实例。实例初始化块也用于初始化类的对象。

实例初始化程序只是类体内的代码块,但不包括任何方法或构造函数。实例初始化器没有名称。它的代码只是放在开括号和闭括号内。

请注意,实例初始化器在实例上下文中执行,并且关键字 this 在实例初始化器内部可用。

public class Main 
{
    {
        // 示例初始化块
    }
}
  • 一个类可以有多个实例初始化器。
  • 对于我们创建的每个对象,所有初始化程序都将按文本顺序自动执行。
  • 所有实例初始化器的代码在任何构造函数之前执行。
  • 一个实例初始化不能有一个 return 语句。
  • 除非所有已声明的构造函数在其 throws 子句中列出那些已检查的异常,否则它不会抛出已检查的异常。
public class Main {
     
    // 示例初始化块
    {
        System.out.println("Inside instance initializer");
    }
     
    // 构造函数
    public Main()       
    {
        System.out.println("Inside constructor");
    }
     
    public static void main(String[] args) {
        new Main();
    }
}

输出 :

Inside instance initializer
Inside constructor

3.5 静态初始化块

  • 它类似于实例初始化块,但用于初始化类而不是对象。
  • 实例初始化程序对每个对象执行一次,而静态初始化程序仅在将类定义加载到 JVM 中时对一个类执行一次。
  • 为了区别于实例初始化程序,我们需要 static 在其声明的开头使用关键字。
  • 我们可以在一个类中有多个静态初始化器。
  • 所有静态初始值设定项均按其出现的文本顺序执行,并在任何实例初始值设定项之前执行。

静态初始值设定项无法引发检查的异常。它不能有 return 语句。

public class Main {
     
    // 静态初始化块
    static {
        System.out.println("Inside static initializer");
    }
     
    // 构造函数
    public Main()       
    {
        System.out.println("Inside constructor");
    }
     
    public static void main(String[] args) {
        new Main();
    }
}

输出:

Inside static initializer
Inside constructor

4. 如何创建对象

在 Java 中,要从类创建对象,请使用 new 关键字和构造函数。

<<Class>> <<variable>> = new <<Call to Class Constructor>>;
 
// 例如 
Human human = new Human();

请记住,当我们不向类添加构造函数时,Java 编译器会为我们添加一个构造函数。Java 编译器添加的构造函数称为默认构造函数。默认构造函数不接受任何参数。类的构造函数的名称与类的名称相同。

new 运算符通过在堆中分配内存来创建类的实例。

5. null 引用类型

Java 有一个特殊的引用类型,称为 null 。它没有名字。因此,我们不能定义空引用类型的变量。

空引用类型是与任何其他引用类型兼容的分配。也就是说,我们可以将空值分配给任何引用类型的变量。实际上,存储在引用类型变量中的空值意味着该引用变量没有引用任何对象。

// 赋值 john 为 null
 
Human john = null;      // john 没有只想任何对象引用
john = new Human();     // 现在 john 指向了一个新的对象

请注意,我们不能为原始类型变量分配 null ,这就是 Java 编译器不允许我们将原始值与 null 值进行比较的原因。