JDK中所有类的基类–Object类

JDK中所有类的基类----java.lang.Object
Object类是Java中所有类的父类,所有类默认继承Object。所以Object类中的所有公有方法将被任何类所继承。(如果将整个Java体系看成一棵树,那么Object类就是整棵树的根)。
Object类属于java.lang包
此包下的所有类在使用时无须手动导入,系统在程序编译期间会自动导入。
因为Object类是所有类的基类,所以在没有直接继承某个类的情况时,会默认继承Object类,也就是说任何类都直接或者是间接继承了Object类。
Object类中能访问的方法在所有类中都可以调用

为什么java.lang包下的类不需要手动导入

答案是:使用java.lang包下的所有类,都不需要手动导入。
在使用比如Date类时,需要手动导入import java.util.Date,比如使用File类时,也需手动导入import java.util.File。但在使用Object类,String类和Integer类等时不需要手动导入,且能直接使用,这是为什么呢?
Java中有两种导包形式
(1)单类型导入(single-type-import),例如import java.util.Date。
(2)按需类型导入(type-import-on-demand),例如import java.util.*。
单类型导入:编辑使用各种工具默认都是按照单类型导入的,需要什么类就导入什么类,这种方法是导入指定的public类或者借口;
按需类型导入:比如import java.util. *,在看到后面的 *时,程序员会以为是导入java.util包下所有的类,其实不是这样的,Java会根据名字知道是按照需求导入,并不是导入整个包下的所有类。
Java编译器会从启动目录(bootstrap),扩展目录(extension)和用户类路径去定位需要导入的类,而这些目录仅给出了类的顶层目录,编译器的类文件定位方法大致可以理解为如下的公式:
顶层路径名\包名\文件名.class = 绝对路径
单类型导入可以导入包名和文件名,所以编译器可以一次性查找定位到所需的类文件。
按需类型导入则比较复杂,编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类文件查找定位。
例如:

package com;
import java.io.*;
import java.util.*;

如果文件中使用到了File类,那么编译器会根据如下几个步骤来查找File类:

File  //File类属于无名包,File类没有package语句,编译器会首先搜索无名包    1
com.File  //File类属于当前包,即当前编译类的包路径                       2
java.lang.File   //由于编译器会自动导入java.lang包,所以也会从该包中查找  3
java.io.Flie
java.util.File
......

需注意,编译器找到java.io.File类之后并不会停止下一步的寻找,而要把所有的可能性都查找完以确定是否有类导入冲突。假设此时的顶层路径有3个,那么编译器就会进行3*5=15次的查找。
*如果在查找完成后,编译器发现两个同名的类,那么就会报错。要先删除用户不用的那个类,然后再编译。
所以我们可以得出这样的结论:按需类型导入是绝对不会降低Java代码的执行效率的,但会影响到Java代码的编译速度。所以在编译时最好使用单类型导入,这样不仅能提高编译速度,也能避免命名冲突。
在了解了Java的两种导包类型后,再回到为什么可以直接使用Object类。上面代码中查找文件的第3步,编译器会自动导入java.lang包,那么就可以直接使用了。原因很简单,就是因为用得多,提前加载了该包文件,且节省了资源。

类构造器

类构造器是创建Java对象的途径之一,通过new关键字调用构造器不仅可以完成对象的实例化,还能通过构造器对对象进行相应的初始化。一个类必须要有一个构造器,但如果没有显示声明,那么系统会默认创造一个无参构造器,在JDK的Object类源码中,是看不到构造器的,系统会自动添加一个无参构造器。可以通过如下方法实现:

Object obj = new Object();//构造一个Object类的对象