自學javase的回顧(2/10)

weixin_47592060發表於2020-11-28

自學javase的回顧(2/10)

1. java資料型別和型別轉換

2. java進位制換算和字元編碼

3. java基本單位變數

4. java運算子

一. java資料型別和型別轉換

java資料型別

1)java資料型別分為基本資料型別和引用資料型別
A、基本資料型別包括八大基本資料型別
B、引用資料型別包括字串String,類class,介面interface,陣列array等

2)資料型別有什麼用???
1、會指導變數該分配多大的儲存空間。(資料字面值必須和變數資料型別一致,否則報錯)
2、決定了該資料是用於什麼使用方向的。
這裡注意1位元組= 8 bit
在這裡插入圖片描述

java基本型別轉換

1、 前提:在 java 中基本型別可以相互轉換,boolean 型別比較特殊不可以轉換成其他型別。
=號右邊是優先運算的,因此是等號右邊轉左邊,(系統預設整數資料打入都為int型別)

2、轉換分為自動轉換和強制轉換: 大資料型別 變數名 = 小資料型別字面值/變數名;
【1】自動轉換:容量小的型別會預設轉換為容量大的型別
� byte–>short–> int–>long–>float–>double
char–>

【2】強制轉換: 小資料型別 變數名 = (小資料型別)大資料字面值/變數名;
� 將容量大的型別轉換成容量小的型別,需要進行強制轉換
� 注意:只要不超出範圍可以將整型字面值值直接賦值給 byte,short,char(sun公司親兒子們有特權)
只有後面賦值為具體字面值,並且在資料型別圍內才可以不同強轉,如果是賦值變為變數無特權了,一樣需要強轉。

下面有兩段程式碼展示:好好理解,基礎打好,耐心冷靜

