JAVA基本語法:資料型別
阿新 • • 發佈:2018-11-30
java使用兩種資料型別,對現實世界進行分類:
JAVA是強型別語言,對於每一種資料都定義了明確的具體資料型別,在記憶體中分配了不同大小的記憶體空間:JAVA中,整數的預設型別是int;小數的預設型別是double
1.基本資料型別:(四類八種)
整數類:byte short int long(存在四種整數型別的原因:根據記憶體的不同,合理分配記憶體空間)
小數類:float double(可能出現小數位不精確的現象)
字元類:char
注:char是關鍵字,並且屬於基本資料型別,使用單引號括住一個字元。而String屬於引用資料型別中的類,使用雙引號括住多個字元。在計算機中以ASCII碼/unicode碼等(以數字代替字元)來儲存字元。
布林類:boolean
2.引用資料型別:除了基本資料型別以外的所有型別
類class、陣列[ ]、介面interface
資料型別間的轉換:
預設轉換:
強制轉換:目標型別 變數名=(目標型別)(被轉換的資料);
注:布林型別不能轉為其它型別;byte,short,char相互之間不轉換,他們參與運算首先轉換為int型別。
相關注意事項:
不同資料型別的賦值要求:
/** 案例:使用8種資料型別定義變數 JAVA中,整數的預設型別是int;小數的預設型別是double。 */ class Demo01{ public static void main(String[] args){ /* 將int型別的123賦值給byte,也是把大型別的資料賦值給小型別,但不會賦值; 定義byte、short型別的變數只要右邊的整數數值在範圍內,就可以複製給byte、short */ byte a = 123; short b = 489; int c = 456; /* int類型範圍小於long型別,轉型是會自動在數值位補零。 加上L的原因是:可以對d賦超出int類型範圍的值。即告訴計算機以8個位元組儲存256。 */ long d = 256L; /* 報錯:從double轉換到float可能會有損失; 原因:這是一條賦值語句,是把等號右邊的值,賦值給等號左邊的變數,等號 */ float e = 1.2f; //小數的預設型別是double,新增f不會出現不相容的錯誤提示。 double f = 1.5; char g = 'c'; //字元有單引號括住,並且只能有一個字元 boolean m = true; }
資料型別間的運算:
/**
資料型別之間的運算:
byte,short,char型別是不能直接參與運算的,需要先轉成int型別。
預設轉換:byte,short,char—int—long—float—double
給byte,short賦值的時候,先看等號的右邊有沒有變數:
1.如果有變數,就按照上面的規則看右側範圍是否在左邊的範圍之內,若超過則會報錯。
2.如果都是常量,就看最終的結果是否在左邊的範圍之內,如果在就可以直接賦值。
*/
class DataTypeDemo3{
public static void main(String[] args){
byte b1 = 3,b2 = 4,b;
/*
錯誤:不相容的型別:從int轉換到byte可能會有損失
原因:b1,b2是變數,並且它的型別預設轉為int型別,此時int類型範圍
是大於byte的,而程式只有在解釋階段(java階段)才會知道變數的範圍,
因此在編譯階段會出現錯誤。
*/
b = b1 + b2;
b = 3 + 4; //正確,類似於byte b = 7;
float f = 12.4f;
/*
通過程式演示,發現可以把一個8位元組的long型別數值賦值給4個位元組的
float型別變數。主要原因是二者使用二進位制表示形式的不一致,因為
float的範圍是遠遠大於長整型long的
*/
float f1 = 134L;
float f2 = 120; //正確,int類型範圍小於float
float f3 = 120.0; //錯誤,double型別的範圍大於float,需要改寫成120.0f
}
}
基本型別中的char型別:
char型別直接列印,用的是它所代表的字元。char型別參與運算,用的是他底層的編碼。
/**
ASCII 美國首先編寫的,只用到了0-127。ASCII碼佔用了1byte 0-255 -->使用數字代表字元
(前32個字元實際是沒有意義的,主要是列印的時候使用)
GBK碼->GB2312碼->GB18320碼,中國編寫的,主要存中文字元。英文/數字 1個位元組;中文 2個位元組
ISO:國際標準化組織。將各個國家編的碼錶統一在了一起,unicode(萬國碼/字符集) 佔用2個位元組
由於unicode佔用2個位元組,而英文只佔用1個位元組。在使用unicode編寫英文時會浪費資源。
因此在unicode的基礎上出現了另外一些碼錶:
--- utf-8(可變位元組數來表示字元) 英文/數字 1個位元組;中文 3個位元組
--- utf-16
Big5:臺灣地區使用。
char的預設值為"\u0000",\u表示使用unicode編碼,本質上代表0,表現形式是空格。需要注意的是ASCII碼有表示空格的數字
char佔兩個位元組(0-65535),使用unicode編碼。
*/
class DataTypeDemo4{
public static void main(String[] args){
//char型別直接列印,用的是它所代表的字元。char型別參與運算,用的是他底層的編碼。
char ch1 = 'a';
System.out.println(ch1);
System.out.println(ch1+1);
char ch2 = 98;
System.out.println(ch2);
char ch3 = '\u0063'; //"\u"後面是4位的十六進位制,即99
System.out.println(ch3); //c
}
}
字串、字元與整數的計算:
/**
+ : 正號;加法運算;字串的拼接。
要注意運算的順序:從左到右依次運算,有括號的先算括號裡的。(先算乘除,後算加減)
String和任意型別做加法,得到的都是String,值就是拼接後的結果
java不同於C++,布林型別不能和其它基本資料型別做運算。即java中的true不代表1。
*/
class DataTypeDemo5{
public static void main(String[] args){
int a = +10;
System.out.println('a'); //a
System.out.println('a' + 1); //98
System.out.println("hello" + 'a' + 1); //helloa1
System.out.println('a' + 1 + "hello"); //98hello
System.out.println("5+5=" + 5 + 5); //5+5=55
System.out.println("5+5=" + (5+5)); //5+5=10
System.out.println(5 + 5 +"=5+5"); //10=5+5
//System.out.println(true + '1'); //錯誤:二元運算子‘+’的操作型別錯誤
System.out.println(true + "1"); //true1
}
}
強制型別轉換:
/**
強制型別轉換的格式:目標型別 變數名 = (目標型別)常量/變數;
基本資料型別:除了boolean型別以外,其它7種類型都可以相互轉換;
一般是在把大型別轉成小型別的時候使用強制型別轉換。
引用資料型別:也可以使用強制型別轉換,但必須具備子父類的關係。
*/
class ForceTypeTransform{
public static void main(String[] A){
int a = 10;
long b = a; //預設型別轉化:byte,short,char—int—long—float—double
System.out.println(b);
long c = 10;
//int d = c; //錯誤:不相容的型別,從long轉換到int可能會有損失
int d = (int)c; //強制型別轉換
byte by = (byte)130;
System.out.println(by) //結果是-126
}
}
上述程式碼中130>byte的範圍,對他強制轉型後等於-126。原理如下: