`
Scliu123
  • 浏览: 41386 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

JDK_实例(类的加载顺序)

阅读更多

父类

package book.oo.initorder;

public class Parent {
	private int ix = 50;

	private static int iz = getNext(30);
	{
		System.out.println("Parent的初始化块");
		int x = 100;
		int y = getNext(100);
	}
	static {
		System.out.println("Parent的静态初始化块");
		int sx = 100;
		int sy = getNext(100);
	}
	public Parent() {
		System.out.println("Parent的构造方法被调用");
	}
	public void display() {
		System.out.println("Parent的display方法被调用");
		System.out.print("ix=" + this.ix);
		System.out.println("; iz=" + iz);
		dispA();
	}
	public static void dispA() {
		System.out.println("Parent的dispA()被调用");
	}
	public static int getNext(int base) {
		System.out.println("Parent的getNext(int base)被调用");
		return ++base;
	}
	/**
	 * 当Java在进行垃圾回收时,会调用对象的finalize方法
	 */
	protected void finalize() {
		System.out.println("Parent的销毁方法被调用");
	}
}

 

 

子类

package book.oo.initorder;

public class Child extends Parent {
	{
		System.out.println("Child的初始化块");
		int bx = 100;
	}
	static {
		System.out.println("Child的静态初始化块");
	}
	public Child() {
		super();
		System.out.println("Child的构造方法被调用");
	}
	public static void dispB(){
		System.out.println("Child的dispB()被调用");
	}
	/**
	 * 当Java在进行垃圾回收时,会调用对象的finalize方法
	 */
	protected void finalize() {
		System.out.println("Child的销毁方法被调用");
		super.finalize();
	}
}

 

 

测试类

package book.oo.initorder;

public class ClassInitOrderTest {

	public static void main(String[] args) {
		System.out.println("不new对象,访问静态方法时的输出:");
		Child.dispB();
		System.out.println();
		System.out.println("new对象,访问非静态方法时的输出:");
		new Child().display();
		//通知虚拟机进行垃圾回收
		System.gc();
	}

//保留main方法的前2行程序,将后面的注释,得到的输出结果是如下:
//	不new对象,访问静态方法时的输出:
//	Parent的静态初始化块
//	Parent的getNext(int base)被调用
//	Parent的getNext(int base)被调用
//	Child的静态初始化块
//	Child的dispB()被调用
	
//将main方法的前3行程序注释,保留后面的程序,得到的输出结果如下:
//	new对象,访问非静态方法时的输出:
//	Parent的静态初始化块
//	Parent的getNext(int base)被调用
//	Parent的getNext(int base)被调用
//	Child的静态初始化块
//	Parent的初始化块
//	Parent的getNext(int base)被调用
//	Parent的构造方法被调用
//	Child的初始化块
//	Child的构造方法被调用
//	Parent的display方法被调用
//	ix=50; iz=31
//	Parent的dispA()被调用
//	Child的销毁方法被调用
//	Parent的销毁方法被调用
	
//	总结:
//	1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
//	2、只有在调用new方法时才会创建类的实例
//	3、类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法;再执行
//	   本类继承的子类的初始化块,最后是子类的构造方法
//	4、类实例销毁时候,首先销毁子类部分,再销毁父类部分

}

 

分享到:
评论

相关推荐

    Tomcat启动时类加载顺序

    ### Tomcat启动时类加载顺序详解 #### 一、引言 Apache Tomcat是一款开源的Servlet容器,主要用于部署Java Web应用程序。它支持最新的Servlet、JSP等规范,并且以其轻量级、简单易用的特点而受到开发者的青睐。在...

    weblogic类加载过程简述

    可以通过调整类加载顺序、设置类加载器优先级、使用命名空间隔离等手段来解决。 10. **类加载器调试** 为了帮助开发者调试类加载问题,WebLogic提供了详细的日志和跟踪选项,可以通过修改`weblogic.log.File`和`...

    JVM类加载器说明文档

    展类加载器的加载顺序来理解。系统类加载器在加载类时,会先尝试让扩展类加载器加载,如果扩展类加载器无法加载,则再由系统类加载器自己尝试加载。这样的设计是为了保证核心类库的唯一性和安全性,避免用户自定义的...

    类加载机制1

    这样设计的好处是保证了核心库的稳定性,防止用户自定义类覆盖系统类,同时也便于控制类的加载顺序和版本。 4. **类的生命周期**: 类加载器不仅负责加载类,还参与类的生命周期管理,包括链接(验证、准备和解析...

    Java JDK实例宝典

    5 类的加载顺序 2. 6 方法和变量在继承时的覆盖与隐藏 2. 7 排序类 2. 8 Singleton单例模式 2. 9 Factory工厂模式 2. 10 Adapter适配器模式 第3章 数字 3. 1 数字与数字封装类 3. ...

    性能调优专题-jvm类加载机制-performance-jvmclassloader.zip

    例如,使用自定义类加载器实现按需加载,或者通过调整类路径和加载顺序,避免不必要的类加载。 7. **类加载异常处理** 在加载过程中,如果遇到类找不到、类格式错误等问题,JVM会抛出ClassNotFoundException、...

    类加载说明.pdf

    1. **启动类加载器(Bootstrap ClassLoader)**:这是最基础的类加载器,负责加载JDK中的核心类库,如`java.lang`包下的类。这个类加载器没有父类加载器,因为它本身是由C++编写并在JVM启动时初始化的。 2. **扩展类...

    Java类加载器学习总结.pdf

    Java类加载器是Java虚拟机(JVM)的重要组成部分,它们负责将Java源代码编译后的字节码(.class文件)转化为可执行的内存表示,即`java.lang.Class`对象,进而创建类实例。Java类加载器按照特定的规则进行工作,包括...

    译 Java类加载机制(二)

    在实际开发中,理解类加载机制有助于解决一些常见的问题,例如类冲突、类初始化顺序等。通过深入研究和定制类加载器,开发者可以实现更灵活的应用架构,如热更新、插件系统等。 在提供的文档"java类加载机制.doc"中...

    apache_tomcat_整合实例

    ### Apache与Tomcat整合实例详解 #### 一、引言 在现代Web应用开发中,Apache HTTP Server(简称Apache)与Apache Tomcat的整合是非常常见的一种配置方式。Apache以其高效稳定的HTTP服务能力和丰富的功能模块而...

    java范例开发大全

    实例167 继承关系的加载顺序 266 实例168 如何访问同名的方法或变量 268 实例169 super()方法的使用 271 实例170 this方法的使用 274 实例171 一张考试成绩单 275 实例172 银行自动存取一体机 278 9.4 多态 284 实例...

    Tomcat 类加载器的实现方法及实例代码

    Tomcat内部定义了多个类加载器,包括Bootstrap、Extension、Application(分别对应JDK的启动类加载器、扩展类加载器和应用程序类加载器),以及Tomcat自定义的Common、Catalina、Shared和WebappX类加载器。...

    jdk spi机制

    - 如果有多个实现类,可以通过实现`java.util.Serviceloader.Provider`接口来自定义加载顺序。 ### 进阶使用 除了基本的SPI机制,还可以通过自定义`java.util.ServiceLoader.Provider-Implementation`元数据来控制...

    java classLoader 的全面讲解

    1. 类冲突:不同类加载器加载相同类导致的问题,可通过调整类加载顺序或使用独立的类加载器解决。 2. 静态初始化器问题:多个类加载器加载同一类,可能导致静态初始化器被执行多次,需要谨慎处理类的加载关系。 3....

    Java范例开发大全 (源程序)

     实例167 继承关系的加载顺序 266  实例168 如何访问同名的方法或变量 268  实例169 super()方法的使用 271  实例170 this方法的使用 274  实例171 一张考试成绩单 275  实例172 银行自动存取一体机 278 ...

    java范例开发大全(pdf&源码)

    实例167 继承关系的加载顺序 266 实例168 如何访问同名的方法或变量 268 实例169 super()方法的使用 271 实例170 this方法的使用 274 实例171 一张考试成绩单 275 实例172 银行自动存取一体机 278 9.4 多态 284 实例...

    java范例开发大全源代码

     实例167 继承关系的加载顺序 266  实例168 如何访问同名的方法或变量 268  实例169 super()方法的使用 271  实例170 this方法的使用 274  实例171 一张考试成绩单 275  实例172 银行自动存取一体机...

    简单了解java类的初始化以及类的实例化

    Java类的初始化和实例化详解 Java类的初始化和实例化是Java编程语言中两个非常重要的概念,它们都是Java类生命周期的重要组成部分。下面我们将详细介绍Java类的初始化和实例化的过程,并解释其中的细节。 一、Java...

Global site tag (gtag.js) - Google Analytics