上 Java 语言的第一课,相信很多老师都会解释一句话就是 Java 是一个纯面向对象的语言。
然后再加上一堆 Java 的历史,再加上一个经典的动物的例子。
比如说,我们要描述动物,不同品种的狗的例子,我们在这个基础上抽象出来一个 Class,这个就是我们说的类了。
为什么叫 Class
这个很多人可能都没有想过吧,其实 Class 这个单词在英语里面有分类的意思。在英语世界里面,会用 Class 来表示很多东西。
比如说 Class A Felony,这个在英语法典里面就是表示的是刑事重罪的 A 分类。
在计算机语言中,我们就使用了 Class 来表示一个类了。
Class 和 Object
对象在我们定义 Class 后,我们就可以得到了。
还是用这个经典狗的例子,我们在定义了狗这一类动物后,我们需要将这个定义的动物映射到一条具体的狗上面。这条狗可能你的,也可能是隔壁老王的。
在现实中,肯定是不可能有 2 条一模一样重复的狗,但是在计算机数据上是可以存在的。
将类映射到具体的对象上的过程就是叫做实例化。这个应该比较好理解吧,因为 Class 是抽象,现在我们不讨论抽象的狗了,我们讨论隔壁老王家的狗。
如果把 Class 的狗直接拿过来用是肯定不行的,因为我们不知道我们现在要讨论的狗是谁的狗。
因此我们需要使用关键字 new 一下我们定义的 Class 的这个对象。然后我们就知道我们需要讨论隔壁老王家的狗了。
这个过程就叫做类的实例化。
因此,总结来说,对象就是实例化后的类。
创建对象
对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建一个对象需要以下三步:
- 声明:声明一个对象,包括有对象类型和对象的名称
- 实例化:使用关键字 new 来创建一个对象。
- 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
实际上我们可能并不是完全按照上面的 3 步来写代码。
实际上,你可以写出下面的代码是没有问题,也是可以编译通过的,你的 IDE 工具可能会提示你说下面的代码是重复的,你可以使用其他方法来避免重复。
String testStr = new String("COM.OSSEZ");
但是实际上,没有人这样写,绝大部分你看到的代码都是:
String testStr = "COM.OSSEZ";
这是因为 String 这个类在 JDK 中比较特殊,是字符串的对象,通常也是我们用得最多的有关的字符串的操作,因此 String 的对象是可以直接赋值的。
当你直接赋值后,其实 JDK 已经为你完成了上面的 3 步操作了。
有时候,你在定义好对象后,可能还暂时不知道要干什么,你可能就非常粗暴的直接 = null 到给定的对象上面了。
或者就先定义好,在使用的时候再初始化。
例如,你可以使用下面的代码来定义一个对象,但是不对这个对象进行任何操作。但是,随后你就马上要对这个对象进行操作了。
通常你的 IDE 工具会在这里提示要求你初始化这个变量。
这个时候你可以直接 new 一个 String,在你 new 一个 String 的时候,Java 就已经帮你完成了上面说的实例化了。
String testStr; logger.debug("String Size - [{}]", ossezVariable.length());
上面的代码,在 IDE 中会提示错误的,在构建的时候也会提示定义的变量没有初始化错误。
当然,你也可以直接将 null 赋值给你的变量,这样的结果得到的就是空对象异常。
String testStr = null; logger.debug("String Size - [{}]", ossezVariable.length());
空对象
在 Java 中,我们可以先定义一个对象,然后将 null 赋值给定义的对象。
考察下面的代码:
String testStr = null; logger.debug("String Size - [{}]", testStr.length());
在上面的代码中,我们将 null 赋值给了一个字符串对象 testStr ,但是我们并没有对这个对象进行任何后续的赋值。
因此这个对象是 null 的,如果这个时候你有代码尝试获得字符串的长度,但是字符串为 null,第二条语句肯定会出现空对象异常。
这在 Java 中非常常见。