Java类的定义和使用(图文并茂,非常详细)
类和对象是面向对象编程中最核心、最重要的概念,也是面向对象编程的基础。接下来我们将介绍 Java 语言中“类”和“对象”的相关知识。
Java 的类是所有 Java 同类对象的集合,它就像是一个模板,通过该模板可以创建出具有该类所定义的属性和方法的 Java 对象(实例)。比如我们有“xx 类”这个模板,那么可以创建出具有与该模板相同属性和方法的对象,如下图所示。也就是说,类所描述的是所有对象的共性特征,类是一个共性的概念。

图 1 类与对象
下面举几个类与对象的具体例子,如下表所示:
其中,“人”类的对象可以是小明、小红和小东;“手机”类的对象可以是小明的手机、小红的手机和小东的手机;“电脑”类的对象可以是小明的电脑、小红的电脑和小东的电脑。
定义一个类的语法如下所示:
看一个示例:
当然,我们还可以在 class 前面添加不同的修饰符以声明该类所具有的特性,比如可以添加 public 来表示该类具有“公有”特性,可以在其他类中对其进行访问,如下面的代码所示:
Java 语言规定将类的源代码保存到 .java 文件中,文件名必须与公有类保持一致,比如我们定义了一个 Person 类并声明为 public,那么对应源代码的文件名为 Person.java。多数情况下我们都会按照一个 Java 类对应一个 .java 文件的方式进行组织,不过 Java 也允许在一个 .java 文件里定义多个Java类,并且按照规定有且仅有一个类能被声明为 public,且被声明为 public 的类名必须与文件名相同。
下面示例的三个类都在 MulticlassTest.java 文件中,包含 MulticlassTest、Student 和 Worker 三个类,它们都能被编译器正确编译。需要注意的是,只有 MulticlassTest 类被声明为 public,不能同时声明两个类为 public。
比如可以用下面代码的两种方式创建 Person 对象:
创建对象后我们就会想要访问它的属性或者调用它的方法,这时可以用“.”符号来实现。比如:
构造方法方式最简单,只需要我们自己定义好构造方法。将需要初始化的属性定义为构造方法的参数,当我们创建对象时可以直接将属性值传入。比如在:
属性赋值方式则是先创建一个具有默认值的对象,再逐一对其属性进行赋值。比如:
方法赋值方式与属性赋值方式的本质是一样的,区别是方法赋值不直接访问属性,而是通过调用方法来访问属性。比如:
主方法的格式必须为:
当我们在某个类中定义了主方法后就可以通过下面的命令来执行该 Java 类:
例如:
接着需要通过“javac Person.java”命令对 Person 类进行编译,编译后会在当前目录下生成一个“Person.class”文件,它里面就是 Java 字节码指令,Java 执行时的指令编码都在该文件中。最后我们就可以执行“java Person”命令了,它会调用 Person 类的主方法,从而执行该方法中的所有逻辑。最终输出如下:
Java 的类是所有 Java 同类对象的集合,它就像是一个模板,通过该模板可以创建出具有该类所定义的属性和方法的 Java 对象(实例)。比如我们有“xx 类”这个模板,那么可以创建出具有与该模板相同属性和方法的对象,如下图所示。也就是说,类所描述的是所有对象的共性特征,类是一个共性的概念。

