1. 程式人生 > 其它 >二:變數、識別符號、保留字、變數

二:變數、識別符號、保留字、變數

技術標籤:Java基礎java

跳轉到總目錄

文章目錄

01、關鍵字與保留字

1、關鍵字(keyword)的定義和特點

  • 定義:被 Java 語言賦予了特殊含義,用做專門用途的字串(單詞)
  • 特點:關鍵字中所有字母都為小寫
  • 官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html


2、保留字(reserved word)

Java 保留字:現有 Java 版本尚未使用,但以後版本可能會作為關鍵字使用。自己命名識別符號時要避免使用這些保留字goto、const

02、識別符號

2.1、什麼是識別符號(Identifier)

  • Java 對各種變數、方法和類等要素命名時使用的字元序列稱為識別符號
  • 技巧:凡是自己可以起名字的地方都叫識別符號。

2.2、定義合法識別符號規則【重要】

  1. 由 26 個英文字母大小寫,0-9,_或$ 組成
  2. 數字不可以開頭。
  3. 識別符號不能包含空格。
  4. 不可以使用關鍵字和保留字,但能包含關鍵字和保留字。
  5. Java 中嚴格區分大小寫,長度無限制。

2.3、Java 中的名稱命名規範

1、Java 中的名稱命名規範:

  • 包名:多單片語成時所有字母都小寫:xxxyyyzzz
  • 類名、介面名:多單片語成時,**所有單詞的首字母大寫:**XxxYyyZzz
  • 變數名、方法名:多單片語成時,第一個單詞首字母小寫,第二個單詞開始每個單詞首字母大寫:xxxYyyZzz
  • 常量名所有字母都大寫。多單詞時每個單詞用下劃線連線:XXX_YYY_ZZZ

2、注意點

  • 注意 1:在起名字時,為了提高閱讀性,要儘量有意義,“見名知意”。
  • 注意 2:java 採用 unicode 字符集,因此識別符號也可以使用漢字宣告,但是不建議使用。
  • 更多細節詳見《程式碼整潔之道》

03、變數

3.1、變數的宣告與使用

1、變數的概念:

  • 記憶體中的一個儲存區域;
  • 該區域的資料可以在同一類型範圍內不斷變化;
  • 變數是程式中最基本的儲存單元。包含變數型別、變數名和儲存的值。

2、變數的作用:

  • 用於在記憶體中儲存資料。

3、使用變數注意:

  • Java 中每個變數必須先宣告,後使用;
  • 使用變數名來訪問這塊區域的資料;
  • 變數的作用域:其定義所在的一對{ }內;
  • 變數只有在其作用域內才有效;
  • 同一個作用域內,不能定義重名的變數;

4、宣告變數

  • 語法:<資料型別> <變數名稱>
  • 例如:int var;

5、變數的賦值

  • 語法:<變數名稱> = <值>
  • 例如:var = 10;

6、宣告和賦值變數

  • 語法:<資料型別><變數名>= <初始化值>
  • 例如:int var = 10

7、補充:變數的分類-按宣告的位置的不同

  • 在方法體外,類體內宣告的變數稱為成員變數
  • 在方法體內部宣告的變數稱為區域性變數

8、注意:二者在初始化值方面的異同:

  • 同:都有生命週期
  • 異:區域性變數除形參外,需顯式初始化。

3.2、基本資料型別

2、變數的分類-按資料型別

對於每一種資料都定義了明確的具體資料型別(強型別語言),在記憶體中分配了不同大小的記憶體空間。

3.2.1、整數型別:byte、short、int、long

  • Java 各整數型別有固定的表數範圍和欄位長度,不受具體 OS 的影響,以保證 java 程式的可移植性。
  • java 的整型常量預設為 int 型,宣告 long 型常量須後加‘l’或‘L’
  • java 程式中變數通常宣告為 int 型,除非不足以表示較大的數,才使用 long
型別佔用儲存空間表數範圍
byte1位元組=8bit位-128 ~ 127
short2位元組-2^15~ 2^15-1
int4位元組-2^31~ 2^31-1 (約21億)
long8位元組-2^63~ 2^63-1
  • 1MB = 1024KB 1KB= 1024B B= byte ? bit?
  • bit: 計算機中的最小儲存單位。byte:計算機中基本儲存單元。