public class Shift
{    
	public static void main(String[]args){
		
		int b =32767;
		short a = (short)b;//可以打,但直接打short a = 32767;更快捷
		System.out.println(a);

		int x =32767;
		long y = x;//小轉大可以直接轉。。。。long    先看運算子等號右邊是優先算的,所以int轉long自動轉
		System.out.println(y);

        //預設int = 32768;
		byte d =(byte)32768;//同上,只是byte超了範圍要int強轉了,而且損失精度,結果已經不是32768,所以
		short f = d;//超了short也可以小轉大
		System.out.println(f);

		long p = 100L;//long轉比int小的型別也是直接轉因為int預設給了long,這裡為預設的int轉long
		byte k = (byte)p;//強轉先看等號右邊,因為優先順序是先算等號右邊線,這裡為long轉byte。
		System.out.println(k);


		short d = 666;//這裡有特權因為是字面值,並且沒超出自己範圍,下面一個反例就是超了自己範圍
		byte f = (byte)d;//無特權,因為不是字面值,賦值為變數就要恢復強轉機制
		System.out.println(f);

		        
		short m = 32768;//直接報錯,宣告已經違反了語法規則,可以超出自己範圍但要單行解決,並且損失精度.
		short n = (short)m;//糾正,直接short n =(short)32768,必須一行解決
		System.out.println(n);

		/*int i = 10;
		short a = i;這裡會報錯因為i 為int型別,特權只限字面值,語法上int和short不相等
		
		short a = 10;這裡要和上面區別開單單直接賦值有特權int預設轉short,但是上面語法有問題的。*/
public class Shift01//不同大小容量的資料型別轉換
{       //第一long i = 100L;                                  long x = 100L;
       //首先系統預設 100是int的字面值,屬於int轉long小轉大   int y = (int)x;屬於大轉小,long轉int         
   //小轉大自動直接轉,包括long i =100L;屬於自動轉。

  //大轉小除了long必強轉之外,chart,byte,short有特權,但“僅限於是單單後面字面值並且沒超範圍時候”
  //(不是字面值一樣加強轉符比如“①是後面賦值是字母變數,②超出自己範圍”),看下面反例12
//這三種型別公司規定在自己範圍內不用,超範圍就強轉,最好必須一行解決,下面有反例1
//大轉小,超小型別最大值,無特權,要加強轉符號(看下面反例3),而且精度一定損失。一般比較小的數不會,比如上面的100L不會
//大轉小,超大型別最大值,編譯直接報錯。(所以最好不要超大和小型別的最大值,不然一個損精一個報錯)
	//long x = 2147483648L;long轉int                       short y = (short)2147483648; int轉short  
	//int y =(int)x; 超過小型別int最大值,變成-2147483648。  超了大型別int最大值,編譯直接報錯gg。 
    
	public static void main(String[]args){
		//int = 32768;這裡有預設的一行,系統看到整數就預設32768是int了
		short i = (short)32768;//可以超自己範圍,但必須當行解決加符號即可,不用再加一行賦值的。
		//如果是short,byte,chart會預設轉,不用自己宣告int,宣告後反而麻煩,直接賦值即可,
		//大轉小超小型別最大值,精度一定損失。超大型別最大值,編譯報錯。(所以最好不要超大小型別的最大值)

        //int = 32767;預設的一行
		short x = 32767;//沒超自己範圍,那麼預設自己轉,不會損失精度
		
		System.out.println(i);
		System.out.println(x);


				   
        //以下為反例
		int d = 1000;//大轉小,這裡報錯short特權只侷限於字面值,語法上short不能等於int,所以當不是字面值時候就要老老實實加強轉符號
        short f = d;//,糾正:int d = 1000;  short f = (short)d;
		//糾正2直接打 short f = 1000(參考上面short x),因為系統預設了1000是int字面值,不用自己宣告
		System.out.println(f);

		short o = 666;//大轉小,這裡有特權因為是字面值,並且沒超出自己範圍,
		byte w = (byte)o;//這裡無特權,不是字面值的,精度損失了
        System.out.println(w);

        short y = 32767;//不算反例,不超範圍宣告和賦值可以分開,但要記住一定宣告是那個數字。
	    short z =(short)y;//參考上面的short i
		//或者是short y = (short)32767;更快捷而已
           System.out.println(z);

        short j = 32768;//直接報錯,超範圍必須當行轉,而且加強制符號
	    short k =(short)j;//糾正 short j = (short)32768;
		System.out.println(k);

        //預設int t = 32767;不算反例
		byte t =(byte)32767;//-1精度損失
		short u = t;//雖然32767超過了short最大值,但是精度損失變成-1,小轉大直接轉
		System.out.println(u);//這裡混合運算大轉小,小轉大,最後結果-1


		
	}
}

3、運算順序
【1】 byte、short、char 之間計算不會互相轉換,首先先轉換成 int
【2】多種型別混合運算過程中,首先先將所有資料轉換成容量最大的那種,再運算
【示例程式碼】

public class DataTypeTest06 {
public static void main(String[] args) {
//出現錯誤,1000 超出了 byte 的範圍
//byte a = 1000;
//正確,因為 20 沒有超出 byte 範圍
//所以賦值
byte a = 20;
//變數不能重名
//short a = 1000;

//正確,因為數值 1000 沒有超出 short 型別的範圍
//所以賦值正確
short b = 1000;
//正確,因為預設就是 int,並且沒有超出 int 範圍
int c = 1000;
//正確,可以自動轉換
long d = c;
//錯誤,出現精度丟失問題,大型別-->>小型別會出現問題
//int e = d;
//將 long 強制轉換成 int 型別
//因為值 1000,沒有超出 int 範圍,所以轉換是正確的
int e = (int)d;
//因為 java 中的運算會會轉成最大型別
//而 10 和 3 預設為 int,所以運算後的最大型別也是 int
//所以是正確的
int f = 10/3;
//宣告 10 為 long 型別
long g = 10;
//出現錯誤,多個數值在運算過程中,會轉換成容量最大的型別
//以下示例最大的型別為 double,而 h 為 int,所以就會出現大型別(long)到小型別(int)
//的轉換,將會出現精度丟失問題
//int h = g/3;
//可以強制轉換,因為運算結果沒有超出 int 範圍
//int h = (int)g/3;
//可以採用 long 型別來接收運算結果
//long h = g/3;
//出現精度損失問題,以下問題主要是優先順序的問題
//將 g 轉換成 int,然後又將 int 型別的 g 轉換成 byte,最後 byte 型別的 g 和 3 運算,那麼
//它的運算結果型別就是 int,所以 int 賦值給 byte 就出現了精度損失問題
//byte h = (byte)(int)g/3;

//正確
//byte h = (byte)(int)(g/3);
//不能轉換,還有因為優先順序的問題
//byte h = (byte)g/3;
//可以轉換,因為運算結果沒有超出 byte 範圍
//byte h = (byte)(g/3);
//可以轉換,因為運算結果沒有超出 short 範圍
short h = (short)(g/3);
short i = 10;
byte j = 5;
//錯誤,short 和 byte 運算,首先會轉換成 int 再運算
//所以運算結果為 int,int 賦值給 short 就會出現精度丟失問題
//short k = i + j;
//可以將運算結果強制轉換成 short
//short k = (short)(i + j);
//因為運算結果為 int,所以可以採用 int 型別接收
int k = i + j;
char l = 'a';
System.out.println(l);
//輸出結果為 97,也就是 a 的 ascii 值
System.out.println((byte)l);
int m = l + 100;
//輸出結構為 197,取得 a 的 ascii 碼值,讓後與 100 進行相加運算
System.out.println(m);
}
}

二. java進位制換算和字元編碼

1)進位制換算

1、在計算機內部,所有資訊都採用二進位制表示,每個二進位制由 0 和 1 兩種狀態,一個位元組有 8
位,也就是由 8 個 0 或 1 構成,如果 short型別的 6 在計算機中是如何儲存的,short 是兩個
位元組,那麼 short 6 的二進位制為:00000000 00000110,int 型別的 6 在計算機中儲存為 32 位:
00000000 00000000 00000000 00000110

2、
【1】簡單瞭解十進位制到二進位制的換算
規則:除 2 取餘,逆序輸出
如 10 進位制 6 二進位制換算方式為:
6/2=3 餘 0
3/2=1 餘 1
1/2=0 餘 1
將餘數逆序輸出就是 6 的二進位制表示:110,位數不夠補零

【2】簡單瞭解二進位制到十進位制的換算
規則:取出最後一位,從 2 的 0 次方開始乘,將得到的結果相加即可
如:二進位制的 110 的十進位制換算:
02 的 0 次方=0
1
2 的 1 次方=2
1*2 的 2 次方=4
110 的十進位制為:0+2+4=6

2)字元編碼

