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

当编译时类型与运行时类型不同时

    博客分类:
  • java
 
阅读更多
class Base {
	private int i = 2;          // 2

	public Base() {
		this.display();         // 3
	}

	public void display() {
		System.out.println(i);  //
	}
}

class Derived extends Base {
	private int i = 22;         // 5

	public Derived() {
		i = 222;                // 6
	}

	public void display() {
		System.out.println(i);  // 4
	}
}

public class Test {
	public static void main(String[] args) {
		new Derived();          // 1
	}
}

以上代码输出结果为0

代码行的注释表示执行顺序;

1:系统先为Derived对象分配内存空间,有两块内存空间分别存放Derived对象的两个i实例变量,一个是属于Base的一个是Derived的,此时这两个i实例变量的值都是0;

2:执行Derived类的构造器之前,先执行Base类的构造器。表面上看,Base类经过编译器处理后,其构造器包含如下两行代码:
      i  =  2; 
      this.display();

3: this.display();中的this在这里是指向Derived的,即实现子类的方法覆盖父类的方法

4:此时Derived的i还没有经过初始化,为0,故输出0

5:Derived的i初始化

6:Derived的构造器

----------------------------------

将Base类的构造器改为如下形式:

public Base() { 
           System.out.println(this.i); 
           this.display(); 
} 

再次运行程序,将看到输出是2和0;

当变量的编译时类型和运行时类型不同时,通过该变量访问它所引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定,但通过该变量调用它引用的对象的实例方法时,该方法行为由它实际所引用的对象来决定,一次当程序访问this.i时,它将访问Base类中定义的i实例变量,也就是将输出2;但执行 this.display()时则实际表现出Derived对象的行为,也就是输出Derived对象的i实例变量,即为0。

分享到:
评论

相关推荐

    Maven编译不兼容解决方案

    eclipse 中编译、运行都正常,但是如果用maven的打包命令 mvn clean package 进行打包时会发现有类型错误

    反编译中数据类型重构技术研究

    题,给出了基于运行时信息指针辅助判定方法,同时针对基本类型重构结果不确定的情况, 给出了基于数据流分析框架的双向类型传播模型,通过构建类型格并在格的基础上求解类 型传播方程,从而达到类型细化的目的;通过...

    C++运行时类型信息揭密

    你从C#中很容易在运行时得到某个引用的类型信息。但是C++也有运行时类型信息(奇怪,C++编译后是二进制代码,怎么会有类型信息呢)。本文档就是从PE文件和内存揭示C++到底如何实现运行时类型信息和类型转换。

    编译原理课程设计-C语言子集编译器(含报告和可运行源代码).rar

    在进行编译的过程中,能过滤去 “//”或“/* */”形式的文字注释,具备一定的代码错误处理能力,即在编译过程中发现语法或语义错误时,将输出错误信息(出错所在代码行号和错误类型提示信息),然后跳过错误语句继续...

    Editplus 配置java编译运行

     对于文本编辑软件我推荐EditPlus,EditPlus是很多程序员非常熟悉的编辑工具,它以占用系统资源小、操作简便灵活、支持文件类型丰富(还能自定义文件类型)等优点而被广泛使用。EditPlus除了具有编辑程序的功能,还有...

    编译原理课程设计 广东工业大学 09级

    ② 运行时存储组织和管理 ③ 语法分析方法 ④ 中间代码表示 4)测试用例 5)开发过程和完成情况 (4)光盘内含: ① 扩充后的PLO编译程序的源程序文件和可执行程序文件; ② 测试用例的PL0语言源程序和编译运行...

    Sqlite AnyCPU 不需要C++运行环境 32位 64位 自适应

    支持项目生成时选择为AnyCPU(不受32位系统与64位系统的限制) 已完善为自动检测当前系统位数,本次程序运行只释放对应位数的SQLite.Interop.dll 在只装有.NET2.0的机器上就可以操作Sqlite数据库。 实测32(XP,2003...

    编译原理及实现

    本书系统介绍了经典的编译理论和技术,同时也包含了面向对象语言等当前较新语言的编译技术。本书更可贵之处在于提供了较完整的适用于教学实践的样例语言,是一本理论和实践内容相结合的、不可多得的好书。 本书可...

    程序设计语言编译原理 (陈火旺)

    1.4编译程序与程序设计环境 1.5编译程序的生成 第二章高级语言及其语法描述 2.1 程序语言的定义 2.1.1语法 2.1.2 语义 2.2 高级语言的一般特性 2.2.1 高级语言的分类 2.2.2程序结构 2.2.3数据类型与操作 ...

    ASP.NET的网页代码模型及生命周期

    但是与.cs页面编译过程不同的是,当浏览者第一次浏览到.aspx页面时,ASP.NET自动生成该页的.NET类文件,并将其编译成另一个.DLL文件。 当浏览者再一次浏览该页面的时候,生成的.DLL就会在服务器上运行,并响应用户在...

    dotnet-CoreCLR是NETCore的运行时包括垃圾收集器JIT编译器原始数据类型和低级类

    CoreCLR是.NET Core的运行时,包括垃圾收集器、JIT编译器、原始数据类型和低级类

    Java期末考试真题试卷及复习资料【高级编程】

    Java期末考试真题试卷及... 多态 答Java引用变量分为编译时的类型和运行时的类型编译时类型由声明该变量时使用的类型决定运行时类型由实际赋给该变量的对象决定如果两类型不一致就出现多态 3.阻塞 答当前正在执行的线

    汇编语言编译器(编辑、编译、运行、调试)

    该软件提供了编辑、编译、运行、调试汇编语言程序的集成环境。目前支持MASM、TASM、MCS51三种编译器。第一次使用时,要现在选项菜单中选择您所使用的编译器类型及其目录所在。

    编译原理经典教材

    本书深入讨论了编译器设计的重要主题,包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,每章都...

    编译原理实验 广东工业大学 09级

    ② 运行时存储组织和管理 ③ 语法分析方法 ④ 中间代码表示 4)测试用例 5)开发过程和完成情况 (4)光盘内含: ① 扩充后的PLO编译程序的源程序文件和可执行程序文件; ② 测试用例的PL0语言源程序和编译运行...

    Libcurl 可以编译成 静态lib

    编译时一定要注意: 编译此lib时,选择的 配置属性->C++->代码生成->运行库里选择类型与自己要用此lib的程序用的类型要一致;不然的话一堆错误...

    编译原理全套

    第6章 运行时存储空间的组织和管理 6.1 局部存储分配策略 6.1.1 过程 6.1.2 名字的作用域和绑定 6.1.3 活动记录 6.1.4 局部数据的安排 6.1.5 程序块 6.2 全局存储分配策略 6.2.1 运行时内存的划分 6.2.2 静态...

    C#编译原理 ZIP 压缩文件

    C#编译原理 目 录 译者序 前言 第1章 概论 1 1.1 为什么要用编译器 2 1.2 与编译器相关的程序 3 1.3 翻译步骤 5 1.4 编译器中的主要数据结构 8 1.5 编译器结构中的其他问题 10 1.6 自举与移植 12 1.7 TINY样本语言与...

    编译原理(龙书)中文第二版

    本书深入讨论了编译器设计的重要主题,包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,每章都...

    编译原理及实践

    本书系统介绍了经典的编译理论和技术,同时也包含了面向对象语言等当前较新语言的编译技术。本书更可贵之处在于提供了较完整的适用于教学实践的样例语言,是一本理论和实践内容相结合的、不可多得的好书。 本书可...

Global site tag (gtag.js) - Google Analytics