`
甜甜的眼泪
  • 浏览: 16295 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

深入探究java中拓展类(子类)的初始化过程

阅读更多

      如果不懂java中初始化过程,那么就不能称你懂java。今天我总结了一下java中的初始化过程。并通过一个例子加深理解。

     当你运行一个java程序时,

       1  首先计算机去找类的路径classpath(该路径是你设置的环境变量)

        2 通过路径找到.class文件。

        3  在JVM中进行类的加载,发现有父类 进行4

        4  在classpath中找到父类的.class文件 

        5   对父类中静态资源进行初始化

        6  对子类的静态资源初始化

        7 如果主函数中有对象的产生 那么进行 8,9,10,11

        8 父类成员属性的初始化

        9  父类构造方法的初始化

       10 子类成员属性的初始化

       11 子类构造方法的初始化

     下面一段代码可以加深理解

 

class Shape {
	private static int i;
	protected static int j=10;
	Shape () {
		System.out.println ("i = " + i + ", j = " + j);
		j = 5;
	}
	private static int x1 = printInit("private Shape.x1 initialized");   //1
	static int printInit(String s) {
		System.out.println (s);
		return ++i;
	}
}

public class Circle extends Shape {
	int k = printInit("Circle.k initialized");
	public Circle () {
		System.out.println ("k = " + k);
		System.out.println ("j = " + j);
		System.out.println ("x2 = " + x2);
		super.printInit("super");
	}
	public static int x2 = printInit("public Circle.x2 initialized");
	public static void main(String[] args) {
		System.out.println ("Circle constructor");
		Circle b = new Circle ();
		System.out.println ("b.k="+b.k);

	}
}

   下面开始讨论这个例子

 

       1  首先计算机去找类的路径classpath(该路径是你设置的环境变量)

        2 通过路径找到Circle.class文件。

        3  在JVM中进行类的加载,发现有父类 Shape进行4

        4  在classpath中找到父类的 Shape.class文件 

        5   对父类中静态资源进行初始化   初始化结果:private static int i;初始化的时候如果没有赋值,基本类型都会被初始化为0,对象引用被初始化为null。这一句得到i=0;protected static int j=10;得到j=10;

      private static int x1 = printInit("private Shape.x1 initialized");   //1
      static int printInit(String s) {
        System.out.println (s);
        return ++i;
    }  那么改程序的第一句将输出private Shape.x1 initialized;并且i=1;

        6  对子类的静态资源初始化

    public static int x2 = printInit("public Circle.x2 initialized");
   那么将输出第二句public Circle.x2 initialized  并且i=2; x2=2

    由public static void main(String[] args) {
        System.out.println ("Circle constructor");
        Circle b = new Circle ();
        System.out.println ("b.k="+b.k);

    }  将输出第三句:Circle constructor   。

        7 主函数中有对象的产生 那么进行 8,9,10,11

        8 父类成员属性的初始化   父类中没有成员属性

        9  父类构造方法的初始化

Shape () {
        System.out.println ("i = " + i + ", j = " + j);
        j = 5;
    }将输出i=2,j=10  然后j=5

       10 子类成员属性的初始化

       int k = printInit("Circle.k initialized");将输出:Circle.k initializd  然后i=3  k=3

       11 子类构造方法的初始化

     public Circle () {
        System.out.println ("k = " + k);
        System.out.println ("j = " + j);
        System.out.println ("x2 = " + x2);
        super.printInit("super");
    }  将输出k=3  j=5  x2=2   super   并且i=4

    System.out.println ("b.k="+b.k);

   将输出结果  b.k=3

 那么最终输出结果为

 

private Shape.x1 initialized
public Circle.x2 initialized
Circle constructor
i = 2, j = 10
Circle.k initialized
k = 3
j = 5
x2 = 2
super
b.k=3

 

分享到:
评论

相关推荐

    利用子类化技术拓展EDIT文本编辑框控件.zip

    本主题将深入探讨如何利用子类化技术来拓展EDIT文本编辑框控件,以此来实现自定义的功能和效果。 一、什么是子类化 子类化是指将一个窗口类(Window Class)替换为另一个窗口类的过程。在Windows API中,这通常通过...

    java中文转拼音

    ### Java程序实现中文转拼音及首字母转换 #### 概述 ...通过对类的设计、初始化过程以及实现细节的深入分析,我们不仅可以了解到这一转换的基本原理,还能在此基础上进行更多的功能拓展和技术优化。

    根据用户初始化菜单权限

    - **错误处理与日志记录**:在权限验证和菜单初始化过程中,应添加异常处理逻辑,对于权限获取失败或菜单加载异常的情况,记录详细的错误信息,便于后续排查和维护。 总之,“根据用户初始化菜单权限”不仅是实现...

    序列化多表操作、请求与响应、视图组件(子类与拓展类)、继承GenericAPIView类重写接口.doc

    在这个文档中,我们主要关注如何处理序列化多表操作,理解请求与响应的流程,以及如何使用视图组件(包括子类与拓展类)以及重写`GenericAPIView`类的接口。 首先,让我们深入探讨序列化多表操作。在Django中,我们...

    JAVA面向过程的程序设计

    在Java中,程序是由类构成的,每个类都是创建对象的模板。一个类可以包含零个或多个方法,这些方法描述了对象能够执行的操作。通过类的实例化,我们可以创建具体的对象。在面向对象编程中,对象间的交互可以通过继承...

    Java虚拟机工作原理详解

    * Initializing:执行类的初始化方法,如静态变量赋值和静态块执行。 三、类加载器的特点 * 可见性限制:下层的加载器能够看到上层加载器中的类,反之则不行,也就是说委托只能从下到上。 * 不允许卸载类:类加载...

    think in java 中文doc文档

    《Think in Java 中文文档》作为一本深入讲解Java编程语言的教材,不仅适合有志于深入学习Java的程序员,也适合那些希望拓展自己技术栈的初学者。本书通过系统性的结构和丰富的实例,帮助读者全面理解Java,并最终...

    JAVA拓展思维练习题

    线程并发处理也是Java中的一项挑战。你可能会遇到涉及同步和异步、线程安全、锁机制、并发工具类如Semaphore、CountDownLatch等的问题。理解并熟练运用这些工具,能够让你编写出高效且稳定的多线程程序。 还有,...

    黑龙江大学Java实验报告及实验源码.zip

    Matrix类应包含二维数组来存储元素,提供初始化、加法、减法、乘法等操作的方法。此外,还可能包括转置、求行列式、求逆矩阵等功能,这些都是在理解算法和数据结构时的重要实践。 通过这些实验,学生可以学习到Java...

    深入java虚拟机移植

    如果开启,则在启动时会预先加载一部分类,以加快应用程序的初始化速度。 通过仔细调整这些编译选项,开发者可以确保KVM在ARM平台上的高效稳定运行,同时还能根据特定的应用场景进一步优化性能。 #### 结论 随着...

    phprpc.jar 包java 反序列化PHP工程demo

    在Java中,反序列化是将已保存或传输的序列化对象状态转换回对象的过程,这对于跨平台交互或持久化存储非常有用。 在"phprpc.jar 包java 反序列化PHP工程demo"中,我们主要会学习以下几个关键知识点: 1. **PHP...

    K均值非监督分类java实现

    - 可以尝试其他的初始化方法或距离度量,比如质心初始化或马氏距离。 5. **应用拓展**: - 将此分类算法应用于其他领域,如文本分类、客户细分等。 - 结合深度学习方法,如自编码器,提升聚类效果。 总的来说,...

    JAVA面向对象程序设计练习题库.zip

    Java中的关键字`extends`用于实现继承,子类可以覆盖或扩展父类的方法,实现功能的拓展。 3. **多态**:多态性是面向对象的另一个关键特性,它允许不同对象对同一消息做出不同的响应。Java中,多态主要通过接口...

    Java学习从入门到精通 3过程篇

    2. **Package与Import机制**:Java中的package用于组织类,import则用于引入特定包中的类。掌握这两者的工作原理,能够帮助开发者在大型项目中有效地管理类文件,避免命名冲突。 #### 二、语法入门:从C到Java的...

    java 行业 学习拓展资料

    理解TCP/IP协议以及HTTP协议在Java中的应用是进行网络编程的基础。 接下来是Java的框架。Spring框架是Java企业级应用的首选,它的依赖注入(DI)和面向切面编程(AOP)概念简化了代码结构。Spring Boot则进一步简化...

    java多叉树的个性化拓展

    在Java中,我们可以创建一个`Node`类来表示树的节点,其中包含一个`value`属性以及一个`List<Node>`类型的`children`属性,用于存储子节点。 - 实现插入节点、删除节点、遍历节点(如深度优先搜索DFS和广度优先搜索...

    基于Java技术的英汉互译词典

    开发人员通过编写SQL脚本,创建数据库表、定义表结构、初始化数据等。在词典运行前,将`word.sql`脚本导入MySQL数据库,可以快速完成词库的建立。在这一过程中,需要掌握SQL语言的基础知识,包括数据定义语言(DDL)...

Global site tag (gtag.js) - Google Analytics