Java数据类型和类型转换

Java的数据类型分为基本数据类型和引用数据类型

  

Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

   

   
        栈(stack):在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有    的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。  
        
        堆(heep): 堆内存用来存放由new创建的对象和数组,堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 

   方法区:用于存放类的信息。

   本地方法栈:给C/C++的native原生底层方法给予支持。

   PC寄存器:给CPU用。

堆与栈之间的联系:

  当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配, 即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放, 数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放, 在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

     栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

数据类型的转换

  数据类型的转换分为隐式类型转换和显示类型转换,区别在于范围大小(如int的范围-2^16~2^16-1,注意这里比较的并不是所占字节)的转换方向,也就是向上转型和向下转型。

  隐式类型转换即是向上转型,属于自动转换,表示范围小的向范围大的数据类型进行转换,如:

                int a=50;
             long b=a;            

  显示类型转换即是向下转型,属于强制转换,表示范围大的向范围小的数据类型进行转换,如:

         long a=50;
            int b=(int) a;

  

原文地址:https://www.cnblogs.com/Alice-Thinker/p/8386387.html