漫谈Java(2-3) - 创建对象

​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

打印信息分别代表了两个对象的唯一性标识,两个对象产生了不同的标识,代表二者是完全独立的两个对象。

 

更多技术交流文章,请关注微信公众号【时代码农】

时代码农

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值