Bootstrap

Java 对象和类

一、概念

Java作为一种面向对象语言。支持以下基本概念:

  • 多态
  • 继承
  • 封装
  • 抽象
  • 对象
  • 实例
  • 方法
  • 重载

本节我们重点研究对象和类的概念。

对象:对象是类的一个实例,有状态和行为。。

:类是一个模板,它描述一类对象的行为和状态。

类和对象之间的关系可以比喻为图纸和建筑的关系,类就像是建筑图纸,定义了建筑的结构和外观,而对象则是根据图纸实际建造出来的建筑物,每一栋都是基于同一图纸但可能有不同的颜色、位置或其他细节上的差异。


二、对象

现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。

拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。

对比现实对象和软件对象,它们之间十分相似。

软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。

在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。


三、类

创建一个简单的类来理解下 Java 中类的定义:

// 学生类
public class Student {
    // 姓名
    private String name;
    // 年龄
    private int age;

    // 学习方法
    public void study() {
    }

    // 睡觉方法
    void sleep() {
    }

}

一个类可以包含以下类型变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 静态变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

一个类可以拥有多个方法,在上面的例子中:study() 和 sleep() 都是 Student 类的方法。


四、构造方法

每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认的无参构造方法。

在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。

下面是一个构造方法示例:

public class Student {
    
    // 无参构造
    public Student() {}

    // 有参构造
    public Student(String name) {}
}

五、创建对象

对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:

  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字 new 来创建一个对象。
  • 初始化:使用 new 创建对象时,会调用构造方法初始化对象。

下面是一个创建对象的例子:

public class Student {
    // 无参构造
    public Student() {}

    // 有参构造
    public Student(String name) {
        System.out.println("学生的姓名:" + name);
    }

    public static void main(String[] args) {
        // 创建 Student 对象,会调用有参构造方法
        Student stu = new Student("张三");
    }
}

编译并运行上面的程序,会打印出下面的结果:

学生的姓名:张三

六、访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,如下所示:

public class Student {
    private final String name = "张三";

    // 无参构造
    public Student() {}

    void Study() {
        System.out.println("学生正在学习。。。");
    }

    public static void main(String[] args) {
        // 实例化对象
        Student stu = new Student();
        // 调用成员变量
        System.out.println("学生的姓名:" + stu.name);
        // 调用成员方法
        stu.Study();
    }
}

运行结果:

学生的姓名:张三
学生正在学习。。。

使用 Student 类型声明的对象只能在编译时访问 Student 类中的方法和属性,但在运行时,你可以通过强制类型转换将其转换为特定类型,以便访问特定类型的方法和属性。


七、源文件声明规则

在本节的最后部分,我们将学习源文件的声明规则。Java的源文件指的是以 .java 为扩展名的文件,保存着你编写的java程序代码。

当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

文件名和公共类名匹配:

  • 如果源文件包含一个公共类(public class),那么源文件的名称必须与该公共类的名称完全相同,并且扩展名为.java。例如,如果公共类名为Student,则源文件必须命名为Student.java。

一个公共类

  • 每个源文件只能包含一个公共类,但是可以包含多个非公共类(即私有、默认访问权限或受保护的类)。

包(Package):

  • 如果类属于某个包,那么源文件的第一行必须是package语句,指定该类所在的包名。
    包名通常遵循反向域名层次结构,如com.hui.utils。

导入(Import):
import语句用于引入其他包中的类或接口。

  • 如果存在package语句,import语句必须紧随其后,位于所有类定义之前。
  • 如果没有package语句,import语句应该出现在源文件的开始,位于类定义之前。

八、包

包主要用来对类和接口进行分类。当开发 Java 程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。


九、import 语句

在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类,并使用其属性和方法。

例如,下述就是将 Scanner 类导入进来:

import java.util.Scanner;

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;