我們知道Java是強類型語言,那么肯定對應的也就有弱類型語言,以下是強類型語言與弱類型語言的區別:
強類型語言:
強類型語言也就是強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,如果不經過轉換,那么該變量就永遠是此數據類型了。(如:定義一個整型變量叫“a”,程序也只會認為“a”這個變量是整型,並且不可能把它來當作字符來處理。)強類型語言也是類型安全的語言。
弱類型語言:
弱類型語言也就是同強類型語言相對的語言,也就是說它的數據類型是可以被忽略的語言。它與強類型語言定義的語言完全是相反的,它的一個變量可以被定義為多種數據類型,而且不用進行轉換。(如:定義一個變量“a”,這個“a”可以被賦值整型,又可以被賦值字符型,還可以被賦值為其他類型。)弱類型語言對應的是類型不安全的語言。
強類型語言在速度上可能會稍遜色於弱類型語言,但是強類型語言帶來的嚴謹性能夠有效的避免許多錯誤的發生。(另外,判斷一個語言是不是類型安全的與該語言是不是動態類型的沒有關系。)
(如:Java是靜態語言,是強類型語言(是類型安全的語言)。Python是動態語言,是強類型語言(是類型安全的語言)。JavaScript是動態語言,是弱類型語言(是類型不安全的語言)。)
Java中的數據類型:
Java中的數據類型分為兩類:
基本數據類型(Primitive Type)
引用數據類型(Reference Type)
基本數據類型:
基本類型共有八種,其中包括六種數值型與兩個非數值型。基本數據類型的信息如下:
數據類型 | 大小(單位:bit/位) | 所屬包裝類 | 最小范圍 | 最大范圍 |
byte | 8 | java.lang.Byte | -128 | +127 |
short | 2byte = 16 | java.langShort | -32768 | +32767 |
int | 4byte = 32 | java.lang.Integer | -2^31 | +2^31-1 |
long | 8byte = 64 | java.lang.Long | -2^63 | +2^63-1 |
float | 4buye = 32 | java.lang.Float | -3.4 * 10^38 | +3.4 * 10^38 |
double | 8byte = 64 | java.lang.Double | -1.7 * 10^308 | +1.7 * 10^308 |
char | 2byte = 16 | java.lang.Character | 0 | 65535 |
boolean | 所占大小不明確 | java.lang.Boolean | 只有"true"和"false"兩個取值 |
(注解:內存的存儲最小單位是“bit/位”,1byte/字節 = 8bit/位)
(注意:在Java中定義的八種基本數據類型中,除了其它七種類型都有明確的內存占用字節數外,boolean類型沒有給出明確的占用字節數,因為對虛擬機來說根本就不存在 boolean 這個類型,在虛擬機中boolean類型的值:false/true是用0/1來表示的,所以不確定。原因如下:)
大小為1bit:
boolean類型的值只有true和false兩種邏輯值,在編譯后會使用1和0來表示,這兩個數在內存中只需要1位(bit)即可存儲,位是計算機最小的存儲單位。
大小為1byte:
雖然編譯后1和0只需占用1位空間,但計算機處理數據的最小單位是1個字節,1個字節等於8位,實際存儲的空間是:用1個字節的最低位存儲,其他7位用0填補,如果值是true的話則存儲的二進制為:0000 0001,如果是false的話則存儲的二進制為:0000 0000。
大小為4byte:
來源是《Java虛擬機規范》一書中的描述:“雖然定義了boolean這種數據類型,但是只對它提供了非常有限的支持。在Java虛擬機中沒有任何供boolean值專用的字節碼指令,Java語言表達式所操作的boolean值,在編譯之后都使用Java虛擬機中的int數據類型來代替,而boolean數組將會被編碼成Java虛擬機的byte數組,每個元素boolean元素占8位”。這樣我們可以得出boolean類型占了單獨使用是4個字節,在數組中又是1個字節。
顯然第三條是更准確的說法,那虛擬機為什么要用int來代替boolean呢?為什么不用byte或short,這樣不是更節省內存空間嗎。使用int的原因是,對於當下32位的處理器(CPU)來說,一次處理數據是32位(這里不是指的是32/64位系統,而是指CPU硬件層面),具有高效存取的特點。所以boolean類型沒有給出精確的定義,《Java虛擬機規范》給出了4個字節,和boolean數組1個字節的定義,具體還要看虛擬機實現是否按照規范來,所以1個字節、4個字節都是有可能的。
整數類型:
Java中整數類型一般默認為int型,整型有四種表示形式:①二進制(鋒二進一)、②八進制(鋒八進一)、③十進制(也就是我們生活中所表達的類型,鋒十進一)、④十六進制(鋒十六進一);
(注意:十六進制從第十位開始就不是數字了,而是字母,如:10就為A,11為B,16為10,28為1C)
(注意:我們一般聲明整型時默認的就是十進制,若要聲明其他進制形式,需要在值的最前面加上特定的標識)
如:
byte a = 0b100; //聲明一個二進制byte型變量a,給定值為4(二進制為100),(二進制以0b標識) short b = 0100; //聲明一個八進制short型變量b,給定值為144(八進制為100),(八進制以0標識) int c = 0x100; //聲明一個十六進制int型變量c,給定值為400(十六進制為100),(十六進制以0x標識)
聲明一個byte型變量:
byte a = 1;
聲明一個short型變量:
short a = 22;
聲明一個int型變量:
int a = 123;
聲明一個long型變量:
(注意:若聲明了long類型,且該值在int范圍內,則后面可以不加“L”,否則需要在后面加上“L”)
long b = 5555555555555555L;
浮點類型:
Java中浮點類型一般默認為double型
float:單精度浮點(小數點后可精確到7位有效數字)
double:雙精度浮點(小數點后可精確到float的二倍有效數字)
聲明一個float型變量:
(注意:聲明float型需要在后面加上“f”或“F”)
float c = 3.14f; float d = 3.14F;
聲明一個double型的變量:
double e = 3.1415;
(注意:浮點類型存在舍入誤差,如果需要不產生誤差的小數類型用來精確計算可以使用java.math包下的BigDecimal類)
字符型:
我們知道Java中的字符是基於Unicode碼表的,所以字符型是用來表示Unicode編碼中的字符的,范圍在:“0 - 65535”,也就是說char也可以用數字來表示;
字符型在賦值的時候與其他類型有點區別,char作為單個字符型,在賦值時要加上單引號。
聲明一個char型變量:
char a = 'A';
布爾型:
boolean型只有兩個值,true(正確/真)和false(錯誤/假);一般用boolean來做判斷或者接收判斷結果;
聲明一個boolean型變量:
boolean flag = true; boolean boo = false;
引用數據類型:
引用類型分別有:
①類:具備某些共同特征的實體的集合,它是一種抽象的數據類型,它是對所具有相同特征實體的抽象。
定義一個類TestDemo:
public class TestDemo{ }
②接口:接口可以理解為:定義了一系列規范,在編寫程序的時候“必須”遵循接口所規定的所有要求。
定義一個接口TestInterface:
public interface TestInterface{ }
③數組:用於儲存多個相同類型數據的集合。
定義一個int型的數組:給定值“0,1,2”
int[] array = {0,1,2};
Java中也有字符串類型,而且與C/C++一樣都是String,只不過在Java中String(字符串類型)是作為一個類來實現的,也就是說,Java中String類型是屬於引用類型的,屬於類。
不過String類型在使用時並沒那么麻煩,String在聲明賦值時與char不同,因為是字符串,所以要帶雙引號。
聲明一個String型變量:
String str = "Hello";
可以這樣理解:只要不是基本數據類型的八種,以外的都是屬於引用數據類型的。