Java类对象的定义和使用(非常详细)
在 Java 程序中,类对象之间靠互相传递消息而相互作用,消息传递的结果是启动方法,完成一些行为或修改对象的属性。
创建对象之前,必须先声明对象,语法格式如下:
接下来,需要对该变量进行初始化,Java 使用 new 关键字来创建对象,也称实例化对象,其语法格式如下:
声明和实例化对象的过程可以简化,其语法格式如下:

图 1 对象 d 在内存中的示意图
Java 将内存分为栈和堆两种:
对象实例化后,就可以访问对象的成员变量和成员方法,其语法格式如下:
因为用 new 创建对象时,会为每个对象开辟独立的堆内存空间,用于保存对象成员变量的值。因此,对变量 d1 引用的对象属性赋值并不会影响变量 d2 引用对象属性的值,变量 d1、d2 引用对象的内存状态如图 2(a)和图 2(b)所示。

图 2 对象的内存关系及垃圾对象的产生
需要注意的是,一个对象能被多个变量所引用,当对象不被任何变量所引用时,该对象就会成为垃圾,不能再被使用。
接下来,通过案例演示内存垃圾对象是如何产生的。
创建对象之前,必须先声明对象,语法格式如下:
类名 对象名;该对象名是一个引用变量,默认值为 null,存放于栈内存中,表示不指向任何堆内存空间。
接下来,需要对该变量进行初始化,Java 使用 new 关键字来创建对象,也称实例化对象,其语法格式如下:
对象名 = new 类名();上述语法使用 new 关键字在堆内存中创建类的对象,对象名引用此对象。
声明和实例化对象的过程可以简化,其语法格式如下:
类名 对象名 = new 类名();接下来演示创建 Dog 类的实例对象,具体示例如下:
Dog d = new Dog();上述示例中,“Dog d”在栈内存中声明了一个 Dog 类型的引用变量,“new Dog()”为对象在堆中分配内存空间,最终返回对象的引用并赋值给变量 d,如下图所示。

图 1 对象 d 在内存中的示意图
Java 将内存分为栈和堆两种:
- 在方法中定义的基本类型的变量和对象的引用变量都是在方法的栈内存中分配。当在一段代码块中声明了一个变量时,Java 就会在栈内存中为这个变量分配内存空间,当超过变量的作用域之后,Java 也会自动释放为该变量分配的空间,这个回收的空间可以即刻用作他用。
- 堆内存用于存放由 new 创建的对象和数组。在堆内存中分配的内存空间,由 Java 虚拟机自动垃圾回收器来管理。
对象实例化后,就可以访问对象的成员变量和成员方法,其语法格式如下:
对象名.成员变量; 对象名.成员方法();接下来,通过案例演示如何访问对象的成员变量和调用对象的成员方法。
class Dog { // 声明名字属性 public String name; // 声明年龄属性 public int age; public void show() { // 定义显示信息的方法 System.out.println("名字是" + name + ",年龄:" + age); } } public class Demo { public static void main(String[] args) { Dog d1 = new Dog(); // 实例化第1个Dog对象 Dog d2 = new Dog(); // 实例化第2个Dog对象 d1.name = "旺财"; // 为name属性赋值 d1.age = 5; // 为age属性赋值 d1.show(); // 调用对象的方法 d2.show(); // 调用对象的方法 } }程序的运行结果如下:
名字是旺财,年龄:5
名字是null,年龄:0
因为用 new 创建对象时,会为每个对象开辟独立的堆内存空间,用于保存对象成员变量的值。因此,对变量 d1 引用的对象属性赋值并不会影响变量 d2 引用对象属性的值,变量 d1、d2 引用对象的内存状态如图 2(a)和图 2(b)所示。

图 2 对象的内存关系及垃圾对象的产生
需要注意的是,一个对象能被多个变量所引用,当对象不被任何变量所引用时,该对象就会成为垃圾,不能再被使用。
接下来,通过案例演示内存垃圾对象是如何产生的。
class Dog { public String name; // 声明名字属性 public int age; // 声明年龄属性 public void show() { // 定义显示信息的方法 System.out.println("名字是" + name + ", 年龄: " + age); } } public class Demo { public static void main(String[] args) { Dog d1 = new Dog(); // d1为第1个Dog对象 Dog d2 = new Dog(); // d2为第2个Dog对象 d1.name = "旺财"; // 为d1对象name属性赋值 d1.age = 5; // 为d1对象age属性赋值 d2.name = "花花"; // 为d2对象name属性赋值 d2.age = 6; // 为d2对象age属性赋值 d2 = d1; // 将d1对象传递给d2对象 d1.show(); // 调用对象的方法 d2.show(); // 调用对象的方法 } }程序的运行结果如下:
名字是旺财,年龄:5
名字是旺财,年龄:5