举例一:
我们自己定义一个java.lang包,在其下面定义一个String类,里面声明了静态代码块
package java.lang;
public class String {
static {
System.out.println("我是自定义的String类的静态代码块");
}
}
在一个测试类中加载String类,看看加载的String类是JDK自带的,还是我们自己编写的
public class StringTest {
public static void main(String[] args) {
String str = new java.lang.String();
System.out.println("你好,世界");
}
}
结果:程序并没有输出我们静态代码块中的内容,可见仍然加载的是 JDK 自带的 String 类
举例二:
在我们自己定义的 String 类中整个 main( ) 方法
public class String {
static {
System.out.println("我是自定义的String类的静态代码块");
}
//错误: 在类 java.lang.String 中找不到 main 方法
public static void main(String[] args) {
System.out.println("hello,String");
}
}
原因:由于双亲委派机制,我们的String类是由引导类加载器加载的,而引导类加载器并没有main方法,所以会报错
举例三:
package java.lang;
public class ShkStart {
public static void main(String[] args) {
System.out.println("hello!");
}
}
出于保护机制,java.lang 包下不允许我们自定义类。因为java.lang.*下的类由BootStrap ClassLoader加载,BootStrap ClassLoader发现核心Api包中没有自定义的类,则加载失败。