编译时类型与运行时类型

1.编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。

当编译时类型和运行时类型不一致时,就会出现所谓的多态。

因为子类是一个特殊的父类,因此java允许把一个子类对象直接赋给一个父类的引用变量,无需任何类型转换(向上转型)

引用变量在编译阶段只能通过编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法。因此,编写java代码时,引用变量只能

调用声明该变量时所用类里包含的方法。

2.编写程序时,引用变量只能调用它编译时类型的方法,而不能调用运行时类型的方法,即使实际所引用的对象确实包含该方法。

如果需要让这个引用变量调用它运行时类型的方法,也就是要把一个父类对象赋给子类对象时,则必须要把它强制类型转换成运行时类型。(向下转型)

SubClass sb=(SubClass)ploymophicBc

注意:引用类型之间的转换只能在有继承关系的两个类型之间进行。如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型为子类类型)

使用instanceof运算符先进行判断是否可以成功转换,增强程序健壮性

时间: 2024-11-06 19:39:59

编译时类型与运行时类型的相关文章

编译时异常与运行时异常的区别

Java异常类层次结构图 Java异常类层次结构图 运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常).IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理.这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生. 运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕

小谈编译时类型与运行时类型

Java引用变量有两个类型,一个是编译时类型,还有一个是运行时类型. 编译时类型是由声明该变量时使用的类型所决定,运行时类型是由该变量指向的对象类型决定 如果两种类型不一致,就会出现多态,因此就会将子类对象之间赋值给父类引用变量,称为向上转型,而不用进行类型转换.如 Animal a = new Bird(),其中引用变量 a 的编译时类型是 Animal,运行时类型是 Bird,两者不一致,因此出现多态 当使用该对象引用进行调用的时候,有这么一条规则,对象调用编译时类型的属性和运行时类型的方法

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

android apk 防止反编译技术第二篇-运行时修改Dalvik指令

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

Android Gradle编译so库或运行时出现 text relocations 崩溃的正确解决方法

1.so库编译时出现 这种情况一般是使用了新版的NDK编译造成的,新版的ndk将warning视为error, 解决方法: 在Android.mk里面加入#LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true 这种方法编译的so库不能运行在target api为23以上的机器. 2.Android运行时崩溃提示 这种情况主要是因为从 API 23 开始,共享对象将不得包含文本重定位.也就是说,代码必须按原样加载,不得对其进行修改.这种方法减少了加载时间,并提高了

java中的编译时常量与运行时常量

常量是程序运行期间恒定不变的量,许多程序设计语言都有某种方式,向编译器告知一块数据是恒定不变的,例如C++中的const和Java中的final. 根据编译器的不同行为,常量又分为编译时常量和运行时常量,其实编译时常量肯定就是运行时常量,只是编译时常量在编译的时候就被执行计算,并带入到程序中一切可能用到它的计算式中. 以Java为例,static final int a = 1将是一个编译时常量,编译后的符号表中将找不到a,所有对a的引用都被替换成了1. 而static final int b

Jvm(7),运行时数据---jvm运行时数据总览

jvm官方给的数据区图 首先我们来从总体上来看线程共享区和线程独占区.通过下面的图了解 其实在这里我们可以完全把运行时数据和多线程联系在一起,多线程的基础无非就是线程共享区和线程独占区的概念. 原文地址:https://www.cnblogs.com/qingruihappy/p/9691286.html

。net可以点出属性,编译没问题,运行时就报错了。一笔记。

项目框架是这样的. 在 domain(你可以把它理解为你的bll) ,web 2个项目工程里面都引用了一个通过nuget管理程序包,比如 xxcommon.dll web 引用了 domain ,然后在 domain 里面 使用 xxcommon.dll 的某个类的属性(或者方法,后面才加的).在VS里面. 也就是 domain 层,通过 vs 的智能感知,可以 点出来 新加的东西,也可以编译通过. 然后跑起来,就不行了............................;-). 最后找了下

C++杂记:运行时类型识别(RTTI)与动态类型转换原理

运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert> struct B {} b, c; struct D : B {