图 1 类与对象
下面举几个类与对象的具体例子,如下表所示:
类(模板) | 对象(实例) |
---|---|
人 | 小明、小红、小东 |
手机 | 小明的手机、小红的手机、小东的手机 |
电脑 | 小明的电脑、小红的电脑、小东的电脑 |
其中,“人”类的对象可以是小明、小红和小东;“手机”类的对象可以是小明的手机、小红的手机和小东的手机;“电脑”类的对象可以是小明的电脑、小红的电脑和小东的电脑。
Java类的定义
一个 Java 类主要由属性(变量)、构造方法、成员方法以及主方法四要素组成:- 属性用于描述该类的共性特性,一个类可以有多个属性;
- 构造方法一般用于在创建对象时给对象的属性赋值,构造方法的名称和类名称必须相同;
- 成员方法用于描述该类所具有的行为,一个类可以有多个成员方法;
- 主方法是一个非常特殊的方法,它是 Java 程序的入口,当我们要运行某个类时就需要在该类中定义主方法,主方法对于类并非都是必要的。
定义一个类的语法如下所示:
访问修饰符 class 类名 { // 定义属性 属性1; 属性 属性3; // 定义方法 构造方法1; 构造方法2; 构造方法3; 成员方法1; 成员方法2; 成员方法3; 主方法; }在关键字 class 后面接上自定义的类名,然后在大括号内定义所有的属性和方法,其中方法包括构造方法、成员方法以及主方法。
看一个示例:
class Person { String name; int age; Person() { } Person(String name, int age) { this.name = name; this.age = age; } void eat() { System.out.println("吃东西"); } void sleep() { System.out.println("睡觉"); } void introduceMyself() { System.out.println("my name is " + name + ", " + age + " years old."); } }示例中首先定义了一个名为“人”的类,该类中包含了 name 和 age 两个属性,分别表示姓名和年龄;接着定义了两种构造方法;最后定义了三个成员方法,包括 eat()、sleep() 和 introduceMyself() 三个方法,分别表示吃东西、睡觉和自我介绍。
当然,我们还可以在 class 前面添加不同的修饰符以声明该类所具有的特性,比如可以添加 public 来表示该类具有“公有”特性,可以在其他类中对其进行访问,如下面的代码所示:
public class Person { ... }Java 中的主类一般都要用 public 进行修饰,这样其他类都能对其进行访问。除 public 外还有很多修饰符可以用来声明 class,我们会在后面对应的内容中进一步地介绍和讲解。
Java 语言规定将类的源代码保存到 .java 文件中,文件名必须与公有类保持一致,比如我们定义了一个 Person 类并声明为 public,那么对应源代码的文件名为 Person.java。多数情况下我们都会按照一个 Java 类对应一个 .java 文件的方式进行组织,不过 Java 也允许在一个 .java 文件里定义多个Java类,并且按照规定有且仅有一个类能被声明为 public,且被声明为 public 的类名必须与文件名相同。
下面示例的三个类都在 MulticlassTest.java 文件中,包含 MulticlassTest、Student 和 Worker 三个类,它们都能被编译器正确编译。需要注意的是,只有 MulticlassTest 类被声明为 public,不能同时声明两个类为 public。
public class MulticlassTest { public static void main(String[] args) { Student s = new Student(100,"小明"); Worker w = new Worker(40,"工人"); } } class Student { int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } class Worker { public int age; public String name; public Worker(int age, String name) { this.age = age; this.name = name; } }
创建Java对象
创建某个类的对象需要通过 new 关键字来实现,它的语法如下:类名 对象名 = new 类名(); 类名 对象名 = new 类名(参数1,参数2,...);类名后面的括号对应着类的构造方法,在构建对象时会根据参数的不同调用对应的构造方法来对对象进行初始化操作。
比如可以用下面代码的两种方式创建 Person 对象:
Person xiaoming = new Person(); Person xiaoming = new Person("小明", 6);第一种方式创建的“xiaoming”对象的属性 name 和 age 都为默认值,它们的值分别为 null 和 0。而第二种方式创建的“xiaoming”对象的属性 name 和 age 的值分别为“小明”和“6”。
创建对象后我们就会想要访问它的属性或者调用它的方法,这时可以用“.”符号来实现。比如:
xiaoming.name; xiaoming.introduceMyself();分别获取到了“xiaoming”的 name 属性值以及调用了“xiaoming”的 introduceMyself() 这个方法。
Java对象的初始化
如果创建对象时不对其属性进行赋值,则这些属性都为默认值,大多数情况下默认值并非是我们想要的,这时就会涉及初始化对象属性值的问题。总的来说有三种初始化方式,分别为构造方法方式、属性赋值方式以及方法赋值方式。构造方法方式最简单,只需要我们自己定义好构造方法。将需要初始化的属性定义为构造方法的参数,当我们创建对象时可以直接将属性值传入。比如在:
public class PersonInitForm1 { public static void main(String[] args) { Person person = new Person("小明", 6); person.introduceMyself(); } }“小明”和“6”作为属性值传入构造方法中,创建 person 对象时就会将属性值赋值给对应的属性。
属性赋值方式则是先创建一个具有默认值的对象,再逐一对其属性进行赋值。比如:
public class PersonInitForm2 { public static void main(String[] args) { Person person = new Person(); person.age = 20; person.name = "小明"; person.introduceMyself(); } }创建 person 对象后通过
person.age = 20
和 person.name = "小明"
两个赋值语句分别对该对象的属性 age 和 name 进行赋值。方法赋值方式与属性赋值方式的本质是一样的,区别是方法赋值不直接访问属性,而是通过调用方法来访问属性。比如:
class Person implements Serializable { ... public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } } public class PersonInitForm3 { public static void main(String[] args) { Person person = new Person(); person.setAge(10); person.setName("小明"); person.introduceMyself(); } }我们在 Person 类中添加 setAge() 和 setName() 两个方法,那么可以通过调用这两个方法来修改属性 age 和 name 的值。
Java类的主方法
每个类都可以定义一个特殊的方法——主方法(main()),有了这个方法就可以让 JVM 来执行这个类程序。主方法的格式必须为:
public static void main(String[] args)这是 Java 规范要求的。可以看到主方法必须是 public 且 static,而且返回值类型为 void,此外它还定义了参数数组,这些参数是 Java 执行时传入的。
当我们在某个类中定义了主方法后就可以通过下面的命令来执行该 Java 类:
java 类名 java 类名 参数1 参数2 参数3 ...可以使用不带参数的方式“java 类名”来执行这个类,也可以通过带参数的方式“java 类名 参数1 参数2 参数3 ...”将参数传入主方法中。
例如:
class Person { String name; int age; Person() { } Person(String name, int age) { this.name = name; this.age = age; } void eat() { System.out.println("吃东西"); } void sleep() { System.out.println("睡觉"); } void introduceMyself() { System.out.println("my name is " + name + ", " + age + " years old."); } public static void main(String[] args) { Person xiaoming = new Person("小明", 6); System.out.println(xiaoming.name); xiaoming.introduceMyself(); } }我们以 Person 类为例,看看如何定义主方法并执行它。其实很简单,只需要在 Person 类中添加一个
public static void main(String[] args)
方法,然后在其中添加程序逻辑,这样便完成了主方法的定义。在该主方法中我们创建了一个“xiaoming”对象,然后输出“xiaoming”对象的 name 属性值,以及调用“xiaoming”对象的 introduceMyself() 方法。接着需要通过“javac Person.java”命令对 Person 类进行编译,编译后会在当前目录下生成一个“Person.class”文件,它里面就是 Java 字节码指令,Java 执行时的指令编码都在该文件中。最后我们就可以执行“java Person”命令了,它会调用 Person 类的主方法,从而执行该方法中的所有逻辑。最终输出如下:
小明 my name is 小明, 6 years old.