如果我们说另一种不同的语言,那么我们就会发觉一个有些不同的世界。
上一篇(https://blog.csdn.net/qq_36562999/article/details/81256482)中讲到Java是一门面向对象的语言。并尝试着用类比的方法解释了对象和类的关系,现在我们来深入的认识Java对象。
我们都知道Java是基于C++的,但是Java是一种更“纯粹”的面向对象程序设计语言。因为C++是一门混合型的语言,C++是一个面向对象与面向过程的混合型语言。Java是一种纯粹的面向对象的语言,关于这点似乎有人有异议:
1.static修饰的变量是属于类的,而不属于任何对象
2.Java中的基本类型也不属于对象
关于第一点,其实从JVM的角度分析,我们在创建一个类的实例对象时,会有一个相应的class对象被创建,这个对象包含我们定义的类的所有静态变量和静态方法。这说明static修饰的变量也属于对象。
关于第二点,Java中对每种基本类型都有对应的包装类型,这里也回答一下我同学面试科大讯飞时碰到的问题:
Java中有了基本类型为什么还要有对应的包装类型?有了包装类还要有基本类型?
有了基本类型为什么要有包装类,因为基本类型之间没有什么实际操作,不能做一些实际的事情,比如有时强制类型转换会出问题,同时,JVM中基本数据类型也是被当做对象处理的(参考自https://blog.csdn.net/yuxin6866/article/details/52812911),只是在JVM中为基本类型创建的对象是很轻量级的,相对于直接创建的对应包装类做了许多优化;正是因为轻量级的缘故,这些类的原始功能很少(如不能调用内部方法,因为类内部已经优化得没有方法了)。但是,因为其轻量级的缘故我们获得了性能上的提升,其速度比包装类要快很多。
下面谈Java中创建对象时对内存的分配:
首先,有五个不同的地方可以存储数据:寄存器、堆栈、堆、常量存储、非RAM存储。
寄存器是最快的存储区,位于处理器内部。由于其内存极其有限,故按需分配,无法直接控制。
堆栈位于RAM中,通过堆栈指针从处理器获得直接支持。一般对象的引用存储在这里,对于基本类型则是存储基本类型的值在这里。创建程序时,Java系统必须知道存储在堆栈内所有项的确切周期。
堆内存也位于RAM,创建Java对象时会自动在这里进行存储分配。
常量值通常直接存放在程序代码内部,因为永远不会变。
如果数据完全存活于程序外,那么可以不受程序控制。比如流对象和持久化对象。在流对象中,对象转换为字节流发送到另一台机器,持久化对象存储在磁盘上。