2.3.1 虚位以待——声明对象
让我们设想这样一种场景,咖啡馆需要招聘一名新员工。在经过了一系列的财务预算、确定新员工的职责等流程之后,我们发布虚位以待的信息——诚聘一名新员工。这样,其他人就知道咖啡店需要一名员工。在Java中,当我们需要由建好的类产生一个对象,就需要向系统声明一个对象,告知系统我们现在需要一个对象。声明对象的语法如下:
Employee employee;
声明一个对象应该包括对象类型和对象标识符。在上面的代码中,Employee为类名,表示对象的类型;employee为对象的标识符。在程序运行时,JVM会知道,此时需要一个employee对象,其类型是Employee。
2.3.2 员工入职——实例化对象
当招聘到合适的员工之后,咖啡屋就需要为新员工办理入职手续。所谓“一个萝卜一个坑”,此时需要办理手续,最重要的就是将新员工指派到预期的岗位。同样的,我们在声明一个对象之后,就可以利用类来创建实际的对象,并且将创建的对象与对象标识符关联起来。
employee = new Employee();
其中,new关键字用于新建对象;new Employee()是依据类Employee创建一个对象;而“=”则将标识符与对象关联起来。事实上,new Employee()会在内存中分配一定的空间来存储新建对象。而利用“=”将标识符与对象关联的过程,就是将标识符的引用指向新建对象的实际内存地址。那么,以后我们就可以利用该标识符引用该对象了。
在第一次将标识符与实际对象关联的过程,称为初始化。我们可以在声明对象的同时,创建对象,并进行初始化,例如,
Employee employee = new Employee();
这种情况下,相当于我们在确定招聘一名新员工的同时,新员工立即入职。在大多数面向对象的编程语言中,这是最常见的方式——声明和初始化同时进行。
当新员工入职之后,咖啡屋就可以安排该员工进行各种工作了。同样的,当我们在Java中实例化了一个对象之后,也就可以利用该对象进行各种操作了。
2.3.3 对象初始化和空对象
大多数情况下,咖啡屋发布了招聘信息,但是并不能马上招到新员工。其他同事也知道将有新员工加入,但是,咖啡屋本身还需要做出一些动作来为新员工的到来做些准备,例如,为新员工准备办公桌、办公位置。这样,即使新员工尚未到位,当需要该岗位的员工做某些事情时,其他人知道该如何去找到对应的人。当看到座位是空的(相当于没有指向任何内存地址),就能知道员工尚未到位,而不至于连去哪里找这个员工都不知道。
与之类似的是,在Java中,对象的初始化是必要的。单纯的对象声明只是一个标识符。编译器也不允许未经初始化的对象被引用,因为这样的对象没有任何实在的意义。如同连办公位置都没有的员工,其他人连怎么找到这名员工都不知道。因此,将这样没有任何意义的对象“扼杀在摇篮”中是必要的。此时该如何初始化该对象,以便编译器认为该对象已经初始化了呢?
如同咖啡屋为尚未到位的员工准备空的办公桌和位置一样,我们可以利用Java中的空对象——null来解决该问题。例如,将标识符employee初始化为null的代码如下所示。
Employee employee = null;
null根本不指向任何具体的对象,而只是Java中的一个特殊符号。我们需要注意空对象null的以下特点:
-
任何类(无论是用户自定义类,还是Java内置类)的对象实例,都可以指向null。
-
null和不经过任何初始化的区别在于,一旦使用了object = null,那么编译器就认为该对象已经经过了初始化。
-
null是合法的值,有时还是合理的值。例如,有时软件的使用者会尝试获取某些信息,而又不具备相应的权限,那么就可以利用null来代表。
-
初始化为null的对象和未经过初始化的对象声明不同,因为编译器至少认为该对象已经经过了程序员的认可,不排除程序员就是希望该对象为null的场景。
-
指向null的对象,不能进行任何由该对象发起的方法,例如
Employee employee = null;
employee.work()
此时的employee.work()将抛出NullPointerException,也就是空指针异常。因为员工尚未到位,却要求该员工工作,当然会抛出错误。
2.3.4 利用main方法进行测试
每个Java类中,可以定义一个main方法。main方法是一个比较特殊的方法,它可以看做Java类运行的入口。当我们利用java命令来运行Java类时,JVM会从类中获得main方法,并开始执行其中的代码。例如,我们可以在类的main方法中创建Employee类的两个实例,并打印这两个实例的信息。
class Test {
public static void main(String[] args) {
Employee employee1 = new Employee();
System.out.println(employee1);
Employee employee2 = new Employee();
System.out.println(employee2);
}
}
在以上代码中,利用new Employee()创建了两个对象employee1和employee2。然后,分别利用System.out.println()来打印两个对象。在Eclipse 中运行该代码,控制台上的输出结果如下所示:
Employee@de6ced
Employee@c17164
打印信息分别代表了两个对象的唯一性标识,两个对象产生了不同的标识,代表二者是完全独立的两个对象。
更多技术交流文章,请关注微信公众号【时代码农】