java 继承类加载顺序


package xu.jin;

class Insect{
	private int i=print("hello i");
	Insect(){System.out.println("Insect"+i);}
	{
		System.out.println("1");
		System.out.println("2");
	}
	static{
		System.out.println("3");
		System.out.println("4");
	}
	static int print(String str){
		System.out.println(str);
		return 2;
	}
	static int x1=print("static Insect");
}

 class hello extends Insect{
  private int j=print(" hello j");
  static int x2=print("static hello");
  hello(){
	  System.out.println("hello"+j);
	  }
  	{
		System.out.println("11");
		System.out.println("22");
	}
static{
		System.out.println("33");
		System.out.println("44");
	}

	public static void main(String[] args) {
			// TODO Auto-generated method stub
			hello sCat=new hello();
			//Insect ins=new Insect();
     System.out.println("hello world");
	}
}

output:

3
4
static Insect
static hello
33
44
hello i
1
2
Insect2
 hello j
11
22
hello2
hello world

    • 首先加载类,再初始化。想想也知道肯定先加载基类,再子类,初始化也是,子类是在基类基础上进行添加,肯定先要初始化基类再子类。
    • 先初始化static的变量,在执行main()方法之前就需要进行加载。再执行main方法,如果new一个对象,则先对这个对象类的基本成员变量进行初始化(非方法),包括构造代码块,这两种是按照编写顺序按序执行的,再调用构造函数。
    • 关于继承的初始化机制,首先执行含有main方法的类,观察到hello类含有基类Insect,即先加载Insect类的static变量,再加载hello类的static变量。加载完static变量之后,调用main()方法,new hello则先初始化基类的基本变量和构造代码块,再调用基类的构造方法。然后再初始化子类hello的基本变量和构造代码块,再执行子类的构造函数。

时间: 2024-10-16 04:28:20

java 继承类加载顺序的相关文章

Java 的类加载顺序

Java 的类加载顺序 一.加载顺序 1.父类的静态成员变量初始化 1.1.静态代码块 1.2.普通代码块 1.3.无参构造器 2.父类的静态代码块 3.子类的静态成员变量初始化 3.1.静态代码块 3.2.普通代码块 3.3.无参构造器 4.子类的静态代码块 5.父类的普通成员变量初始化 5.1.静态代码块 5.2.普通代码块 5.3.无参构造器 6.父类的普通代码块 7.父类的无参构造器 8.子类的普通成员变量 8.1.静态代码块 8.2.普通代码块 8.3.无参构造器 9.子类的普通代码块

Java虚拟机类加载顺序

Java虚拟机在加载类的时候,先初始化父类静态变量,再初始化子类静态变量,然后加载父类,最后加载子类 public class Parent { static{ System.out.println("static parent"); } public Parent(){ System.out.println("parent loaded"); } public void getaaa(){ System.out.println("parent aaa&q

java中类加载顺序

引子 记得上次中秋一哥们写个需求,没写完.他中秋过后还请一天假,有点错,打电话叫我帮他继续搞. 由于测试支撑,叫到我加班了.第二天过来看,打开页面直接报错,再次点击报错就不一样了.前次报错是有代码行的,第二次直接页面说类发现什么的错. 看了下代码,类似如下: 1 package san; 2 3 import java.io.FileNotFoundException; 4 import java.util.logging.Level; 5 import java.util.logging.Lo

分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码

先回顾一下classpath classpath的作用: classpath的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从classpath中进行查找这个类. 指定classpath的方式一:         设置环境变量CLASSPATH,多个路径之间使用英文的分号隔开,也可以指定为jar包路径.          示例:CLASSPATH=c:/myclasses/;c/mylib/aa.jar;c:/mylib/bb.jar;.          注意

java继承时候类的运行顺序问题

子类在继承父类后,创建子类对象会首先调用父类的构造函数,先运行父类的构造函数,然后再运行子类的构造函数,例如以下所看到的: class Father{ public Father(){ System.out.println("I am father"); } } public class Child extends Father{ public Child(){ System.out.println("I am child"); } public static vo

扩展类加载器-------改变JAVA的父优先类加载顺序

java的类加载机制默认情况下是采用委托模型:当加载某个类时JVM会首先尝试用当前类加载器的父类加载器加载该类,若父类加载器加载不到再由当前类加载器来加载,因此这种模型又叫做"父优先"模型. 但是在实际项目中我们可能会要求先从当前类加载加载再从父类加载器加载,如项目中的某类的版本可能和container中的不一致的时候,若还从container加载就会报jar包冲突的异常,实际上jar包冲突的问题在实际开发过程中是经常会遇到的.如我们在开发Loong时就遇到了类似问题. 解决方案是通过

Java 继承中构造方法的执行顺序问题

在Java中,如果一个类没有任何显式创建的构造器则该类默认会有一个无参构造器:如果显式创建了有参构造器则该类就不再有默认无参构造器. 在Java继承中,构造器并不能被继承,而是被显示或隐式调用. 1.子类的构造方法中必须调用其基类的构造方法(显示或隐式) 1.1.若是显示调用,则可以通过 super(argument_list) 来调用,且super调用必须在首行以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化(this关键字可以调用本类中的其他构造器,也必须在首句,因此thi

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题: 从程序的执行顺序去解答: 1.编译:当这个类被编译通知后,会在相应的目录下生成两个.class 文件.一个是 Base.class,另外一个就是Base$Sub.class.这个时候类加载器将这两个.class  文件加载到内存 2.Base base= new Sub(): 声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟

[转]Java虚拟机类加载机制浅谈

Java语言是一种编译后再经过解释器执行的过程, 解释器主要就是如何处理解释Class文件的二进制字节流.JVM主要包含三大核心部分:运行时数据区,类加载器和执行引擎. 虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验.准备.解析和初始化,最终就会形成可以被虚拟机使用的Java类型,这就是一个虚拟机的类加载机制.Java中的类是动态加载的,只有在运行期间使用到该类的时候,才会将该类加载到内存中,Java依赖于运行期动态加载和动态链接来实现类的动态使用. 一个类的整个生命周期如下: