java基础入门-预定义类与自定义类

预定义类与自定义类

先上代码




输出结果:
false
true
从上面的输出结果可以看见,
1.自定义类Person实例化后,指向两个不同的对象,也可以说指向不同的内存块
2.预定义类Date实例化后,指向的是同一个对象,也就是说指向同一个内存块
为什么?
在这里我就需要说一下jvm的加载机制

启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib 下面的类库加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。可以通过System.out.println(System.getProperty("sun.boot.class.path"));得到启动类加载器可以加载的路径,一般将java class文件(不是jar包)放在<Java_Runtime_Home>/classes路径中将会被启动类加载器加载。
标准扩展(Extension)类加载器:扩展类加载器是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader) 实现的。它负责将 < Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。可以通过System.out.println(System.getProperty("java.ext.dirs"));得到扩展类加载器可以加载的路径,将jar文件放在这个路径中将会被扩展类加载器加载。
系统(System)类加载器:系统类加载器是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。由于ClassLoader.getSystemClassLoader()返回的是这个类加载器,因此得名系统类加载器。

在jvm启动的时候,其实有一部分预定义的类就加载到内存里面去,所以上面会得到不同的结果。

版权声明:本文为博主原创文章,未经博主允许不得转载。