上图可见,static修饰的内部类,方法,代码块以及变量是跟随着类的加载而加载,这也是为何能够直接用类名.调用的原因。也就解释了为何static方法中不可调用非static变量和方法,因为static方法加载时,其他一切都还没有加载,从何调用?
package exercise;
public class Main_exer {
void myMethod(Object o){
System.out.println("object");
}
void myMethod(String s){
System.out.println("string");
}
public static void main(String[] args) {
Main_exer ma = new Main_exer();
ma.myMethod(null);
}
}
public class Parent
{
//静态成员变量
public static int t = parentStaticMethod2();
//代码块
{
System.out.println("父类非静态初始化块");
}
static
{
System.out.println("父类静态初始化块");
}
//构造方法
public Parent()
{
System.out.println("父类的构造方法");
}
//父类静态方法
public static int parentStaticMethod()
{
System.out.println("父类的静态方法");
return 10;
}
public static int parentStaticMethod2()
{
System.out.println("父类的静态方法2");
return 9;
}
@Override
protected void finalize() throws Throwable
{
// TODO Auto-generated method stub
super.finalize();
System.out.println("销毁父类");
}
}
package classLoader_demo;
public class Child extends Parent
{
//代码块
{
System.out.println("子类非静态初始化块");
}
static
{
System.out.println("子类静态初始化块");
}
//构造方法
public Child()
{
System.out.println("子类的构造方法");
}
//静态方法
public static int childStaticMethod()
{
System.out.println("子类的静态方法");
return 1000;
}
@Override
protected void finalize() throws Throwable
{
// TODO Auto-generated method stub
super.finalize();
System.out.println("销毁子类");
}
---------------------
以上两段代码均转为转载
原文作者:hellorichen
原文地址:https://blog.csdn.net/hellorichen/article/details/53007716
执行结果:
父类的静态方法2
父类静态初始化块
子类静态初始化块
父类非静态初始化块
父类的构造方法
子类非静态初始化块
子类的构造方法
销毁父类
销毁子类