1 關鍵字
1.1 關鍵字的概述
Java的關鍵字對java的編譯器有特殊的意義,他們用來表示一種資料類型,或者表示程式的結構等,關鍵字不能用作變量名、方法名、類名、包名。
1.2 常見的關鍵字
備注:不必死記硬背,如果使用關鍵字作為辨別符,編譯器能提示錯誤。
goto 是java的保留關鍵字,意思是java并沒有使用goto,以後是否使用未定。
2 辨別符
2.1 什麼是辨別符
就是程式員在定義java程式時,自定義的一些名字,例如helloworld 程式裡關鍵字class 後跟的Demo,就是我們定義的類名。類名就屬于辨別符的一種。
辨別符除了應用在類名上,還可以用在變量、函數名、包名上。(要求同學們先記住,以後會詳細見到這些)。
2.2 辨別符必須遵循以下規則
辨別符由26個英文字元大小寫(azAZ)、數字(0~9)、下劃線(_)和美元符号($)組成。
不能以數字開頭,不能是關鍵字
嚴格區分大小寫
辨別符的可以為任意長度
2.3 辨別符案例
2.3.1 合法的辨別符
ComputeArea,radius,area $itcast _itcast gz_itcast
注意:由于Java嚴格區分大小寫,ITCAST 和itcast是完全不同的辨別符
2.3.2 非法辨別符
class (關鍵字)
100java(不能以數字開頭)
Hello java (空格不是組成辨別符的元素)
2.3.3 Java中的辨別符命名規範
包名
多個單詞組成時所有字母小寫(例:package com.itcast)
類名和接口
多個單詞組成時所有單詞的首字母大寫(例:HelloWorld)
變量名和函數名
多個單詞組成時第一個單詞首字母小寫,其他單詞首字母大寫(例:lastAccessTime、getTime)。
常量名
多個單詞組成時,字母全部大寫,多個單詞之間使用_分隔(例:INTEGER_CACHE)
注意:隻是為了增加規範性、可讀性而做的一種約定,辨別符在定義的時候最 好見名知意,提高代碼閱讀性。
3.注釋
3.1 注釋的作用
通過注釋提高程式的可讀性,是java程式的條理更加清晰,易于區分代碼行與注釋行。另外通常在程式開頭加入作者,時間,版本,要實作的功能等内容注釋,友善後來的維護以及程式員的交流。
3.2 注釋的種類
1.單行注釋(line comment)用//表示,編譯器看到//會忽略該行//後的所文本
2.多行注釋(block comment)用//表示,編譯器看到/時會搜尋接下來的/,忽略掉//之間的文本。
3.文檔注釋用/** */表示,是java特有的注釋,其中注釋内容可以被JDK提供的工具 javadoc 所解析,生成一套以網頁檔案形式展現的該程式的說明文檔。
‘’‘java
public static void main(String[] args) {
// 第一步: 擷取半徑?并将半徑儲存在程式中
double radius = 5;
// 第二步:計算面積,并将面積儲存在程式中
/*
double area = radius * radius * 3.1415;
// 第三步:在控制台現實面積
System.out.println(“半徑為” + radius + “的圓的面積為:” + area);
*/
}
‘’’
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(可選) 目标檔案
![在這裡插入圖檔描述](https://img-blog.csdn.net/20181002210629641?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNTU0MDA3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
@author 作者
@version 版本
@param 方法的參數
@return 傳回值
注釋的使用細節:
三種注釋可以出現在程式的任何地方,但是不推薦找任意位置。
程式設計習慣:
1. 給那條語句進行說明,注釋應該寫在該語句的旁邊。
單行注釋一般寫在語句的後面多行注釋和文檔注釋一般寫在語句的上面
注意:文檔注釋隻能出現在類、屬性、方法的上面。
2 注釋的嵌套
1.單行注釋可以在單行注釋裡面。
2.多行注釋不能嵌套在多行注釋裡面。
3 注釋的調試作用:
1. 可以作為初學者的調試方式。
2. 可以幫組初學者确定代碼的錯誤之處。
4 常量
4.1 常量的概述
常量是指在程式運作過程中其值不能改變的量。
4.2 常量類型
Java中常量的分類:
整數常量 : 所有整數
小數常量 : 所有小數
布爾常量 : 隻有true和false
字元常量 :使用’’引起來的單個字元
字元串常量 :使用“”引起來的字元序列,“” 、“a” 、” ”
null常量 : 隻有一個值null
4.3.char 類型
char類型表示的是單個字元類型,任何資料使用單引号括起來的都是表示字元。字元隻能有一個字元,比如:普通的老百姓穿上軍裝就是軍人。
注意:特殊字元的轉義序列:轉義字元
轉義字元的概述:
特殊字元使用”\”把其轉化成字元的本身輸出,那麼使用”\”的字元稱作為轉移字元。
需求:使用輸出語句,列印出帶引号的資訊例如輸出。
System.out.println(“teacher said"java is fun”");編譯是無法正常通過的。文法有錯誤,編譯器讀到第二個引号就認為是字元串的結束,剩餘的不知道怎麼處理。如何解決這個問題:java中使用轉義字元來表示特殊的字元。一個轉義字元以反斜杠(\)開始。
問題:想要列印帶引号的字元串怎麼辦,就可以使用反斜杠(\)後跟字元,這個反斜杠就是轉義字元。
\r 表示接受鍵盤輸入,相當于按下回車。
\n 表示換行。
\t 制表符,相當于Table鍵
\b 倒退鍵,相當于Back Space
\’ 單引号
\’’ 雙引号
\ 表示一個斜跨
上述問問題解決:System.out.println(“teacher said"java is fun”");
注意:換行符就是另起一行,回車符就是回到一行的開頭,是以我們平時編寫檔案的回車符應該确切來說叫做回車換行符
4.4. boolean 類型
boolean由數學家Geogore Boole 發明
boolean 類型用來存儲布爾值,在java中布爾值隻有2個,true和false。
boolean flag=true;
flag=false;
Java中這8中基本資料類型都是小寫的。
5 進制的轉換
進制:進制是一種記數方式 ,可以用有限的數字元号代表所有的數值。由特定的數值組成。
5.1 整型的表現形式
十進制: 都是以0-9這九個數字組成,不能以0開頭。
二進制: 由0和1兩個數字組成。
八進制: 由0-7數字組成,為了區分與其他進制的數字差別,開頭都是以0開始。
十六進制:由0-9和A-F組成。為了區分于其他數字的差別,開頭都是以ox開始。
5.2 進制的由來
幾乎每個民族最早都使用都十進制計數法,這是因為人類計數時自然而然地首先使用的是十個手指。 但是這不等于說隻有十進制計數法一種計數方法。例如,世界各國在計算年月日時不約而同地使用“十二進制”12個月為一年又如:我國過去16兩才算為一斤,這就是“十六進計數法”,一個星期七天,這個就是”七進制計算法”。 計算機是由邏輯電路組成,邏輯電路通常隻有兩個狀态,開關的接通與斷開,這兩種狀态正好可以用“1”和“0”表示。
如果要在計算機裡面儲存十進制的7.
5.2.1 十進制與二進制之間的轉換
十進制轉二進制的轉換原理:除以2,反向取餘數,直到商為0終止。
二進制轉十進制的轉換原理:就是用二進制的每一個乘以2的n次方,n從0開始,每次遞增1。然後得出來的每個數相加
存在問題:書寫特别長,不友善記憶。
5.2.2 十進制與八進制之間轉換
八進制的由來
二進位制在計算機内部使用是再自然不過的。但在人機交流上,二進位制有緻命的弱點——數字的書寫特别冗長。例如,十進位制的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,取餘數。
代碼展現:
人使用的十進制 、 計算機底層處理的資料是二進制、八進制、十六進制,
那麼如果給計算機輸入不同的進制資料呢?
6 變量
6.1 變量的概述
變量的概述
用于存儲可變資料的容器。
變量存在的意義
計算機主要用于處理生活中的資料,由于生活中存在大量的可變資料,那麼計算機就必須具備存儲可變資料的能力。
比如:
1.時間每一秒都在發生變化,根據不同的時間要有不同的處理方式。
2.氣象站會根據溫度釋出天氣預報信号。
變量的特點
正常情況下牛奶盒裝的都是牛奶,而且會根據牛奶的多少去決定要多大的容量的牛奶盒,A和B兩位同學同時把牛奶盒放進籃子裡面,但是需要區分兩個牛奶盒是誰的,都需要在牛奶盒上做一個标志。
特點:
必須要有大小
存儲一定格式的可變資料
必須要有名字
6.2 變量的聲明
根據上述變量的特點,是以我們聲明一個變量的時候需要确定變量的大小,類型、名字三個特點:
錯誤: 1024byte temp = 1000000;
錯誤原因,java有自己的變量類型。
6.2.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改變預設的整數類型。
浮點型
float 代表四個位元組的大小 32bit
double 代表八個位元組的大小 64bit
java程式中所有的小數預設的類型是double類型,是以需要使用特殊的符号改變預設的小數類型。
字元型
char 代表兩個位元組的大小 16bit 2(16)
原理:将字元映射為碼表中對應的十進制資料加以存儲。
布爾型
boolean 占一個位元組。隻有true與false兩個值。
6.2.2 變量的聲明
格式: 資料類型 變量名字1 , 變量名字2 ,……變量名字n ,;
案例:
int i 聲明了一個整形的變量。
double d 聲明了一個double資料類型的變量
float f 聲明了一個float資料類型的變量。
備注:變量名的首字母都一般都是以小寫字母開始。
6.2.3 變量的初始化
6.2.4 變量的初始化方式
初始化方式1: 資料類型 變量名字 = 數值。
初始化方式2: 資料類型 變量名字 , 變量名字 = 數值。
方式1: double d = 3.14;
方式2: double d ; d = 3.14 ;
7 java資料類型的轉換
Java中可以進行不同資料類型的加減乘除運算嗎?是可以的。在算術運算符中已經體驗過如果兩個整數(int)相除會去掉小數部分。如果需要保留小數部分,可以讓除數或者被除數變為double類型的(5變為5.0)。其實Java是自動的将int的那個數變為了double類型了也就是Java自動的将整數變為了浮點數。例如5/2.0 其實是5.0/2.0
1、 自動類型轉換(也叫隐式類型轉換)
可以将一個數指派給更大數值範圍的變量,例如可以經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類型。
2、 強制類型轉換(也叫顯式類型轉換)
不可以将一個數值賦給範圍更小數值範圍的變量,除非進行類型轉換。
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兩碗的酒就有一些問題。
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;
}
2、 表達式的資料類型自動提升
算術表達式,邏輯表達式
所有的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型,如果另一個操作數是字元串,那麼字元就會和字元串相連。
8 java運算符
8.1.算術運算符
正負号(+,-)
除法
%取模
求餘數
取模的正負取決與被除數:
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
8.1 指派運算符
= , +=, -=, *=, /=, %=
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 area; // 聲明double變量area
double radius = 1.0; // 聲明double變量radius,并指派1.0給變量radius
x = 5 * (3 / 2) + 3 * 2; // 将=右半部分表達式的計算結果指派給變量x
x = y + 1; // 将變量y和1的求和的值指派給變量x
area = radius * radius * 3.14159; // 将計算面積的值指派給變量area
}
指派運算符小問題
問題1:
int x;
Syst2intln(x = 1);
如何了解?
答:等價于
x=1;
System.out.println(x);
注意:不能 1=x,變量名必須在指派運算符的左邊。
問題二:
int x;
int y;
int z;
x = y = z = 100;
如何了解?
答:等價于
int x;
int y;
int z;
z = 100;
y = z;
x = y;
問題三:
short s1 = 1;
s1= s1+1;
s1+=1;
問:s1= s1+1; s1+=1; 與有什麼不同?
對于short s1 = 1; s1 = s1 + 1; 由于s1+1運算時會自動提升表達式的類型,是以結果是int型,再指派給short類型s1時,編譯器将報告需要強制轉換類型的錯誤。
對于short s1 = 1; s1 += 1;由于 += 是java語言規定的運算符,java編譯器會對它進行特殊處理,是以可以正确編譯。
8.2 比較運算符
如何比較兩個值?使用比較運算符 3和5誰大,在java中如何比較?
比較運算符比較的兩邊操作數,結果都是boolean的,隻有true和false兩種結果。
運算符 運算 例子 結果
nstanceof 檢查是否是類的對象 "hello"instanceof String true
注意的細節:
1.使用比較運算符的時候,要求兩種資料類型必須一緻。
byte、short、char 會自動提升至int。
8.3 邏輯運算符
什麼是邏輯運算符?連接配接比較運算符的符号稱之為邏輯運算符。那麼為什麼要連接配接比較運算符? 舉例:當你去公司應聘,招聘要求,男性(判斷為真),并且開發經驗1年(判斷為假)那麼,我們還适合去面試嗎,不能,因為隻滿足了一項,總體是不滿足的(總體結果為假)。
邏輯運算符用于對boolean型結果的表達式進行運算,運算的結果都是boolean型。我們的比較運算符隻能進行一次判斷,對于對此判斷無能為力,那麼邏輯運算符就可以經将較運算符連接配接起來。
邏輯運算符用于連接配接布爾型表達式,在Java中不可以寫成33 & x<6 。
“&”和“&&”的差別:單與時,左邊無論真假,右邊都進行運算;雙與時,如果左邊為真,右邊參與運算,如果左邊為假,那麼右邊不參與運算。
“|”和“||”的差別同理,雙或時,左邊為真右邊不參與運算。
“ ^ ”異或與“|”或的不同之處是:當左右都為true時,結果為false。
& 與 | 或 ^ 異或 ! 非
1、& 與
true & true = true ;
false & true= false;
true & false = false;
false & false= false;
總結 & 符号特點
& : 隻要兩邊的boolean 表達式結果,有一個false.那麼結果就是false
隻有兩邊都為true ,将結果為true.
2、| 或
true | true =true;
ture | false =true;
false | true =true;
false | false =flase;
總結 | : 兩邊隻要有一個為真結果就為真,當兩邊同為假時結果才為假.
3、^ 異或
true ^ true =false;
ture ^ false =true;
false ^ true= true;
false ^ false=flase;
^ : 兩邊相同結果是false
兩邊不同結果是true;
4、! 非
!true = false
!false= true
5、&& 短路
研究發現,&運算隻有兩邊全為真的時候,結果才為真,那麼當左邊為假的時候就沒有必要在進行判斷,&&就産生了。
int a =4;
a >3 && a< 6;
a >3 & a< 6 ;
在這種情況下世沒有差別的
如果:
a =2
a >3 & a< 6 2大于 3 為假, 接着運算 2 小于6 為真,總的結果為假
a >3 && a< 6; 此時a 不大于3 結果為false 右邊不運算了.即短路.是以&& 比& 效率稍微高了一點.
public static void main(String[] args) {
int x = 0;
int y = 1;
if (x == 0 && y == 1) {
System.out.println(x + y);
}
}
8.4 位運算符
按位操作符用來操作整數基本資料類型中的單個比特(bit),就是二進制,按位操作符會對兩個參數中對應的位(bit)執行布爾運算,最終生成一個結果。按位操作符來源于C語言面向底層的操作,Java設計的初衷是嵌入式電視機機頂盒,是以面向底層的操作也保留了下來。
任何資訊在計算機中都是以二進制的形式儲存的,”&”、“|”、“^”除了可以作為邏輯運算符也可以作為位運算符。位運算是直接對二進制進行運算。他們對兩個操作數中的每一個二進制位都進行運算。例如int是由32個二進制數組成,是以使用位運算符可以對整數值的二進制數進行運算。
位(bit)運算符:
位運算符
運算符含義
& 與(AND)
| 或(OR)
^ 異或
~ 取反
規則:
可以把1當做true 0當做false
隻有參與運算的兩位都為1,&運算的結果才為1,否則就為0。
隻有參加運算的兩位都是0,| 運算的結果才是0,否則都是1。
隻有參加運算的兩位不同,^ 運算的結果才為1,否則就為0。
1、& 與運算
& 參見運算的兩位數都為1,&運算符結果才為1,否則就為0。
6&3
00000000 00000000 00000000 00000110 6
00000000 00000000 00000000 00000011 3
00000000 00000000 00000000 00000010 & =2
2、| 或運算
| 參與運算的兩位都為0,|運算的結果才為0,否則就為1。
00000000 00000000 00000000 00000111 | =7
3、^ 異或運算
隻有參加運算的兩位不同,運算的結果才為1,否則就為0。
00000000 00000000 00000000 00000101 ^ =5
1、 ~ 反碼
就是取反,二進制隻有1和0,取反就是如果為1,取反就是0,如果是0,取反就是1。
0000-0000 0000-0000 0000-0000 0000-0110 6
1111-1111 1111-1111 1111-1111 1111-1001 取反 -7
System.out.println(~6);//-7
結論:當參與取反的數值是正數時,把對應的值加上負号,再-1;
當參與取反的數值是負數時,把對應的值加上負号,再-1;
負數的表現形式就是對應的正數取反,再加1。負數的最高位肯定是1。
4、負數表示
負數對應的正數的二進制-1,然後取反。
-6
1111-1111 1111-1111 1111-1111 1111-1001 取反
1111-1111 1111-1111 1111-1111 1111-1010 加1
5、異或特點
一個數異或同一個數兩次,結果還是那個數. 用處一個簡單的加密思想.
633
0000-0000 0000-0000 0000-0000 0000-0011 ^3
0000-0000 0000-0000 0000-0000 0000-0101
0000-0000 0000-0000 0000-0000 0000-0110 結果是6
除了這些位運算操作,還可以對資料按二進制位進行移位操作,Java的移位運算符有三種。
練習:取出一個二進制的某一段。
使用異或(^)資料對資料加密
對兩個變量的值進行互換。
方式1:
對兩個變量進行值交換(不能使用第三個變量)
方式2:
兩個數相加的時候,值有可能超出int表示範圍,不推薦。
方式3:
該方式雖然效率高,而且避免了超出int值,但是可讀性較差。
三種方式都可以對兩個變量的值進行交換,但是推薦使用第一種。(面試除外)
<< 左移
運算符 運算 範例
<< 左移 3 << 2 = 12 --> 322=12
位運算符的細節
<< 空位補0,被移除的高位丢棄,空缺位補0。
不相同二進制位 ^ 運算結果是1。1^0=1 , 0^1=1
技巧:可以了解為二進制1就是true,0就是false。
1、左移 (算術移位)
3<< 2 是如何在計算機裡是實作的?
首先将3轉換為2進制,
00000000 00000000 00000000 00000011 3 的二進制
00000000 00000000 00000000 000011 左移2位,砍掉高位
0000 0000 0000 0000 0000 0000 0000 1100 低位補0
結果是12,是以3<<2 =12;
結論:左移就相當于乘以2的位移個數次幂.
2、右移
6>>2
00000000 00000000 00000000 00000110 6的二進制
000000 00000000 00000000 00000001 右移10被砍掉
00000000 00000000 00000000 00000001 高位補0
結果是1,是以6>>2 =1;
結論一個數往左移越移越大,往右邊移越來越小.
推論
3<<2=12; 3<<1=6 ; 3<<3=24;
34=12 ; 32=6; 38=24;
322=12; 321=6 323 =24;
結論往左移幾位就是乘以2的幾次幂。
右移規律
6>>2=1 ;6>>1=3 ;
6/4=1 ; 6/2=3 ;
右移兩位就是除以 2的2次方,右移一位就是除以 2的一次方。
總結 :>> 是除以2的移動位數次幂
<< 是乘以2的移動位數次幂
用處:最快的運算是位運算。
練習:最有效率的方式算出2乘以8等于幾?
3、無符号右移 (邏輯移位)
通過示範發現右移時高位就空了出來, >> 右移時高位補什麼要按照原有 資料的最高位來決定。
1111-1111 1111-1111 1111-1111 1111-1010 -6>>2
1111-1111 1111-1111 1111-1111 1111-0010
最高位補什麼要看原有最高位是什麼
那麼使用>> 後原來是最高位1 的那麼空出來的最高位還是1 的,是0的還是0。
如果使用>>> 無論最高位是0還是1 空餘最高位都拿0 補,這就是無符号右移。
1111-1111 1111-1111 1111-1111 1111-1010 -6>>>2
001111-1111 1111-1111 1111-1111 1111-10
結果是;1073741822
8.6 三元運算符
格式
(條件表達式)?表達式1:表達式2;
如果條件為true,運算後的結果是表達式1;
如果條件為false,運算後的結果是表達式2;
示例:
1擷取兩個數中大數。
int x=3,y=4,z;
z = (x>y)?x:y;//z變量存儲的就是兩個數的大數。
int x = 1;
int y = 2;
int z;
z = x > y ? x : y;
System.out.println(z); //2
2判斷一個數是奇數還是偶數。
int x=5;
System.out.println((x%2==0?“偶數”:“奇數”));
9 運算符的優先級與結合性
10 作業
按照标準步驟完成hello world列印。
如果定義一個變量,如何使用變量。
基本資料類型有哪些?
‘a’+1,結果是什麼?為什麼?都做了什麼事情呢?
++在前,在後的差別?
short s = 3; s = s+2; s+=2,有什麼差別,為什麼?
&和&&的差別?