Java之資料型別,變數賦值
Java中的基礎資料型別(四類八種):
1.整數型 byte----使用byte關鍵字來定義byte型變數,可以一次定義多個變數並對其進行賦值,也可以不進行賦值。byte型是整型中所分配的記憶體空間是最少的,只分配1個位元組;取值範圍也是最小的,只在-128和127之間,在使用時一定要注意,以免資料溢位產生錯誤。
short----short型即短整型,使用short關鍵字來定義short型變數,可以一次定義多個變數並對其進行賦值,也可以不進行賦值。系統給short型分配2個位元組的記憶體,取值範圍也比byte型大了很多,在-32768和32767之間,雖然取值範圍變大,但是還是要注意資料溢位。
int----int型即整型,使用int關鍵字來定義int型變數,可以一次定義多個變數並對其進行賦值,也可以不進行賦值。int型變數取值範圍很大,在-2147483648和2147483647之間,足夠一般情況下使用,所以是整型變數中應用最廣泛的。
long----long型即長整型,使用long關鍵字來定義long型變數,可以一次定義多個變數並對其進行賦值,也可以不進行賦值。而在對long型變數賦值時結尾必須加上“L”或者“l”,否則將不被認為是long型。當數值過大,超出int型範圍的時候就使用long型,系統分配給long型變數8個位元組,取值範圍則更大,在-9223372036854775808和9223372036854775807之間。
2.浮點型 float----float型即單精度浮點型,使用float關鍵字來定義float型變數,可以一次定義多個變數並對其進行賦值,也可以不進行賦值。在對float型進行賦值的時候在結尾必須新增“F”或者“f”,如果不加,系統自動將其定義為double型變數。float型變數的取值範圍在1.4E-45和3.4028235E-38之間。
double---double型即雙精度浮點型,使用double關鍵字來定義double型變數,可以一次定義多個變數並對其進行賦值,也可以不進行賦值。在給double型賦值時,可以使用字尾“D”或“d”明確表明這是一個double型別資料,但加不加並沒有硬性規定,可以加也可以不加。double型變數的取值範圍在4.9E-324和1.7976931348623157E-308之間。
3.布林型 boolean(true, false):布林型別又稱邏輯型別,只有兩個值“true”和“false”,分別代表布林邏輯中的“真”和“假”。使用boolean關鍵字宣告布林型別變數,通常被用在流程控制中作為判斷條件。
4.字元型 char:char型既字元型別,使用char關鍵字進行宣告,用於儲存單個字元,系統分配兩個位元組的記憶體空間。在定義字元型變數時,要用單引號括起來,例如‘s’表示一個字元,且單引號中只能有一個字元,多了就不是字元型別了,而是字串型別,需要用雙引號進行宣告。
基礎資料型別變數和值全部存到棧,所以不能為空。
Java引用型別:
所有的類 所有的陣列 所有的介面
補充:Java堆疊:
棧(stack)與堆(heap)都是Java用來在Ram中存放資料的地方。與C++不同,Java自動管理棧和堆,程式設計師不能直接地設定棧或堆。 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的暫存器。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。另外,棧資料可以共 享。堆的優勢是可以動態地分配記憶體大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的資料。但缺點是,由於要 在執行時動態分配記憶體,存取速度較慢。
補充:Java中的運算子優先順序
Java中的變數的賦值:
1. 賦值不能超過資料型別的範圍
public class Test1
{
public static void main(String[] args){
//byte的範圍是-128~127
byte b=200;
}
}
注:在Java中,給整數變數賦值時,後面的值會先給一個int
2.強制型別轉換:
public class Test1
{
public static void main(String[] args){
//可以在值得前面寫一個(byte)讓他強制轉換
byte b=(byte)200;
System.out.println(b);
}
}
強制轉換為byte型別之後,因為200大於了byte型別的最大取值範圍127,所以會在從頭開始,也就是再從byte型別的最小值-128開始數(200-127)位,得出-56。
3.
public class Test1
{
public static void main(String[] args){
short s=123;
int i=50000;
s=i;
}
}
將i的值賦給s,型別不相容,int的最大值超過了short的最大的範圍
4.
public class Test1
{
public static void main(String[] args){
long i=888;
long l=88888888888;
}
}
88888888888沒有超過long的範圍,為什麼還是會報錯?因為將數字賦給一變數時,首先給他一個int型別,而8888888888超過了int的範圍所以報錯,應該在超出範圍的數字後面加一個l宣告,l不分大小寫。
public class Test1
{
public static void main(String[] args){
long i=888;
long l=88888888888l;
long k=88888888888L;
}
}
5.
public class Test1
{
public static void main(String[] args){
float f=12.345;
}
}
小數變數的值預設為double型,如果需要可以加f進行宣告:float f=12.345f; 。
double沒有問題。
6.
public class Test1
{
public static void main(String[] args){
char a=98;
System.out.println(a);
}
}
ASCII表:
public class Test1
{
public static void main(String[] args){
short s=123;
char a='a';
System.out.println(s+a);
}
}
在這樣的運算中,計算的是它們在ASCII表中的位置的值。
型別轉換優先順序:
char short byte 進行運算的時候,預設取值為int
顯式轉換:也叫作強制型別轉換,可能會導致精度丟失,精度由高到低,需要宣告
隱式轉換:精度由低到高,不需要宣告
變數賦值練習:
/*
int a = 1, b = 2, c = 3;
等價於
int a;
int b;
int c;
*/
int i = 1, j;
// 等價於
int i = 1;
int j;
float f1 = 0.1;
//0.1預設型別為double,應 float f1 = (float)0.1;
float f2 = 123;
long l1 = 12345678, l2 = 88888888888;
//l2的值超過了預設型別int的範圍
double d1 = 2e20, d2 = 124;
byte b1 = 1, b2 = 2, b3 = 129;
//b3的值超過了byte的範圍, 應用b3=(byte)129;
j = j + 10;
i = i / 10;
i = i * 0.1;
//應用 i = (int)(i * 0.1);
char c1 = 'a', c2 = 125;
byte b = b1 - b2;
//應改為 int b = b1 - b2; 或者 byte b =(byte) b1 - b2;
char c = c1 + c2 - 1;
// int c = c1 + c2 - 1; 或 char c = (char)(c1 + c2 - 1);
float f3 = f1 + f2;
float f4 = f1 + f2 * 0.1;
//double f4 = f1 + f2 * 0.1; 或 float f4 =(float)( f1 + f2 * 0.1);
double d = d1 * i + j;
float f = d1 * 5 + d2;
//同上
int a, b, c;
a = 2;
b = 'q';
c = 4;
char d = '5';
byte e;
e = a + b;
//e =(byte) a + b;
boolean f = true;
double g = 4.3;
g += b;
b += 0.3;
b = b + 0.3;
//b =(int) b + 0.3;
c += f ? 2 : 4;
float h = 12.5;
//float h =(float) 12.5;
float i = 14.5;
//同上
e = h + i;
e += h;
a += 2147483646;
float j = h / 0.5;
//float j =(float) h / 0.5;