/*
Java定義的資料型別

一、變數按照資料型別來分:
	基本資料型別:
		整型:byte \ short \ int \ long
		浮點型:float \ double
		字元型:char
		布林型:boolean

	引用資料型別:
		類:class
		介面:interface
		陣列:array

二、變數在類中宣告的位置:
		成員變數 vs 區域性變數
*/
class VariableTest1{
	public static void main(String[] args) {
		//1. 整型:byte(1位元組=8bit) short(2位元組) \ int (4位元組)\ long(8位元組)
		//① byte範圍:-128 ~ 127

		byte b1 = 12;
		byte b2 = -128;
	//	b2 = 128; //編譯不通過
		System.out.println(b1);
		System.out.println(b2);

		// ② 宣告long型變數,必須以“1”或“L”結尾
		short s1 = 128;
		int i1 = 12345;
		long l1 = 345678586;
		System.out.println(l1);
	}
}

3.2.2、浮點型別:float、double

  • 與整數型別類似,Java 浮點型別也有固定的表數範圍和欄位長度,不受具體作業系統的影響。
  • 浮點型常量有兩種表示形式:
    • 十進位制數形式:如:5.12 512.0f .512 (必須有小數點)
    • 科學計數法形式:如:5.12e2 512E2 100E-2
  • float:單精度,尾數可以精確到7位有效數字。很多情況下,精度很難滿足需求。
  • double:雙精度,精度是float的兩倍。通常採用此型別。
  • Java 的浮點型常量預設為double型,宣告float型常量,須後加‘f’或‘F’。
型別佔用儲存空間表數範圍
單精度float4位元組-3.403E38 ~ 3.403E38
雙精度double8位元組-1.798E308 ~ 1.798E308

3.2.3、字元型別:char

  • char 型資料用來表示通常意義上“字元”(2位元組)
  • Java中的所有字元都使用Unicode編碼,故一個字元可以儲存一個字母,一個漢字,或其他書面語的一個字元。
  • 字元型變數的三種表現形式:
    • 字元常量是用單引號(‘ ’)括起來的單個字元。例如:char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’;
    • Java中還允許使用轉義字元‘\’來將其後的字元轉變為特殊字元型常量。例如:char c3 = ‘\n’; //’\n’表示換行符
    • 直接使用Unicode值來表示字元型常量:‘\uXXXX’。其中,XXXX代表一個十六進位制整數。如:\u000a 表示\n。
  • char型別是可以進行運算的。因為它都對應有Unicode碼。
/*
Java定義的資料型別

一、變數按照資料型別來分:

	基本資料型別:
		整型:byte \ short \ int \ long
		浮點型:float \ double
		字元型:char
		布林型:boolean

	引用資料型別:
		類:class
		介面:interface
		陣列:array

二、變數在類中宣告的位置:
		成員變數 vs 區域性變數
*/
class VariableTest1{
	public static void main(String[] args) {
		//2. 浮點型:float(4位元組) \ double(8位元組)
		//① 浮點型,表示帶小數點的數值
		//② float表示數值的範圍比long還大

		double d1 = 12.3;
		System.out.println(d1 +1);
		
		//定義float型別變數時,變數要以"f" 或"F"結尾
		float f1 = 12.3F;
		System.out.println(f1);

		//② 通常,定義浮點型變數時,使用double變數

		//3. 字元型:char(1字元=2位元組)
		//① 定義char型變數,通常使用一對'' 
		char c1 = 'a';
		//編譯不通過
		//c1 = 'AB';
		System.out.println(c1);

		char c2 = '1';
		char c3 = '中';
		char c4 = '&';
		System.out.println(c2);
		System.out.println(c3);
		System.out.println(c4);

		//② 表示方式:1.宣告一個字元;2.轉義字元;3.直接使用Unicode值來表示字元型常量
		char c5 = '\n';	//換行符
		c5 = '\t';	//製表符
		System.out.print("hello" + c5);
		System.out.println("world");

		char c6 = '\u0123';
		System.out.println(c6);
		
		char c7 = '\u0043';
		System.out.println(c7);
	}
}

