Java中关于类加载顺序的问题
2018-04-03 10:55
232 查看
Java中关于类加载顺序如下:(1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)(2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )(3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )(4) 父类构造函数(5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )(6) 子类构造函数其中:类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)2.其次,需要理解子类覆盖父类方法的问题,也就是方法重写实现多态问题。Base b = new Sub();它为多态的一种表现形式,声明是Base,实现是Sub类, 理解为 b 编译时表现为Base类特性,运行时表现为Sub类特性。当子类覆盖了父类的方法后,意思是父类的方法已经被重写,题中 父类初始化调用的方法为子类实现的方法,子类实现的方法中调用的baseName为子类中的私有属性。public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
} new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null基于以上分析该程序输出结果为null。
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
} new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null基于以上分析该程序输出结果为null。
相关文章推荐
- 关于java内部类加载顺序的问题
- 关于java文件加载和初始化顺序问题分析
- 关于java内部类加载顺序的问题
- 关于在页面里加载和执行JS顺序的问题
- java 初始化的加载顺序问题
- 关于DLL路径加载顺序的问题
- 关于java中一次编译多个源文件时的编译顺序的问题
- 关于html和javascript在浏览器中的加载顺序问题的讨论
- 关于js在页面呈现时的加载顺序问题
- Java笔记(十二)……类中各部分加载顺序及存放位置问题
- Java中 子、父类加载的顺序问题
- 关于类变量的加载顺序问题
- 关于html和javascript在浏览器中的加载顺序问题的讨论(zz)
- 关于Java变量初始化顺序问题实践
- 关于html和javascript在浏览器中的加载顺序问题的讨论
- 关于DLL路径加载顺序的问题
- Java类被加载时执行的顺序问题
- java 初始化的加载顺序问题
- Java中关于HashMap的元素遍历的顺序问题
- 关于Java中初始化顺序的问题