JAVA數據類型 數據長度

數據類型在計算機語言裏面,是對內存位置的一個抽象表達方式,可以理解爲針對內存的一種抽象的表達方式。接觸每種語言的時候,都會存在數據類型的認識,有復 雜的、簡單的。各種數據類型都需要在學習初期去了解,Java是強類型語言,所以Java對於數據類型的規範相對嚴格。數據類型是語言的抽象原子概念,可 以說是語言中最基本的單元定義,在Java裏面,本質上數據類型分爲兩種:簡單類型和複雜類型。

  簡單類型:簡單數據類型是不能簡化的、內置的數據類型、由編程語言本身定義,它表示了真實的數字、字符和整數。

  複雜類型:Java語言本身不支持C++中的結構(struct)或聯合(union)數據類型,它的複合數據類型一般都是通過類或接口進行構造,類提供了捆綁數據和方法的方式,同時可以針對程序外部進行信息隱藏。

  i.Java中的基本類型:

  1)概念:

  Java中的簡單類型從概念上分爲四種:實數、整數、字符、布爾值。但是有一點需要說明的是,Java裏面有八種原始類型,其列表如下:

  實數double、float

  整數byte、short、int、long

  字符char

  布爾值boolean

  複雜類型和基本類型的內存模型本質上不一樣,簡單數據類型的存儲原理:所有的簡單數據類型不存在“引用”概 念,簡單數據類型直接存儲在內存中的內存棧上,數據本身的值存儲在棧空間裏面,而Java語言裏面只有這八種數據類型是這種存儲模型;而其他的只要是繼承 於Object類的複雜數據類型都是按照Java裏面存儲對象的內存模型來進行數據存儲的,使用Java內存堆和內存棧來進行這種類型的數據存儲,簡單地 講,“引用”是存儲在有序的內存棧上的,而對象本身的值存儲在內存堆上的。

  2)原始類型特徵:

  Java的簡單數據講解列表如下:

  int:int整數類型,在存儲的時候,用4個字節存儲,範圍爲-2,147,483,648到2,147,483,647,在變量初始化的時候,int類型的默認值爲0

  shortshort也屬於整數類型,在存儲的時候,用2個字節存儲,範圍爲-32,76832,767,在變量初始化的時候,short類型的默認值爲0,一般情況下,因爲Java本身轉型的原因,可以直接寫爲0

  longlong也屬於整數類型,在存儲的時候,用8個字節存儲,範圍爲-9,223,372,036,854,775,8089,223,372,036, 854,775,807,在變量初始化的時候,long類型的默認值爲0L0l,也可直接寫爲0

  bytebyte同樣屬於整數類型,在存儲的時候,用1個字節來存儲,範圍爲-128127,在變量初始化的時候,byte類型的默認值也爲0

  floatfloat屬於實數類型,在存儲的時候,用4個字節來存儲,範圍爲32IEEEE 754單精度範圍,在變量初始化的時候,float的默認值爲0.0f0.0F,在初始化的時候可以寫0.0

  doubledouble同樣屬於實數類型,在存儲的時候,用8個字節來存儲,範圍爲64IEEE 754雙精度範圍,在變量初始化的時候,double的默認值爲0.0

  charchar屬於字符類型,在存儲的時候用2個字節來存儲,因爲Java本身的字符集不是用ASCII碼來進行存儲,是使用的16位Unicode字符集,它的字符範圍即是Unicode的字符範圍,在變量初始化的時候,char類型的默認值爲'u0000'

  booleanboolean屬於布爾類型,在存儲的時候不使用字節,僅僅使用1來存儲,範圍僅僅爲0和1,其字面量爲truefalse,而boolean變量在初始化的時候變量的默認值爲false

  ——[$]提供一個字面量賦值的例子——

package org.susan.java.basic;
public class AssignTester {
   public static void main(String args[]){
       int x,y;//定義x,y變量
       float f = 12.34f; //定義float類型的變量並賦值
       double w = 1.234;//定義double類型變量並且賦值
       boolean flag = true ; //指定變量flag爲boolean型,且賦初值爲true
       char c ; //定義字符型變量c
       String str ; //定義字符串變量str
       String str1 = " Hi " ; //指定變量str1爲String型,且賦初值爲Hi
       c = 'A' ; //給字符型變量c賦值'A'
       str = " bye " ; //給字符串變量str賦值"bye"
       x = 12 ; //給整型變量x賦值爲12
       y = 300; //給整型變量y賦值爲300
   }
}


  3)自動拆箱(AutoBox):

  Java裏面,每一種原始類型都對應着相應的包裝類型,在JDK1.5之前(不包含JDK1.5),當包裝類和原始類型進行相互轉換的時候,需要調用包裝類型的方法進行轉換,不能通過操作符進行直接的計算。下邊是一個原始類型和包裝類型的一個對應表:

原始類型 對應的包裝類型 默認值 存儲格式 數據範圍
short java.lang.Short 0 2個字節 -32,768到32767
int java.lang.Integer 0 4個字節 -2,147,483,648到2,147,483,647
byte java.lang.Byte
0 1個字節 -128到127
char java.lang.Character \u0000 2個字節 Unicode的字符範圍
long java.lang.Long 0L或0l 8個字節 -9,223,372,036,854,775,808到9,223,372,036, 854,775,807
float java.lang.Float 0.0F或0.0f 4個字節 32位IEEEE 754單精度範圍
double java.lang.Double 0.0或0.0D(d) 8個字節 64位IEEE 754雙精度範圍
boolean java.lang.Boolean false 1位 true(1)或false(0)

  簡單看看下邊這段代碼:

package org.susan.java.basic;
public class AutoBoxTester {
   public static void main(String args[]){
       Integer integer = new Integer(12);
       int integer2 = 33;
       System.out.println(integer + integer2);
   }
}

  這段代碼在JDK 1.5版本以上可以通過編譯,而且不會報錯,運行結果如下輸出:
45
   但是如果這段代碼在JDK 1.4上邊編譯就會有問題了,因爲在JDK 1.4的規範裏面Integer屬於一個包裝類型,而int是原始類型,如果一個包裝類型和原始類型要進行想對應的運算的時候,需要進行轉換操作,直接將 Integer類型轉換稱爲原始類型操作,否則二者是不允許相加的,可以試試將上邊代碼用1.4版本進行編譯:
javac -source 1.4 AutoBoxTester.java
  就會收到下邊的異常:
AutoBoxTester.java:5: operator + cannot be applied to java.lang.Integer,int
  System.out.println(integer + integer2);
  爲什麼呢?其實編譯器給的信息很明顯,使用JDK 1.5進行編譯可以直接通過而且不會報錯,是因爲JDK 1.5提供了自動拆箱和自動裝箱的功能,而JDK 1.4裏面如果要使得上邊的代碼段可以編譯通過,必須做一個簡單的修改:
public class AutoBoxTester {
   public static void main(String args[]){
       Integer integer = new Integer(12);
       int integer2 = 33;
       System.out.println(integer.intValue() + integer2);
   }
}


  改成上邊代碼段了過後,在JDK 1.4平臺下就可以得到輸出:
45
  從上邊的例子可以看出,在JDK 1.5之前,如果要針對包裝類進行數值計算,必須要將包裝類直接轉化稱爲原始類型,否則操作符本身是不會支持包裝類的操作的,但是在JDK 1.5以及以後就沒有這個限制了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章