瞭解:ASCII 碼

  • 在計算機內部,所有資料都使用二進位制表示。每一個二進位制位(bit)有0 和1 兩種狀態,因此8個二進位制位就可以組合出256 種狀態,這被稱為一個位元組(byte)。一個位元組一共可以用來表示256 種不同的狀態,每一個狀態對應一個符號,就是256 個符號,從0000000 到11111111。
  • ASCII碼:上個世紀60年代,美國製定了一套字元編碼,對英語字元與二進位制位之間的關係,做了統一規定。這被稱為ASCII碼。ASCII碼一共規定了128個字元的編碼,比如空格“SPACE”是32(二進位制00100000),大寫的字母A是65(二進位制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個位元組的後面7位,最前面的1位統一規定為0。
  • 缺點:
    • 不能表示所有字元。
    • 相同的編碼表示的字元不一樣:比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel(ג)。

瞭解:Unicode 編碼

  • 亂碼:世界上存在著多種編碼方式,同一個二進位制數字可以被解釋成不同的符號。因此,要想開啟一個文字檔案,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。
  • Unicode:一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,使用Unicode 沒有亂碼的問題。
  • Unicode 的缺點:Unicode 只規定了符號的二進位制程式碼,卻沒有規定這個二進位制程式碼應該如何儲存:無法區別Unicode 和ASCII:計算機無法區分三個位元組表示一個符號還是分別表示三個符號。另外,我們知道,英文字母只用一個位元組表示就夠了,如果unicode統一規定,每個符號用三個或四個位元組表示,那麼每個英文字母前都必然有二到三個位元組是0,這對於儲存空間來說是極大的浪費。

瞭解:UTF-8

  • UTF-8 是在網際網路上使用最廣的一種Unicode 的實現方式。
  • UTF-8 是一種變長的編碼方式。它可以使用1-6 個位元組表示一個符號,根據不同的符號而變化位元組長度。
  • UTF-8的編碼規則:
    • 對於單位元組的UTF-8編碼,該位元組的最高位為0,其餘7位用來對字元進行編碼(等同於ASCII碼)。
    • 對於多位元組的UTF-8編碼,如果編碼包含n 個位元組,那麼第一個位元組的前n位為1,第一個位元組的第n+1 位為0,該位元組的剩餘各位用來對字元進行編碼。在第一個位元組之後的所有的位元組,都是最高兩位為"10",其餘6位用來對字元進行編碼。

3.3.4、布林型別:boolean

  • boolean 型別用來判斷邏輯條件,一般用於程式流程控制:
    • if條件控制語句;
    • while迴圈控制語句;
    • do-while迴圈控制語句;
    • for迴圈控制語句;
  • boolean型別資料只允許取值true和false,無null。
    • 不可以使用0或非0 的整數替代false和true,這點和C語言不同。
    • Java虛擬機器中沒有任何供boolean值專用的位元組碼指令,Java語言表達所操作的boolean值,在編譯之後都使用java虛擬機器中的int資料型別來代替:true用1表示,false用0表示。———《java虛擬機器規範8版》
class VariableTest1{
	public static void main(String[] args) {
		//4. 布林型:boolean
		//① 只能取兩個值之一:true 、false
		//② 常常在條件判斷、迴圈結構中使用
		boolean bb1 = true;
		System.out.println(bb1);

		boolean isMarried = true;
		if(isMarried){
			System.out.println("禁止入內!");
		}else{
			System.out.println("可以參觀!");
		}
	}
}

3.3、基本資料型別轉換

  • 自動型別轉換:容量小的型別自動轉換為容量大的資料型別。資料型別按容量大小排序為:
  • 有多種型別的資料混合運算時,系統首先自動將所有資料轉換成容量最大的那種資料型別,然後再進行計算。
  • byte,short,char之間不會相互轉換,他們三者在計算時首先轉換為int型別
  • boolean型別不能與其它資料型別運算
  • 當把任何基本資料型別的值和字串(String)進行連線運算時(+),基本資料型別的值將自動轉化為字串(String)型別
/*
基本資料型別之間的運算規則:

前提:這裡討論只是7中基本資料型別變數的運算。不包含boolean型別的。
1. 自動型別提升:
	當容量小的資料型別的變數和容量大的資料型別的變數做運算時,結果自動提升為容量大的資料型別。
	char、byte、short-->int-->long-->float-->double

	特別的:當byte、char、short三種類型的變數做運算時,結果為int型別

2. 強制型別轉換:
	
說明:此時容量大小指的是,表示數的範圍的大和小。比如:float容量要大於long的容量
*/
class VariableTest2{
	public static void main(String[] args) {
		byte b1 = 2;
		int i1 = 129;
		//編譯不通過
//		byte b2 = b1 + i1;
		int i2 = b1 + i1;
		long l1 = b1 + i1;
		System.out.println(i2);
		System.out.println(l1);

		float f = b1 + i1;
		System.out.println(f);
		//***************特別的**************************
		char c1 = 'a';	//97
		int i3 = 10;
		int i4 = c1 + i3;
		System.out.println(i4);

		short s2 = 10;
		//編譯錯誤
//		char c3 = c1 + s2;
		
		byte b2 = 10;
//		char c3 = c1 + b2;	//編譯不通過

//		short s3 = b2 + s2;	//編譯不通過
		
//		short s4 = b1 + b2;	//編譯不通過
	}
}
class VariableTest4{
	public static void main(String[] args){
		//1. 編碼情況
		long l = 123456;
		System.out.println(l);
		//編譯失敗:過大的整數
		//long l1 = 452367894586235;
		long l1 = 452367894586235L;

		//**************************
		//編譯失敗
//		float f1 = 12.3;
		
		//2. 編碼情況2:
		//整型變數,預設型別為int型
		//浮點型變數,預設型別為double型
		byte b = 12;
	//	byte b1 = b + 1;	//編譯失敗
		
	//	float f1 = b + 12.3;	//編譯失敗
	}
}

3.3、字串型別:String

  • String不是基本資料型別,屬於引用資料型別
  • 使用方式與基本資料型別一致。例如:String str= “abcd”;
  • 一個字串可以串接另一個字串,也可以直接串接其他型別的資料。例如:
/*
String型別變數的使用
1. String屬於引用資料型別
2. 宣告String型別變數時,使用一對""
3. String可以和8種基本資料型別變數做運算,且運算只能是連線運算;+
4. 運算的結果任然是String型別

*/
class StringTest{
	public static void main(String[] args){

		String s1 = "Good Moon!";

		System.out.println(s1);

		String s2 = "a";
		String s3 = "";

//		char c = '';	//編譯不通過
		
		//*******************************
		int number = 1001;
		String numberStr = "學號:";
		String info = numberStr + number;	//連線運算
		boolean b1 = true;
		String info1 = info + true;
		System.out.println(info1);
	}
}

練習1

String str1 = 4; //判斷對錯:no
String str2 = 3.5f + “”; //判斷str2對錯:yes
System.out.println(str2); //輸出:”3.5”
System.out.println(3+4+“Hello!); //輸出:7Hello!
System.out.println(“Hello!+3+4); //輸出:Hello!34
System.out.println(‘a’+1+“Hello!); //輸出:98Hello!
System.out.println(“Hello”+‘a’+1); //輸出:Helloa1

3.4、強制型別轉換

  • 自動型別轉換的逆過程,將容量大的資料型別轉換為容量小的資料型別。使用時要加上強制轉換符:(),但可能造成精度降低或溢位,格外要注意。
  • 通常,字串不能直接轉換為基本型別,但通過基本型別對應的包裝類則可以實現把字串轉換成基本型別。
  • 如:String a = “43”; inti= Integer.parseInt(a);
  • boolean型別不可以轉換為其它的資料型別。

練習2

判斷是否能通過編譯

short s = 5;
s = s-2; //判斷:no
byte b = 3;
b = b + 4;//判斷:no
b = (byte)(b+4);//判斷:yes
char c = ‘a’;
int i = 5;
float d = .314F;
double result = c+i+d; //判斷:yes
byte b = 5;
short s = 3;
short t = s + b;//判斷:no

04、進位制

4.1、進位制與進位制間的轉換

關於進位制

  • 所有數字在計算機底層都以二進位制形式存在。
  • 對於整數,有四種表示方式:
    • 二進位制(binary):0,1 ,滿2進1.以0b0B開頭。
    • 十進位制(decimal):0-9 ,滿10進1。
    • 八進位制(octal):0-7 ,滿8進1. 以數字0開頭表示。
    • 十六進位制(hex):0-9及A-F,滿16進1. 以0x0X開頭表示。此處的A-F不區分大小寫。如:0x21AF +1= 0X21B0
class BinaryTest{
	public static void main(String[] args){

		int num1 = 0b110;
		int num2 = 110;
		int num3 = 0127;
		int num4 = 0x110A;

		System.out.println("num1 = " + num1);
		System.out.println("num2 = " + num2);
		System.out.println("num3 = " + num3);
		System.out.println("num4 = " + num4);
	}
}

4.2、二進位制

  • Java整數常量預設是int型別,當用二進位制定義整數時,其第32位是符號位;當是long型別時,二進位制預設佔64位,第64位是符號位
  • 二進位制的整數有如下三種形式:
    • 原碼:直接將一個數值換成二進位制數。最高位是符號位
    • 負數的反碼:是對原碼按位取反,只是最高位(符號位)確定為1
    • 負數的補碼:其反碼加1。計算機以二進位制補碼的形式儲存所有的整數。
    • 正數的原碼、反碼、補碼都相同,負數的補碼是其反碼+1

為什麼要使用原碼、反碼、補碼錶示形式呢?

計算機辨別“符號位”顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與運算的方法. 我們知道, 根據運演算法則減去一個正數等於加上一個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了。

二進位制——》十進位制

原碼與反碼是幫助推匯出補碼而存在的!!!

十進位制——》二進位制

  • 對於正數來講:原碼、反碼、補碼是相同的:三碼合一。
  • 計算機底層都是使用二進位制表示的數值。
  • 計算機底層都是使用的數值的補碼儲存資料的。

4.3、進位制間轉化

十進位制二進位制互轉

  • 二進位制轉成十進位制乘以2的冪數
  • 十進位制轉成二進位制除以2取餘數

在這裡插入圖片描述

在這裡插入圖片描述

評個分吧!覺得文章寫行不錯就點個,覺得寫得好就一鍵三連!✌