[java乱弹]--(2)“类”是虚拟机构建对象的原材料,是真的吗?

版权声明: https://blog.csdn.net/zhaoyaxuan001/article/details/82292065
声明:
Author:赵志乾
Date:2018-9-2
Declaration:All Right Reserved!!!

在《我眼中的虚拟机》一节中,我们谈及“类”是虚拟机构建对象的原材料。但有人可能会说,这一说法似乎有问题呀!类并不都是用来构建对象的呀。比如说抽象类、接口(姑且看作一种特殊的类吧)以及一些仅提供静态方法的工具类。抽象类和接口显然不能进行实例化,而仅提供静态方法的工具类也无需进行实例化。

仅提供静态方法的工具类虽然无需进行实例化,但并不代表他们不能进行实例化。只不过在进行实例化后,白白浪费了一段堆空间。因为这段堆空间实质上是作为对象的占位符,为对象提供在虚拟机中的唯一标识,除此之外,别无他用。因为静态方法均关联于类本身,属于静态绑定范畴,即通过使用类便可以完成静态方法的调用(此过程是表演给编译器看的)。

而对于抽象类和接口,我们也可以完全站在另一个角度来看,接口虽然不能用于实例化对象,但是它可以给对象换装。即接口是一件变身外袍,能够让某一对象以多种姿态展现在我们面前。当然,前提是该对象必须实现了这些接口。也可以认为类实现的接口数目就是他从商场购买回来的变身外袍数目。当虚拟机拿着拥有变身外袍的类构建对象时,也会将这些变身外袍一起打包并关联到所分配的堆空间内存上。从而在运行时能够准确的判定某段堆内存上存放的对象是否实现了某个接口。所以说接口也为虚拟机构建对象提供原材料。

最后,我们来看一下抽象类。抽象类作为接口的一种实用替代品,优劣参半(限于java7版本以前)。因为抽象类真的属于类的一种,故只能进行单继承,而其优点也很显著,就是可以为接口中的方法提供默认实现。当新建类继承抽象类时,只需要实现其中没有实现的抽象方法或者依据应用场景复写其中特定的方法即可(这一设计理念在标准库中非常常见)。由此也可以看出,抽象类具有接口的变身外袍特性,还能够为对象构建过程中提供更多的构建信息,比如内存的部分布局和对象间的协作方式等等。故抽象类也为虚拟机构建对象提供了原材料。只不过和接口一样,提供的原材料的方式更为间接。

综上所述:不管是普通的类、抽象类、接口还是仅提供静态方法的工具类,都能够虚拟机在堆内存空间上构建对象提供原材料。只不过提供原材料的方式有些许的不同,有的更为直接,有的更为含蓄。但不管怎样,有提供的能力就是王道,是否真的需要使用,那就看场景的具体需要了。

 

 

 

 

猜你喜欢

转载自blog.csdn.net/zhaoyaxuan001/article/details/82292065