`
yeshaoting
  • 浏览: 692185 次
  • 性别: 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。

分享到:
评论

相关推荐

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

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

    C#多线程及同步示例简析

     线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的...

    Python反射用法实例简析

    1. **插件系统**:在编写插件系统时,反射允许程序加载未知的插件类并执行相应的方法。 2. **配置驱动**:根据配置文件中的类名动态创建对象,实现灵活的配置策略。 3. **序列化/反序列化**:在序列化框架中,反射...

    java thread start()和run()方法简析

    在Java编程语言中,线程是程序执行的独立路径,允许多个任务同时进行。`Thread` 类提供了创建和管理线程的能力。本文将深入探讨`start()` 和 `run()` 方法的区别及其在多线程环境中的作用。 1. **start() 方法** ...

    javascript闭包(Closure)用法实例简析

    - **记忆状态**:闭包能够保存函数的状态,即在函数执行过程中产生的变量值,使得每次调用时都能记住之前的上下文。 - **作用域链**:闭包形成了一个作用域链,它允许内部函数访问外部函数的变量,而不会污染全局...

    js中键盘事件实例简析

    在这个例子中,`window.onload`函数确保在页面加载完成后才执行绑定事件的代码。`bd`变量获取了页面的`body`元素,然后将一个匿名函数绑定到`onkeypress`事件上。这个函数会捕获到每次按键事件并弹出对应的键码。 `...

    lucene深入浅出

    - "Lucene的例子" 和 "lucene全文检索应用示例及代码简析" 提供了实际操作的例子,涵盖了基本的索引创建、搜索和更新操作,帮助理解Lucene API的使用方法。 - "Lucene+hibernate+spring配置心得" 描述了如何将这三...

    猪哥的嵌入式linux公房菜

    - **定义**:在一种平台上编译出另一种平台可执行的程序。 - **用途**:适用于嵌入式系统开发。 **8. 两本嵌入式Linux开发经典教程比较** - **《Embedded Linux Systems with the Yocto Project》**:侧重于Yocto...

    腾讯2012实习生笔试题

    **题目描述**:程序的完整编译过程分为预处理、编译、汇编等阶段。关于编译阶段的编译优化,下列说法中不正确的是? **选项**: - A. 死代码删除指的是编译过程直接抛弃掉被注释的代码; - B. 函数内联可以避免函数...

Global site tag (gtag.js) - Google Analytics