數據類型在計算機語言裏面,是對內存位置的一個抽象表達方式,可以理解爲針對內存的一種抽象的表達方式。接觸每種語言的時候,都會存在數據類型的認識,有復 雜的、簡單的。各種數據類型都需要在學習初期去了解,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。
short:short也屬於整數類型,在存儲的時候,用2個字節存儲,範圍爲-32,768到32,767,在變量初始化的時候,short類型的默認值爲0,一般情況下,因爲Java本身轉型的原因,可以直接寫爲0。
long:long也屬於整數類型,在存儲的時候,用8個字節存儲,範圍爲-9,223,372,036,854,775,808到9,223,372,036, 854,775,807,在變量初始化的時候,long類型的默認值爲0L或0l,也可直接寫爲0。
byte:byte同樣屬於整數類型,在存儲的時候,用1個字節來存儲,範圍爲-128到127,在變量初始化的時候,byte類型的默認值也爲0。
float:float屬於實數類型,在存儲的時候,用4個字節來存儲,範圍爲32位IEEEE 754單精度範圍,在變量初始化的時候,float的默認值爲0.0f或0.0F,在初始化的時候可以寫0.0。
double:double同樣屬於實數類型,在存儲的時候,用8個字節來存儲,範圍爲64位IEEE 754雙精度範圍,在變量初始化的時候,double的默認值爲0.0。
char:char屬於字符類型,在存儲的時候用2個字節來存儲,因爲Java本身的字符集不是用ASCII碼來進行存儲,是使用的16位Unicode字符集,它的字符範圍即是Unicode的字符範圍,在變量初始化的時候,char類型的默認值爲'u0000'。
boolean:boolean屬於布爾類型,在存儲的時候不使用字節,僅僅使用1位來存儲,範圍僅僅爲0和1,其字面量爲true和false,而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版本以上可以通過編譯,而且不會報錯,運行結果如下輸出:
public class AutoBoxTester {
public static void main(String args[]){
Integer integer = new Integer(12);
int integer2 = 33;
System.out.println(integer.intValue() + integer2);
}
}