java 基本数据类型



1. Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。8 中类型表示范围如下:  
2.   
3. byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。  
4.   
5. short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。  
6.   
7. int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。  
8.   
9. long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。  
10.   
11. float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。  
12.   
13. double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。  
14.   
15. boolean:只有true和false两个取值。  
16.   
17. char:16位,存储Unicode码,用单引号赋值。  
18.   
19. Java决定了每种简单类型的大小。这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是Java程序具有很强移植能力的原因之一。  
20. <p>Java基本类型存<strong><span style="color:#FF0000;">储在栈中</span></strong>,因此它们的存取速度要快于存储在堆中的对应包装类的实例对象。从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。</p><p>基本类型的优势:数据存储相对简单,运算效率比较高</p><p>包装类的优势:有的容易,比如集合的元素必须是对象类型,满足了java一切皆是对象的思想</p>



1. Java有 5种引用类型(对象类型):类 接口 数组 枚举 标注  
2.   
3. 引用类型:底层结构和基本类型差别较大  
4.   
5. JVM的内存空间:  
6. (1). Heap 堆空间:分配对象 new Student()  
7.   
8. (2). Stack 栈空间:临时变量 Student stu  
9.   
10. (3).Code 代码区 :类的定义,静态资源 Student.class  
11.   
12. eg:Student stu = new Student(); //new 在内存的堆空间创建对象  
13.   
14. stu.study(); //把对象的地址赋给stu引用变量  
15.   
16. 上例实现步骤:  
17. class 到Code区  
18.   
19. new Student()在堆空间分配空间并创建一个Student实例  
20.   
21.      c.将此实例的地址赋值给引用stu, 栈空间


More differences:


基本数据类类型存的是数值本身,而引用类型变量在内存放的是数据的引用,并不是数据的本身,引用类型变量是以间接方式去获取数据。引用类型变量都属于对象类型,如:数组、类、字符串等都属于引用类型变量。所以,引用类型变量里面存放的是数据的地址。


对于 引用变量的比较一般是有两个不同的方法

1)比较两个变量是不是指向同一个对象,此时,需要比较 a b 中的地址是不是执行同一个值 ,因为此时比较的是 a b 中的地址值,要用  ==

2)比较 a b 分别对应不同的对象,此时 a b 中的地址 一定是不同的了 ,此时比较的是对象的值 ,因此这里的比较只能用equals

从内存上说

基本类型:

基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值。

引用类型:

是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。 

举例说明:   

int  a;  
 a=250; //声明变量a的同时,系统给a分配了空间。引用类型就不是了,只给变量分配了引用空间,数据空间没有分配,因为谁都不知道数据是什么,整数,字符?我们看一个错误的例子:
MyDate today;
today.day = 4; //发生错误,因为today对象的数据空间未分配。
那我们怎么给它赋值?引用类型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问。举个例子:
MyDate today;            //将变量分配一个保存引用的空间
today = new MyDate();     //这句话是2步,首先执行new MyDate(),给today变量开辟数据空间,然后再执行赋值操作
//引用变量赋值
MyDate a,b;                    //在内存开辟两个引用空间
a  =  new MyDate();     //开辟MyDate对象的数据空间,并把该空间的首地址赋给a
b  =  a;                               //将a存储空间中的地址写到b的存储空间中

如下图示

java基本数据类型长度 java数据类型范围_数据

引用传递 和 值传递

引用类型:除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。

值传递:基本类型的传递都属于值传递,和C语言一样,当把Java的基本数据类型(如 int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函 数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值 传递"。


/*define a class*/
class MyDate{
    String  Year;
    String  Month;
    String  Day;
    String  Date;
    public MyDate(){
        Year = "1900";
        Month ="01";
        Day = "01";
        Date = Year + "." + Month + "."+ Day;
    }
     public String toString(){
        return Date;
    }   
}

public class ObjRef{  
   MyDate mydate1 = new MyDate();
   MyDate mydate2 = mydate1;// = 使 mydate1和 mydate2将指向同一内存空间
   //MyDate mydate2 = new MyDate();//从新new一个对象,则mydate1和mydate2是指向不同的内存空间的:
                                  //引用空/间和数据空间都不一样
   public void changeObj(MyDate inObj){
        inObj.Date = "2007.09.26";
    }
      
    public static void main(String[] args) {
        ObjRef oRef = new ObjRef();
        System.out.println("Before call changeObj() method: " + oRef.mydate1);
        oRef.changeObj(oRef.mydate1);
        System.out.println("After call changeObj() method: " + oRef.mydate1);
        System.out.println("After call changeObj() method: " + oRef.mydate2);//验证“= mydate1和 mydate2将指向同一内存空间“这一结论
      
    }
}