一、字元編碼分類和發展
1、ASCII 字元編碼 採用一個位元組編碼,主要針對英文編碼 ‘a’-97 ,‘A’-65
2、ISO-8859-1 有稱 latin-1,是國際化標準或組織 ISO 制定
的,主要為了西歐語言中的字元編碼,和ASCII 相容
3、GB2312/GBK/GB18030 主要是漢字編碼,三種編碼從容量上看是包
含關係
4、Unicode 如今Unicode統一了全世界上的所有文字編碼,
unicode 有幾種實現:UTF-8,UTF-16,UTF-32
【UTF-8 儲存格式(UTF8 主要就是為了節省空間)】

二、以下為Char 字元的測試

public class CharTest {
public static void main(String[] args) {
//不能採用雙引號宣告字元型別,必須採用單引號宣告字元型別
//char c1 = "a";
//宣告一個字元
char c1 = 'a';
//char 型別可以存放一個漢字,java 中的 char 使用 utf-16 編碼
//所以 char 佔用兩個位元組
char c2 = '中';
System.out.println(c1);
System.out.println(c2);
}
}

三、ps:字元’ a '和字串" a "區別?????????

1、資料型別不同:字元’a’是基本資料型別,字串“a”是引用資料型別。

2、佔用位元組大小不同:‘a’佔用2位元組," a “佔用4位元組。” a "字串包括了:字元’a’ + 隱含‘\0’這個字元,
因此" a "字串它有兩個字元組成。

3、運算方法不同,字元在進行運算時是當整數處理的,可以存在堆或者棧記憶體,
字串不能參與運算,字串本身是個地址,存放在方法區常量池。

三. java基本單位變數

1、變數本質是 java 中的一個最基本的單元,也就是記憶體中的一塊區域,Java 中的變數有四個
基本屬性:資料型別,變數名,儲存單元和變數值
� 變數的資料型別:可以是基本型別和引用型別(必須包含型別)
� 變數名:合法的識別符號,小寫見名知意。
� 儲存單元:儲存單元大小是由資料型別決定的,如:int 為 4 個位元組 32 位bit
� 變數值:在儲存單元中放的就是變數值(如果是基本型別放的就是具體值,如果是
引用型別放的是記憶體地址,如果 null,表示不指向任何物件,代表空指標)
變數的宣告格式:資料型別 +變數名 = 字面值;

2、變數分類:成員變數(例項+靜態) 和 區域性變數

3、變數注意點:
【1】區域性變數必須初始化,變數初始化的過程就是賦值,變數宣告後必須初始化。(成員變數有預設值)
【2】在同一作用域中,變數名不能重複,只能宣告一次,但變數名可以給予多次賦值。

四. java運算子

相關文章