Вот как это работает.Всякий раз, когда JVM пытается загрузить какой-либо класс, он проверяет следующие условия.
Если класс загружается из Bootstrap ClassPath ie;jdk \ jre \ lib \ rt.jar, BootStrap ClassLoader будет вызываться.
Если класс загружается из Extension Classpath т.е.jdk \ jre \ lib \ ext * .jar, будет вызвано расширение ClassLoader.
Если класс загружен из Application ClassPath т.е.как указано в переменной среды, вызывается Application ClassLoader.
Поскольку Bootstrap ClassLoader не реализован в java, он либо реализован в c или c ++, поэтому нет ссылки на него, поэтому он возвращает ноль.Но класс Loader для расширений и приложений написан на Java, поэтому вы получите ссылку как sun.misc.Launcher$ExtClassLoader@someHexValue и sun.misc.Launcher$AppClassLoader@someHexValue.
Итак, если вы сделаете что-то вродеэтот System.out.println (String.class.getClassLoader ()) вы получите нулевое значение, так как этот класс вызывается BootStrap ClassLoader. С другой стороны, если вы сделаете то же самое для класса в пути Ext или App Class, выполучить $ ExtClassLoader @ someHexValue и sun.misc.Launcher$AppClassLoader@someHexValue соответственно.