`
yeshaoting
  • 浏览: 686245 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简析程序执行过程(小例子)

    博客分类:
  • J2SE
阅读更多

程序貌似是Java程序思想上的 

/*
@TODO 程序执行过程*/

class Base
{
	static int s1 = prt("s1 initialized.", 11);
	int i1 = prt("i1 initialized.", 12);
	Base()
	{
		System.out.println("Base()");
		System.out.println("s1 = " + s1 + ", i1 = " + i1);
		draw();
	}
	void draw()
	{
		System.out.println("Base.draw:s1= " + s1 + " ,i1 = " + i1);
	}
	static int prt(String s,int num)
	{
		System.out.println(s);
		return num;
	}
}

class Cleanser extends Base
{
	static int s2 = prt("s2 initialized.", 21);
	int i2 = prt("i2 initialized.", 22);
	Cleanser()
	{
		System.out.println("Cleanser()");
		System.out.println("s2 = " + s2 + ", i2 = " + i2);
	}
	Cleanser(String a)
	{
		System.out.println("Cleanser(" + a + ")");
		System.out.println("s2 = " + s2 + ", i2 = " + i2);
	}
	void draw()
	{
		System.out.println("Cleanser.draw:s2 = " + s2 + ", i2 = " + i2);
	}
}

public class ExplicitStatic extends Cleanser
{
	static int s3 = prt("s3 initialized.", 31);
	int i3 = prt("i3 initialized.", 32);
	ExplicitStatic()
	{
		super("ExplicitStatic");
		System.out.println("ExplicitStatic");
		System.out.println("s3 = " + s3 + ", i3 = " + i3);
	}
	public static void main(String[] args)
	{
		ExplicitStatic x = new ExplicitStatic();
	}
	
}

 

输出结果:

s1 initialized.
s2 initialized.
s3 initialized.
i1 initialized.
Base()
s1 = 11, i1 = 12
Cleanser.draw:s2 = 21, i2 = 0
i2 initialized.
Cleanser(ExplicitStatic)
s2 = 21, i2 = 22
i3 initialized.
ExplicitStatic
s3 = 31, i3 = 32

 

引用自: www.codepub.com 源码网资料Java编程思想读书笔记

初始化顺序为:
1)    加载代码(.class文件)
2)    初始化class的静态成员,初始化顺序了“从里到外”,即从base class开始。
3)    在derived class的构造函数中调用base class的构造函数。
如果在derived class的构造函数中没有通过super()显式调用调用base class的构造函数,编译器会调用bass class的default构造函数并自动生成相应的调用语句,从而产生一个base class实例。如果在derived class的构造函数中通过super()显示调用了父类的构造函数,则调用所指定的构造函数。调用构造函数的调用顺序是“从里到外”。
4)    调用derived class的构造函数。
**:当base class没有default构造函数时,必须在derived class的构造函数中通过super显示调用base class的构造函数。
例:下面代码的初始化过程为:
1)    装载ExplicitStatic的代码(装载ExplicitStatic.class文件)。
2)    发现ExplicitStatic有关键字extends,装载ExplicitStatic的base class的代码(装载Cleanser.class文件)。
3)    发现Cleanser有关键字extends,装载Cleanser的base class的代码(装载Base.class文件)。
4)    初始化Base class中的静态成员。
5)    初始化Cleanser class中的静态成员。
6)    初始化ExplicitStatic class中的静态成员。
如果把(c)处的代码注释掉,那么初始化工作到此就结束了。
7)    为ExplicitStatic对象分配存储空间,并把存储空间初始化为0。
8)    在ExplicitStatic class的构造中调用super("ExplicitStatic")(在ExplicitStatic class的构造函数中显式调用父类的构造函数),试图产生一个Cleanser class实例。
9)    为Cleanser对象分配存储空间,并把存储空间初始化为0。
10)    由于Cleanser class又是继承自Base class,会在Cleanser class的构造函数中通过super()(由于没有显式调用父类的构造函数,所以自动调用父类的default构造函数)调用父类的构造函数,试图产生一个Cleanser class实例。
11)    产生一个Base class实例。先初始化成员变量,再调用构造函数。
12)    回到Cleanser class,产生一个实例。首先初始化Cleanser class中的成员数据,再执行构造函数Cleanser(String a)中的其余部分。
13)    回到ExplicitStatic class,产生一个实例。首先初始化ExplicitStatic class中的成员数据,再执行构造函数ExplicitStatic ()中的其余部分(System.out.println(“ExplicitStatic()”))。

 

结果中: Cleanser.draw:s2 = 21, i2 = 0

由于在Base()中调用draw()时,Cleanser中的i2还未进行初始化,而在为Cleanser对象分配存储空间时,把存储空间初始化为0,所以此时i2为0。

分享到:
评论

相关推荐

    简析linux内核的内核执行流程.doc

    Linux内核的执行流程是操作系统启动过程的核心部分,它涉及到从硬件初始化到用户空间应用程序运行的各个阶段。这里我们将深入探讨Linux内核的启动过程,主要聚焦于从启动到`main.c`执行的关键步骤。 首先,Linux...

    机器人-SPS程序-简析

    ### 机器人-SPS程序-简析 #### 一、引言 在现代工业自动化领域,机器人技术的应用日益广泛,而可编程逻辑控制器(PLC)作为实现工业自动化的重要组成部分,其程序设计对于确保生产效率与产品质量至关重要。本文将...

    ORACLE存储过程简析及C#调用.docx

    这个例子展示了如何在C#中创建一个`OracleCommand`对象,设置存储过程的参数,并执行存储过程。注意,调用存储过程时需要指定完整的包名和过程名,如`OPERATE_PRODUCTION.GetPro`。 总之,Oracle的Package提供了一...

    简析逻辑推演--程序设计在现实生活中的应用

    【简析逻辑推演--程序设计在现实生活中的应用】 逻辑推演是解决问题的关键技术,尤其在计算机科学领域,它在程序设计中起着至关重要的作用。逻辑推演涉及利用已知信息,通过分析和判断,得出未知信息的过程。在...

    简析化工设计过程中的电气与自动化仪表应用.pdf

    本文将对化工设计过程中电气与自动化仪表的应用进行简要分析,重点探讨选型要求、应用原则以及可靠性技术措施等方面。 首先,电气设备是化工生产中不可或缺的部分,包括发电、输电设备,电机保护和电力监控系统等。...

    Java中的泛型简析实战.zip

    Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战...

    简析基于SQL SERVER分页存储过程的演进

    在这个例子中,我们使用 `ROW_NUMBER()` 函数为数据行分配一个行号,这个行号是根据 `ProductID` 的降序排列生成的。然后在外部查询中,我们筛选出属于当前页的行。`BETWEEN` 语句确保了只选取当前页的数据,`@...

    简析电子管功放制作过程

    随着广播设备的数字化,许多库存的电子管大都失去了用武之地,尤其是中小功率电子管,其数量还很多。这些电子管,弃之可惜,不妨将其利用起来自制成小功率电子管监听功放。下面介绍的电子管功放就是用最常见的电子管...

    简析电子信息管理平台构建过程及要点 (1).pdf

    简析电子信息管理平台构建过程及要点 (1).pdf

    简析J2EE应用程序中数据库类的设计模式

    【简析J2EE应用程序中数据库类的设计模式】 在J2EE应用程序的开发过程中,数据库类的设计至关重要,它直接影响到系统的可维护性、扩展性和性能。本文主要探讨在不使用EJB技术的情况下,如何设计数据库类,特别是...

    ucos多任务程序实例 及其切换原理简析

    首先,多任务是UCOS的核心特性之一,它允许系统同时执行多个任务,每个任务都可以看作是一个独立的程序执行流。在UCOS中,任务通过优先级进行调度,高优先级的任务会优先得到CPU资源。任务之间通过信号量、消息队列...

    简析单片机定时器汇编程序

    ### 单片机定时器汇编程序解析 #### 一、单片机基础知识概述 单片机是一种将中央处理器(CPU)、存储器、输入/输出接口等集成在一块芯片上的微型计算机系统。它广泛应用于各个领域,特别是工业控制、家用电器、...

    嘉世咨询2024休闲食品行业简析报告.pdf

    【嘉世咨询】2024休闲食品行业简析报告.pdf【嘉世咨询】2024休闲食品行业简析报告.pdf【嘉世咨询】2024休闲食品行业简析报告.pdf【嘉世咨询】2024休闲食品行业简析报告.pdf【嘉世咨询】2024休闲食品行业简析报告.pdf...

Global site tag (gtag.js) - Google Analytics