目录

第八章 多态
第十四章 类型信息
第十二章 通过异常处理错误
第十三章 字符串

1. 前期绑定 & 后期绑定

绑定是指将方法调用同一个方法主体关联起来的这么一个过程。如果在程序执行前进行绑定,就称为前期绑定。(C中所有的方法调用都是前期绑定)

后期绑定就是指在运行时根据对象的类型进行绑定。后期绑定也叫动态绑定/运行时绑定。

一种语言要想实现后期绑定,就必须具有某种机制,以便于在运行时能判断对象的类型,从而调用恰当的方法。不同的语言有不同的实现机制,不管怎么样都必须在对象中安置某种类型信息。(比如在C++中是通过在对象中安插一个指向虚函数表的指针来保存该对象的类型信息)。由此可见,运行时类型信息很重要!那java中是如何实现在运行时来获取对象的类型信息的呢?

java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定的。声明为final的方法会告诉编译器“关闭”动态绑定。

 

2. 不会产生多态的情况

(1)子类覆盖父类的private方法

(2)访问字段(用一个指向子类的父类引用访问字段是不会产生多态的),并且这个访问是在编译时解析。

(3)静态方法

 

3. 如果覆盖了父类的方法,特指资源清理类方法,记得先释放子类部分的资源,然后super调用父类的方法以释放对象的父类部分资源。

 

4. RTTI

在运行期间对类型进行检查的行为称作运行时类型识别 

 

第十四章 类型信息

运行时类型信息使得我们可以在运行时发现和使用类型信息。

1. java是如何让我们在运行时识别对象和类的信息的呢?

两种方式:

(1)传统的RTTI:它假定我们在编译时已经知道了所有的类型。(也就是说:在编译的时候就知道在某个类继承体系中有哪些类型了。)

(2)反射机制:它允许我们在运行时发现和使用类的信息。

 

2. class对象

要理解RTTI在java中的工作原理,首先必须知道类型信息在运行时是如何表示的。这项工作是由称为class对象的特殊对象完成的,它包含了与该类有关的信息。

[个人理解:编程语言中的所谓对象,无非就是内存中的一块区域,那么class对象就是这样的一块内存,它里面保存的是类相关的信息。]

类是程序的一部分,每个类都有一个class对象。

[个人理解:一个类有哪些方法,有哪些域,所有的这些信息都应该保存在内存中的一个区域,每个类在内存中都应该有这样的一块区域来保存这样的信息,而每一个这样的一块区域被称为class对象。]

 

3. java特有的动态加载

java中所有的类都是在对其第一次使用时,动态加载到JVM中的。所谓动态加载是指:java程序在它开始运行之前并非被完全加载,其各个部分是指在必需时才加载的。这一点与许多传统语言都不同。C++是静态加载语言。

 

4. 为什么要先有class对象?

class对象保存了对象的类型信息,如果没有class对象,就不知道对象应该占据多大的内存,在new对象的时候就不知道该分配多大的空间。所以在创建对象实例之前JVM一定会保证已经加载了对应的类。一旦一个类的class对象在内存中被创建好了,它就被用来创建这个类的所有对象。

 

5. 获取某个类A的class对象的引用

(1)public static Class<?> forName(String name) throws ClassNotFoundException

返回与带有给定字符串名的类或接口相关联的 Class 对象。

这种方式适用于没有对象实例的情况。

(2)调用A对象实例的getClass()方法

这种方式适用于有对象实例的情况。

(3)类字面常量 "A.class"

这种方式简单、安全,在编译时就会受到检查。

 

6. 为了使用一个类而做的准备(类的加载过程):

(1)加载:在内存中创建一个class对象。

(2)链接:验证字节码、为静态域分配存储空间、解析对其他类的所有引用

(3)初始化:初始化静态域的存储空间

 

7. 在java中哪些情况下需要RTTI呢?

(1)传统的类型转换:由RTTI确保类型转换的正确性,若执行了一个错误的类型转换,会抛出ClassCastException异常。

(2)查询Class对象相关的操作。

(3)instanceof:用法是 ”对象 instanceof 类型“ ,可以使用Class类的实例方法boolean isInstance(Object obj)判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。此方法是 Java 语言 instanceof 运算符的动态等效方法。即对于类A来说,下面的两个if语句等效:

A a = new A();
if(a instanceof A)
{
}

if(A.class.isInstance(a))
{
}
View Code

相关文章:

  • 2022-02-13
  • 2022-12-23
  • 2022-01-07
  • 2021-12-07
  • 2022-01-14
  • 2021-06-26
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-13
  • 2022-12-23
  • 2021-07-04
  • 2021-07-31
  • 2021-11-25
  • 2021-09-15
  • 2022-12-23
相关资源
相似解决方案