1. 程式人生 > >java數據類型及運算符

java數據類型及運算符

數據 包括 另一個 範圍 優化 強類型 AR 引用 有效

1.數據類型:
Java語言是強類型語言,對於每一種數據都定義了明確的具體數據類型,在內存中分配了不同大小的內存空間
1.1數據類型的分類:
基本數據類型
引用數據類型:後面會介紹
下面介紹基本數據類型:四類八種
整數型
byte 占一個字節 -128----127
short 占兩個字 -2^15----2^15-1
int 占四個字節 -2^31----2^31-1
long 占八個字節 -2^63----2^63-1
浮點型
float 占四個字節 -3.403E38----3.403E38
double 占八個字節-1.798E308----1.798E308
字符型
char 占兩個字節 0----65535
布爾型
boolean
註意:賦值時候註意float類型,long類型
整數給long賦值時,數據後面加L
小數給float賦值時,數據後面加f
如下:
long x = 8888888888L;
float f = 12.3F;
整數默認的數據類型就是int類型
小數默認的數據類型是double

1.2變量的作用域:
就是該變量的有效使用範圍
這樣將變量分為:
局部變量
全局變量:就是定義在類中方法外的變量
局部變量:就是定義在方法中或方法上的變量

1.3數據類型轉換:
分為:
隱式轉換
強制轉換:強制將範圍大的數據類型轉為範圍小的數據
隱式轉換:取值範圍小的數據類型與取值範圍大的數據類型進行運算,會先將小的數據類型提升為大的,再運算,運算結果是後者

隱式轉換:
代碼如下看有沒問題:
int x = 3;
byte b = 4;
x = x + b;
System.out.println(x);
代碼解釋如下:
定義一個變量是int類型,賦值3
定義一個變量是byte類型,賦值4
計算兩者相加的結果,然後將值賦給int類型x
因為隱式轉換,變量b會先提升為int類型,這樣運算結果是7(int類型),賦值給int類型的x,沒問題
再看看下面代碼有沒問題:
int x = 3;
byte b = 4;
b = x + b;
System.out.println(b);
運算結果是7(int類型),賦值給byte類型的x,是賦值不了的,有問題,只有範圍小的數據類型可以賦值給範圍大的數據類型
樓上的代碼編譯會報錯

強制轉換:
格式:(數據類型)數據
int x = 3;
byte b = 4;
b = (byte)x + b;
System.out.println(b);
註意:
數據如果超出了被賦值的數據類型的取值範圍,得到的結果會出錯

下面面試題:
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
byte b4 = 3 + 4;
定義b3與b4有沒有問題?

在變量的運算過程中,只要是比int類型範圍小的數據類型(包括int)之間的運算,運算的時候都會提升為int(因為整數默認的數據類型是int),所以第一個計算結果int類型無法賦值給byte,是錯
誤的

第二個是常量的運算,java編譯器有常量優化機制,就是在編譯的時候就把3+4的結果計算出來了,顯然7是在byte類型的範圍內,所以是沒問題的

1.4數據範圍比較:
進行混合運算的時候,byte,short,char不會相互轉換,都會自動類型提升為int類型,其他類型進行混合運算的是小的數據類型提升為大的
範圍比較:
byte,short,char < int < long < float < double

看看下面代碼寫結果:
float f = 12.3f;
long x = 12345;
f = x;//隱式轉換long轉float
System.out.println(f);//輸出結果:12345.0

float f = 12.3f;
long x = 12345;
x = (long)f;//強制轉換
System.out.println(x);//輸出結果:12

1.5char類型參與運算:
char類型是可以參與+-運算的,可以在ASCII碼表中查到char類型對應的值,然後進行運算
看下面代碼:
System.out.println("hello"+‘a‘+1);//結果:helloa1,屬於字符串與其它數據類型運算,結果還是字符數
System.out.println(‘a‘+1+"hello");//結果:98hello,a對應97,按順序運算得結果

2.運算符及常見面試題
2.1看代碼寫結果:
System.out.println(10 / 3);
//整數相除結果只能是整數
System.out.println(10 / 3.0);
//如果想得到小數,把其中一個數變成小數,另一個數在運算的時候會自動類型提升
System.out.println(-5 % 2);
//%運算符結果的符號只和左邊有關系,與右邊無關
System.out.println(13 % -5);
結果:
3
3.3333333333333335
-1
3

2.2算術運算符++和--的用法:
單獨使用:
int a = 3;
a++;//a = a + 1;
System.out.println(a);
放在操作數的前面和後面效果一樣

參與運算:
看下面代碼:
int a = 3;
int b;
b = a++;//當++在變量後面的時候,會先將變量中的值取出做賦值操作,然後再自身加1
System.out.println("a = " + a);
System.out.println("b = " + b);
運算結果:
a = 4
b = 3

看下面代碼:
int a = 3;
int b;
b = ++a;//當++在變量前面的時候,會先自身加1,然後在將結果賦值
System.out.println("a = " + a);
System.out.println("b = " + b);
運算結果:
a = 4
b = 4

2.3面試題:
byte b = 10;
b++;
b = b + 1;
問哪句會報錯,為什麽?
b++;實際上等價於b = (byte)(b + 1),沒問題
實際上類似於b+=1;這種簡寫的運算符在內部都會作強制類型轉換處理,所以是沒問題的
b = b + 1;會報錯,上面已經分析過了

java數據類型及運算符