面向对象这点不陌生了,从C#,到VB.net,再到此时的Java.其中学习的概念以及思想是一致的,只不过语言的关键字不同罢了.
但是当时的C#没有讲述数据类型在内存的分配,而在java内存分配如下.
java中内存分为四部分:堆栈区(heap)、栈区、数据区(data)、代码区(code)
java数据类型有两种:一个是基本的数据类型;另一个:引用类型(除了基本数据类型)。
基础的数据类型有四类八种:
逻辑类型:boolean
文本类型:char
整数类型:byte、short、int、long
浮点类型:float、double
那数据类型在内存中的分配。
基础数据类型和引用变量直接在栈空间分配。
直接new出来对象和数组,则引用名在栈空间,而实际的内容分配在堆空间。
那java栈和堆的区别是什么呢?
java的堆是一个运行时数据区,类的对象存放其中,这些对象都是通过new出来滴,它们不需要显示滴释放代码。堆是由垃圾回收机制来负责的。当堆中的对象没有引用变量(即没有指向它的变量),则垃圾回收机制会释放此对象。但是,堆中的对象都是在内存中动态生成的,存取速度相对于栈而言比较慢。
java的栈是存放基本的数据类型和引用变量,但是其中的数据大小和生存期都必须是确定的,存取速度比较快,只要超村变量的生存周期,则就会自动释放内存。
其中栈有个特点是:实现数据共享。
比如:java 定义:int a=1; 在栈中是如何实现的呢?首先在栈中创建一个a的引用,然后在栈中查询是否存在1这个数据,若是没有,则把1添加到栈中;然后a指向1.
若是再定义int b=1;过程如下:首先在栈中创建一个b的引用,然后在栈中查询是否存在1这个数据,此时查询到已经存在1这个数据,那直接把b指向1.即a和b指向同一个区域1.
但是若是改变a的值,即a=2;则会继续搜索栈中是否存在2这个数据,没有查询到直接把2添加到栈 中,最后改变a的指向。a指向2,但是b依然指向1.
但是注意:此时的数据共享和引用变量指向同一个对象则是不同的。对于后者引用变量指向同一个对象。比如:Person类。其属性name是public则。
Person p1=new Person();
Person p2=p1;
内存中如下:
若是改变其中一个引用变量,p1.name="abc",则p2.name=???答案肯定是abc啊。所以:引用变量指向同一个对象,若是其中一个改变,另一个肯定会改变的。但是对于栈中的数据共享(上述例子),则a的改变是不会影响b