java初學 變數、關鍵字
Java的關鍵字對java的編譯器有特殊的意義,他們用來表示一種資料型別,或者表示程式的結構等,關鍵字不能用作變數名、方法名、類名、包名。
備註:不必死記硬背,如果使用關鍵字作為識別符號,編譯器能提示錯誤。
goto 是java的保留關鍵字,意思是java並沒有使用goto,以後是否使用未定。
就是程式設計師在定義java程式時,自定義的一些名字,例如helloworld 程式裡關鍵字class 後跟的Demo,就是我們定義的類名。類名就屬於識別符號的一種。
識別符號除了應用在類名上,還可以用在變數、函式名、包名上。(要求同學們先記住,以後會詳細見到這些)。
- 識別符號由26個英文字元大小寫(a~zA~Z)、數字(0~9)、下劃線(_)和美元符號($)組成。
- 不能以數字開頭,不能是關鍵字
- 嚴格區分大小寫
- 識別符號的可以為任意長度
ComputeArea,radius,area $itcast _itcast gz_itcast
注意:由於Java嚴格區分大小寫,ITCAST 和itcast是完全不同的識別符號
- 包名
多個單片語成時所有字母小寫(例:package com.itcast)
- 類名和介面
多個單片語成時所有單詞的首字母大寫(例:HelloWorld)
- 變數名和函式名
多個單片語成時第一個單詞首字母小寫,其他單詞首字母大寫(例:lastAccessTime、getTime)。
- 常量名
多個單片語成時,字母全部大寫,多個單詞之間使用_分隔(例:INTEGER_CACHE)
注意:只是為了增加規範性、可讀性而做的一種約定,識別符號在定義的時候最 好見名知意,提高程式碼閱讀性。
通過註釋提高程式的可讀性,是java程式的條理更加清晰,易於區分程式碼行與註釋行。另外通常在程式開頭加入作者,時間,版本,要實現的功能等內容註釋,方便後來的維護以及程式設計師的交流。
1.單行註釋(line comment)用//表示,編譯器看到//會忽略該行//後的所文字
2.多行註釋(block comment)用/**/表示,編譯器看到/*時會搜尋接下來的*/,忽略掉/**/之間的文字。
3.文件註釋用/** */表示,是java特有的註釋,其中註釋內容可以被JDK提供的工具 javadoc 所解析,生成一套以網頁檔案形式體現的該程式的說明文件。
public static void main(String[] args) { // 第一步: 獲取半徑?並將半徑儲存在程式中 double radius = 5; // 第二步:計算面積,並將面積儲存在程式中 /* double area = radius * radius * 3.1415; // 第三步:在控制檯現實面積 System.out.println("半徑為" + radius + "的圓的面積為:" + area); */
} |
注意:多行註釋中可以巢狀單行註釋,多行註釋不能巢狀多行註釋。錯誤!!!
class Demo{ /* 這是主函式,是程式的入口 它的出現可以保證程式的獨立執行 /* 注意:多行註釋巢狀多行註釋是不行的。 */ */ public static void main(String[] args){ //這是輸出語句用於將括號內的資料列印到控制檯。 System.out.println("hello java"); } |
文件註釋 (編寫軟體說明書)
- 需要使用sum給我們提供的javadoc工具生成一個html的說明文件。
- 只能抽取public的屬性或者方法內容。
格式:
Javadoc –d 指定儲存文件的路徑 -version –author(可選) 目標檔案 |
@author 作者
@version 版本
@param 方法的引數
@return 返回值
註釋的使用細節:
三種註釋可以出現在程式的任何地方,但是不推薦找任意位置。
1. 程式設計習慣:
1. 給那條語句進行說明,註釋應該寫在該語句的旁邊。
2. 單行註釋一般寫在語句的後面多行註釋和文件註釋一般寫在語句的上面
注意:文件註釋只能出現在類、屬性、方法的上面。
- 註釋的巢狀
1.單行註釋可以在單行註釋裡面。
2.多行註釋不能巢狀在多行註釋裡面。
3 註釋的除錯作用:
1. 可以作為初學者的除錯方式。
2. 可以幫組初學者確定程式碼的錯誤之處。
常量是指在程式執行過程中其值不能改變的量。
Java中常量的分類:
整數常量 : 所有整數
小數常量 : 所有小數
布林常量 : 只有true和false
字元常量 :使用’’引起來的單個字元
字串常量 :使用“”引起來的字元序列,“” 、“a” 、” ”
null常量 : 只有一個值null
3.char 型別
char型別表示的是單個字元型別,任何資料使用單引號括起來的都是表示字元。字元只能有一個字元,比如:普通的老百姓穿上軍裝就是軍人。
注意:特殊字元的轉義序列:轉義字元
轉義字元的概述:
特殊字元使用”\”把其轉化成字元的本身輸出,那麼使用”\”的字元稱作為轉移字元。
需求:使用輸出語句,打印出帶引號的資訊例如輸出。
System.out.println("teacher said"java is fun"");編譯是無法正常通過的。語法有錯誤,編譯器讀到第二個引號就認為是字串的結束,剩餘的不知道怎麼處理。如何解決這個問題:java中使用轉義字元來表示特殊的字元。一個轉義字元以反斜槓(\)開始。
問題:想要列印帶引號的字串怎麼辦,就可以使用反斜槓(\)後跟字元,這個反斜槓就是轉義字元。
轉義字元 |
名稱 |
Unicode |
\b |
Backspace (退格鍵) |
\u0008 |
\t |
Tab (Tab鍵盤) |
\u0009 |
\n |
Linefeed (換行) |
\u000A |
\r |
Carriage Return(回車) |
\u000D |
\\ |
Backslash (反斜槓) |
\u005C |
\' |
Single Quote (單引號) |
\u0027 |
\" |
Double Quote (雙引號) |
\u0022 |
\r 表示接受鍵盤輸入,相當於按下回車。
\n 表示換行。
\t 製表符,相當於Table鍵
\b 退格鍵,相當於Back Space
\’ 單引號
\’’ 雙引號
\\ 表示一個斜跨
上述問問題解決:System.out.println("teacher said\"java is fun\"");
注意:換行符就是另起一行,回車符就是回到一行的開頭,所以我們平時編寫檔案的回車符應該確切來說叫做回車換行符
4. boolean 型別
boolean由數學家Geogore Boole 發明
boolean 型別用來儲存布林值,在java中布林值只有2個,true和false。
boolean flag=true; flag=false; |
Java中這8中基本資料型別都是小寫的。
進位制:進位制是一種記數方式 ,可以用有限的數字符號代表所有的數值。由特定的數值組成。
- 十進位制: 都是以0-9這九個數字組成,不能以0開頭。
- 二進位制: 由0和1兩個數字組成。
- 八進位制: 由0-7數字組成,為了區分與其他進位制的數字區別,開頭都是以0開始。
- 十六進位制:由0-9和A-F組成。為了區分於其他數字的區別,開頭都是以ox開始。
幾乎每個民族最早都使用都十進位制計數法,這是因為人類計數時自然而然地首先使用的是十個手指。 但是這不等於說只有十進位制計數法一種計數方法。例如,世界各國在計算年月日時不約而同地使用“十二進位制”12個月為一年又如:我國過去16兩才算為一斤,這就是“十六進計數法”,一個星期七天,這個就是”七進位制計演算法”。 計算機是由邏輯電路組成,邏輯電路通常只有兩個狀態,開關的接通與斷開,這兩種狀態正好可以用“1”和“0”表示。
如果要在計算機裡面儲存十進位制的7.
十進位制轉二進位制的轉換原理:除以2,反向取餘數,直到商為0終止。
二進位制轉十進位制的轉換原理:就是用二進位制的每一個乘以2的n次方,n從0開始,每次遞增1。然後得出來的每個數相加
存在問題:書寫特別長,不方便記憶。
二進位制在計算機內部使用是再自然不過的。但在人機交流上,二進位制有致命的弱點——數字的書寫特別冗長。例如,十進位制的100000寫成二進位制成為11000011010100000。為了解決這個問題,在計算機的理論和應用中還使用兩種輔助的進位制——八進位制和十六進位制。二進位制的三個數位正好記為八進位制的一個數位,這樣,數字長度就只有二進位制的三分之一,與十進位制記的數長度相差不多。例如,十進位制的100000寫成八進位制就是303240。十六進位制的一個數位可以代表二進位制的四個數位,這樣,一個位元組正好是十六進位制的兩個數位。十六進位制要求使用十六個不同的符號,除了0—9十個符號外,常用A、B、C、D、E、F六個符號分別代表(十進位制的)10、11、12、13、14、15。這樣,十進位制的100000寫成十六進位制就是186A0。
- 八進位制的特點
由數字0-7組成。即使用三個開關表示一個八進位制數。
10進位制轉換8進位制原理:就是用十進位制的數字不斷除於8,取餘數。
八進位制轉十進位制原理: 用把進位制的數不斷乘以8的n次方,n從0開始,每次遞增1。
除了這種方法之外,我們還有另一種方法,因為三個開關表示一個八進位制數。
十進位制與十六進位制之間的轉換
十六進位制特點:由0~9 a(10) b(11) c(12) d(13) e(14) f(15)組成。
十進位制轉十六進位制原理:就是不斷除以16,取餘數。
程式碼體現:
人使用的十進位制 、 計算機底層處理的資料是二進位制、八進位制、十六進位制,
那麼如果給計算機輸入不同的進位制資料呢?
- 變數的概述
用於儲存可變資料的容器。
- 變數存在的意義
計算機主要用於處理生活中的資料,由於生活中存在大量的可變資料,那麼計算機就必須具備儲存可變資料的能力。
比如:
1.時間每一秒都在發生變化,根據不同的時間要有不同的處理方式。
2.氣象站會根據溫度釋出天氣預報訊號。
- 變數的特點
正常情況下牛奶盒裝的都是牛奶,而且會根據牛奶的多少去決定要多大的容量的牛奶盒,A和B兩位同學同時把牛奶盒放進籃子裡面,但是需要區分兩個牛奶盒是誰的,都需要在牛奶盒上做一個標誌。
特點:
根據上述變數的特點,所以我們宣告一個變數的時候需要確定變數的大小,型別、名字三個特點:
錯誤: 1024byte temp = 1000000;
錯誤原因,java有自己的變數型別。
1. 整型
byte 代表一個位元組的大小 8bit 2(8) -128~127 256
short 代表兩個位元組的大小 16bit 2(16) -2(15)~2(15)-1
int 代表四個位元組的大小 32bit 2(32) -2(31)~2(31)-1
long 代表八個位元組的大小 64bit 2(64) -2(63)~2(63)-1
如果一個數值沒有采取特殊的處理,那麼該整數預設的型別是int。
可以使用數值後面新增L或小寫L改變預設的整數型別。
2. 浮點型
float 代表四個位元組的大小 32bit
double 代表八個位元組的大小 64bit
java程式中所有的小數預設的型別是double型別,所以需要使用特殊的符號改變預設的小數型別。
3. 字元型
char 代表兩個位元組的大小 16bit 2(16)
原理:將字元對映為碼錶中對應的十進位制資料加以儲存。
4. 布林型
boolean 佔一個位元組。只有true與false兩個值。
格式: 資料型別 變數名字1 , 變數名字2 ,……變數名字n ,; |
案例:
int i 聲明瞭一個整形的變數。
double d 聲明瞭一個double資料型別的變數
float f 聲明瞭一個float資料型別的變數。
備註:變數名的首字母都一般都是以小寫字母開始。
初始化方式1: 資料型別 變數名字 = 數值。
初始化方式2: 資料型別 變數名字 , 變數名字 = 數值。
案例:
方式1: double d = 3.14;
方式2: double d ; d = 3.14 ;
Java中可以進行不同資料型別的加減乘除運算嗎?是可以的。在算術運算子中已經體驗過如果兩個整數(int)相除會去掉小數部分。如果需要保留小數部分,可以讓除數或者被除數變為double型別的(5變為5.0)。其實Java是自動的將int的那個數變為了double型別了也就是Java自動的將整數變為了浮點數。例如5/2.0 其實是5.0/2.0
- 自動型別轉換(也叫隱式型別轉換)
可以將一個數賦值給更大數值範圍的變數,例如可以經byte 變數賦值給short變數可以將short變數賦值給int變數可以將int變數賦值給long變數。
Java內部其實做了工作就是自動將數值進行了型別提升,就叫做自動型別轉換(也叫隱式型別轉換)
byte b = 1; //00000001 short s = b; //00000000 00000001 int i = s; long lon = i; double d = lon; //1.0 |
自動型別轉換(也叫隱式型別轉換)
要實現自動型別的轉換,需要滿足兩個條件,第一兩種型別彼此相容,第二目標型別取
值範圍必須大於源型別。所有的數字型別,包括整形和浮點型彼此都可以進行轉換。
例如:
byte b=100; int x=b; System.out.println(x);//程式把b結果自動轉換為int型別。 |
- 強制型別轉換(也叫顯式型別轉換)
不可以將一個數值賦給範圍更小數值範圍的變數,除非進行型別轉換。
byte b = 100; b = b + 2; System.out.println(b); |
上述例子發生了什麼,發生了型別轉換。
b+2 遇到了加法運算,2預設是int型別,byte型別b變數儲存的值自動型別提升為
了int型別。執行完加法運算後的結果就是int型別,想要將int的型別值放入到byte型別變數b中,無法放入,編譯報錯。
byte b=1; b=(byte)(b+2); |
當兩種型別彼此不相容,或者目標型別取值範圍小於源型別(目標是byte源是int)
無法自動轉換,此時就需要進行強制型別轉換。
強制型別轉換需要注意:
損失精度!!!
int a=128; byte b=(byte)a; System.out.println(b);//-128 /* * 此時的強轉已經造成了數值的不準確 */ |
int
00000000 |
00000000 |
00000000 |
10000000 |
10000000 |
byte
再次分析此行程式碼
byte b = 100; b = b + 2; System.out.println(b); |
編譯:提示如下錯誤。
3、型別轉換的原理
可以把byte 理解為1兩的碗,short 2兩的碗,int 4兩的碗,long 8兩的碗。1兩碗的滿碗酒可以倒入 2兩 4兩 8兩的碗中。但是 4兩碗的酒倒入1兩碗的酒就有一些問題。
- 什麼時候要用強制型別轉換
比如小數部分只想保留整數部分.
一定要清楚要轉換的資料在轉換後資料的範圍內否則會損失精度.
public static void main(String[] args) { byte b = 100; b = (byte) (b + 2); System.out.println(b); // 102 //捨棄小數部分 double d=5.5; int num=(int)d; } |
- 表示式的資料型別自動提升
算術表示式,邏輯表示式
所有的byte型、short型和char的值將被提升到int型。
如果一個運算元是long型,計算結果就是long型;
如果一個運算元是float型,計算結果就是float型;
如果一個運算元是double型,計算結果就是double型。
分析 System.out.println(‘a’+1)結果?
自動型別提升
byte b = 3; int x = 4; x = x + b;// b會自動提升為int 型別參與運算。 System.out.println(x);// 7
|
強制型別轉換
byte b = 2; /* * 強制型別轉換,強制將b+2強制轉換為byte型別,再賦值給b */ b = (byte) (b + 2); System.out.println(b);// 4 |
思考1
byte b=126;
問:既然資料預設的有資料型別,那麼126 預設是int型別的,為什麼儲存到byte型別時不會報錯呢。
126 是常量java在編譯時期會檢查該常量(每個常量)是否超出byte型別的範圍。如果沒有可以賦值。
思考2:byte b=128;能否正常的編譯和執行。
該語句會出現編譯錯誤,128超出了byte變數的儲存範圍,所以出現編譯錯誤。
思考2
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪一句編譯失敗?為什麼?
b =3+4, 3和4都是常量,所以java在編譯時期會檢查該常量(每個常量)是否超出byte型別的範圍。如果沒有可以賦值。例如b=128+1 就無法編譯通過。b=127+1;也是無法通過。
b =b1+b2 不可以,因為b1 和b2 是變數,表示式求值時,變數值會自動提升為int型,表示式結果也就成了int型,這是要賦值給byte型的b,必須進行強制型別轉換了。
6、System.out.println(‘a’+1)結果
美國人為了讓計算機識別他們生活中的文字,讓二進位制表示生活中的文字.所以一個字母代表了一個二進位制.,二進位制也有十進位制的表現形式.,把生活中的字母都用數字來標識,例如97 代表a ,98 代表 b。列印’a’就把a作為輸出顯示,沒有疑問。但是 ‘a’+1 有加號涉及到了運算。根據java自動型別提升規則,同樣道理 char 提升為int 。就把’a’代表的數字體現了出來。a 表示的是97 97+1就是98; 那麼 想要檢視98 表示的char 是什麼 怎麼實現呢 ?就要用到剛才介紹的強制型別轉換了 System.out.println(char(‘a’+1));就取到了98 在ASCII碼錶中表示的字元。大寫A 和小寫a 在 ASCII有不同的表現。還有一個概念字元’1’ 在ASCII中 不是數字 1,可以執行程式碼檢視,到此就可以明白了char 型別,char型別也是可以參與運算的,為什麼可以參與運算呢。因為字元在ASCII表中都有對應的數字體現。所有的計算機相容ASCII。
System.out.println('a'+1); //98
System.out.println((char)('a'+1)); //b
補充問題:
int i='a'+'b'; System.out.println(i);//結果? System.out.println("hello"+'j'); //結果? |
總結:
所有數值運算子都可以用在char型資料上,如果另一個運算元是一個數字或者字元,那麼char會自動提升為int型,如果另一個運算元是字串,那麼字元就會和字串相連。
正負號(+,-)
除法
%取模
求餘數
取模的正負取決與被除數:
1. 自增
(++)前自增:先自增完畢,再運算整個表示式,語句分號前面的都是運算表示式;
後自增,先運算完整個表示式(分號前面的都是表示式),再進行自增;
備註:參與自增運算的操作資料每次會加1.
結論:
如果運算子在變數的前面,則該變數自增1或者自減1,然後返回的是變數的新值,如
果運算子在變數的後面,則變數也會自增或者自減1,但是返回的是變數原來的值。++在前就是先運算,再取值,++在後就是先取值,再運算。
自增自減運算子案例:
完成如下運算: 一; int i = 10; int newNum = 10 * i++; System.out.println(newNum);//? 二: int i = 10; int newNum = 10 * ++i;//? System.out.println(newNum); //? 一可以理解為 int i = 10; int newNum = 10 * i; i = i + 1; 二可以理解為 int i = 10; i = i + 1; int newNum = 10 * i;
|
練習:
- 使用程式判斷一個整數是偶數還是奇數
- 使用程式判斷假設今天是星期4,那麼問10天后的今天是星期幾?
- 將數值表示式使用java程式翻譯,並通過程式求出運算結果
其中int x=1;int y=2,int a=3,int b=4,int c=5;
案例一:
public static void main(String[] args) { // 判斷一個整數一奇數還是偶數 int x = -100; // 奇數是,1,3,5...偶數是2,4,6...顯然整數除2能整除,也就%(取模)結果為0就是偶數。 int result = x % 2; System.out.println(result); // 使用判斷語句進行判斷。 if (result == 0) { System.out.println(x + "是偶數"); } else { System.out.println(x + "是奇數"); } } |
方案二 使用判斷該數結果是否是奇數。
(但是該演算法有問題,如果被判斷的整數為負數是否有效?)
public static void main(String[] args) { // 判斷一個整數一奇數還是偶數 int x = 1; // 奇數是,1,3,5...偶數是2,4,6...顯然奇數%的結果為1. int result = x % 2; System.out.println(result); // 使用判斷語句進行判斷。 if (result == 1) { System.out.println(x + "是奇數"); } else { System.out.println(x + "是偶數"); } } |
改進
public static void main(String[] args) { // 判斷一個整數一奇數還是偶數 int x = -1; // 奇數是,1,3,5...偶數是2,4,6...顯然奇數%的結果為1. int result = x % 2; System.out.println(result); // 使用判斷語句進行判斷。 if (result != 0) { System.out.println(x + "是奇數"); } else { System.out.println(x + "是偶數"); } } |
案例三:判斷星期
public static void main(String[] args) { // 設定今天是星期1,用int 1表示星期一,0表示星期天 int today = 1; // 十天後是星期幾?,一個星期是7天,7天之後又是星期1,可以用? int future = (today+10) % 7; if (future == 0) { System.out.println("10天后是星期天"); } else { System.out.println("10天后是星期:" + future); }
} |
案例4:
int x = 1; int y = 2; int a = 3; int b = 4; int c = 5; int result = (3 + 4 * x) / 5 - 10 * (y - 5) * (a + b + c) / x + 9* (4 / x + (9 + x) / y); System.out.println(result); // 442 |
= , +=, -=, *=, /=, %=
運算子 |
運算 |
範例 |
結果 |
= |
賦值 |
a=3,b=2 |
a=3,b=2 |
+= |
加等於 |
a=3,b=3;a+=b; |
a=5,b=2; |
-= |
減等於 |
a=3,b=2,a-=b; |
a=1,b=2; |
*= |
乘等於 |
a=3,b=2,a*=b; |
a=6,b=2 |
/= |
除等於 |
a=3,b=2,a/=b; |
a=1,b=2; |
%= |
模等於 |
a=3,b=2,a%=b; |
a=1,b=2 |
a+=b 可以想象成 a=a+b;
變數宣告完了之後,可以使用賦值語句(assignment statement)給變數賦一個值,Java中使用等號(=)作為基本的賦值運算子(assignment operator),
格式如下:
variable = expression; 變數 = 表示式;
|
變數我們已經知道如何宣告,表示式具體如何定義?
表示式的定義:
表示式涉及到值(常量),變數和通過運算子計算出的值,以及他們組合在一起計算出的新值。
x =y+1;
例如:
public static void main(String[] args) { int x = 1; // 宣告int變數x, 賦值1給變數x int y = 0; // 宣告int變數y, 賦值0給變數y double ar |