1 關鍵字
1.1 關鍵字的概述
Java的關鍵字對java的編譯器有特殊的意義材失,他們用來表示一種數據類型痕鳍,或者表示程序的結構等,關鍵字不能用作變量名龙巨、方法名笼呆、類名、包名旨别。
1.2 常見的關鍵字
備注:不必死記硬背诗赌,如果使用關鍵字作為標識符,編譯器能提示錯誤秸弛。
goto 是java的保留關鍵字铭若,意思是java并沒有使用goto,以后是否使用未定递览。
2 標識符
2.1 什么是標識符
就是程序員在定義java程序時叼屠,自定義的一些名字,例如helloworld 程序里關鍵字class 后跟的Demo绞铃,就是我們定義的類名镜雨。類名就屬于標識符的一種。
標識符除了應用在類名上儿捧,還可以用在變量荚坞、函數名、包名上菲盾。(要求同學們先記住颓影,以后會詳細見到這些)。
2.2 標識符必須遵循以下規(guī)則
1. 標識符由26個英文字符大小寫(azAZ)亿汞、數字(0~9)瞭空、下劃線(_)和美元符號($)組成。
2. 不能以數字開頭疗我,不能是關鍵字
3. 嚴格區(qū)分大小寫
4. 標識符的可以為任意長度
2.3 標識符案例
2.3.1 合法的標識符
ComputeArea咆畏,radius,area $itcast _itcast gz_itcast
注意:由于Java嚴格區(qū)分大小寫吴裤,ITCAST 和itcast是完全不同的標識符
2.3.2 非法標識符
class (關鍵字)
100java(不能以數字開頭)
Hello java (空格不是組成標識符的元素)
2.3.3 Java中的標識符命名規(guī)范包名
多個單詞組成時所有字母小寫(例:package com.itcast)類名和接口
多個單詞組成時所有單詞的首字母大寫(例:HelloWorld)變量名和函數名
多個單詞組成時第一個單詞首字母小寫旧找,其他單詞首字母大寫(例:lastAccessTime、getTime)麦牺。-
常量名
多個單詞組成時钮蛛,字母全部大寫,多個單詞之間使用_分隔(例:INTEGER_CACHE)
注意:只是為了增加規(guī)范性剖膳、可讀性而做的一種約定魏颓,標識符在定義的時候最 好見名知意,提高代碼閱讀性吱晒。
3 3.注釋
3.1 注釋的作用
通過注釋提高程序的可讀性甸饱,是java程序的條理更加清晰,易于區(qū)分代碼行與注釋行仑濒。另外通常在程序開頭加入作者叹话,時間,版本墩瞳,要實現的功能等內容注釋驼壶,方便后來的維護以及程序員的交流。
3.2 注釋的種類
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);
*/}
注意:多行注釋中可以嵌套單行注釋和蚪,多行注釋不能嵌套多行注釋止状。錯誤!T芘怯疤!
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 返回值
注釋的使用細節(jié):
三種注釋可以出現在程序的任何地方塔淤,但是不推薦找任意位置摘昌。
- 編程習慣:
1. 給那條語句進行說明,注釋應該寫在該語句的旁邊高蜂。 - 單行注釋一般寫在語句的后面多行注釋和文檔注釋一般寫在語句的上面
注意:文檔注釋只能出現在類聪黎、屬性、方法的上面备恤。
2 注釋的嵌套
1.單行注釋可以在單行注釋里面稿饰。
2.多行注釋不能嵌套在多行注釋里面。
3 注釋的調試作用:
1. 可以作為初學者的調試方式露泊。
2. 可以幫組初學者確定代碼的錯誤之處喉镰。
4 常量
4.1 常量的概述
常量是指在程序運行過程中其值不能改變的量。
4.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"");
注意:換行符就是另起一行看彼,回車符就是回到一行的開頭廊佩,所以我們平時編寫文件的回車符應該確切來說叫做回車換行符
- boolean 類型
boolean由數學家Geogore Boole 發(fā)明
boolean 類型用來存儲布爾值,在java中布爾值只有2個靖榕,true和false标锄。
boolean flag=true;
flag=false;
Java中這8中基本數據類型都是小寫的。
5 進制的轉換
進制:進制是一種記數方式 序矩,可以用有限的數字符號代表所有的數值鸯绿。由特定的數值組成跋破。
5.1 整型的表現形式
- 十進制: 都是以0-9這九個數字組成簸淀,不能以0開頭。
- 二進制: 由0和1兩個數字組成毒返。
- 八進制: 由0-7數字組成租幕,為了區(qū)分與其他進制的數字區(qū)別,開頭都是以0開始寝姿。
- 十六進制:由0-9和A-F組成栗恩。為了區(qū)分于其他數字的區(qū)別鞍陨,開頭都是以ox開始。
5.2 進制的由來
幾乎每個民族最早都使用都十進制計數法贾富,這是因為人類計數時自然而然地首先使用的是十個手指。 但是這不等于說只有十進制計數法一種計數方法牺六。例如颤枪,世界各國在計算年月日時不約而同地使用“十二進制”12個月為一年又如:我國過去16兩才算為一斤,這就是“十六進計數法”,一個星期七天淑际,這個就是”七進制計算法”畏纲。 計算機是由邏輯電路組成,邏輯電路通常只有兩個狀態(tài)春缕,開關的接通與斷開盗胀,這兩種狀態(tài)正好可以用“1”和“0”表示。
如果要在計算機里面保存十進制的7.
5.2.1 十進制與二進制之間的轉換
十進制轉二進制的轉換原理:除以2锄贼,反向取余數票灰,直到商為0終止。
二進制轉十進制的轉換原理:就是用二進制的每一個乘以2的n次方宅荤,n從0開始屑迂,每次遞增1。然后得出來的每個數相加
存在問題:書寫特別長膘侮,不方便記憶屈糊。
5.2.2 十進制與八進制之間轉換
八進制的由來
二進位制在計算機內部使用是再自然不過的。但在人機交流上琼了,二進位制有致命的弱點——數字的書寫特別冗長逻锐。例如夫晌,十進位制的100000寫成二進位制成為11000011010100000。為了解決這個問題昧诱,在計算機的理論和應用中還使用兩種輔助的進位制——八進位制和十六進位制晓淀。二進位制的三個數位正好記為八進位制的一個數位,這樣盏档,數字長度就只有二進位制的三分之一凶掰,與十進位制記的數長度相差不多。例如蜈亩,十進位制的100000寫成八進位制就是303240懦窘。十六進位制的一個數位可以代表二進位制的四個數位,這樣稚配,一個字節(jié)正好是十六進位制的兩個數位畅涂。十六進位制要求使用十六個不同的符號,除了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.時間每一秒都在發(fā)生變化,根據不同的時間要有不同的處理方式肌蜻。
2.氣象站會根據溫度發(fā)布天氣預報信號互墓。 - 變量的特點
正常情況下牛奶盒裝的都是牛奶,而且會根據牛奶的多少去決定要多大的容量的牛奶盒蒋搜,A和B兩位同學同時把牛奶盒放進籃子里面,但是需要區(qū)分兩個牛奶盒是誰的判莉,都需要在牛奶盒上做一個標志豆挽。
特點: - 必須要有大小
- 存儲一定格式的可變數據
- 必須要有名字
6.2 變量的聲明
根據上述變量的特點,所以我們聲明一個變量的時候需要確定變量的大小券盅,類型帮哈、名字三個特點:
錯誤: 1024byte temp = 1000000;
錯誤原因锰镀,java有自己的變量類型娘侍。
6.2.1 變量的數據類型
1. 整型
byte 代表一個字節(jié)的大小 8bit 2(8) -128~127 256
short 代表兩個字節(jié)的大小 16bit 2(16) -2(15)~2(15)-1
int 代表四個字節(jié)的大小 32bit 2(32) -2(31)~2(31)-1
long 代表八個字節(jié)的大小 64bit 2(64) -2(63)~2(63)-1
如果一個數值沒有采取特殊的處理,那么該整數默認的類型是int泳炉。
可以使用數值后面添加L或小寫L改變默認的整數類型憾筏。
2. 浮點型
float 代表四個字節(jié)的大小 32bit
double 代表八個字節(jié)的大小 64bit
java程序中所有的小數默認的類型是double類型,所以需要使用特殊的符號改變默認的小數類型花鹅。
3. 字符型
char 代表兩個字節(jié)的大小 16bit 2(16)
原理:將字符映射為碼表中對應的十進制數據加以存儲氧腰。
4. 布爾型
boolean 占一個字節(jié)。只有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)相除會去掉小數部分焕参。如果需要保留小數部分,可以讓除數或者被除數變?yōu)閐ouble類型的(5變?yōu)?.0)油额。其實Java是自動的將int的那個數變?yōu)榱薲ouble類型了也就是Java自動的將整數變?yōu)榱烁↑c數叠纷。例如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);
上述例子發(fā)生了什么辅肾,發(fā)生了類型轉換。
b+2 遇到了加法運算轮锥,2默認是int類型矫钓,byte類型b變量存儲的值自動類型提升為
了int類型。執(zhí)行完加法運算后的結果就是int類型舍杜,想要將int的類型值放入到byte類型變量b中新娜,無法放入,編譯報錯既绩。
byte b=1;
b=(byte)(b+2);
當兩種類型彼此不兼容概龄,或者目標類型取值范圍小于源類型(目標是byte源是int)
無法自動轉換,此時就需要進行強制類型轉換熬词。
強制類型轉換需要注意:
損失精度E跃!互拾!
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自動類型提升規(guī)則嫁赏,同樣道理 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=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 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語言規(guī)定的運算符,java編譯器會對它進行特殊處理战授,因此可以正確編譯页藻。
8.2 比較運算符
如何比較兩個值?使用比較運算符 3和5誰大植兰,在java中如何比較份帐?
比較運算符比較的兩邊操作數,結果都是boolean的楣导,只有true和false兩種結果废境。
運算符 運算 例子 結果
== 相等于 4= =3 false
!= 不等于 4!= 3 true
< 小于 4 < 3 flase
大于 4>3 true
<= 小于等于 4<=3 false
= 大于等于 4>=3 true
Instanceof 檢查是否是類的對象 "hello"instanceof String true
注意的細節(jié):
1.使用比較運算符的時候,要求兩種數據類型必須一致爷辙。
byte彬坏、short、char 會自動提升至int膝晾。
8.3 邏輯運算符
什么是邏輯運算符栓始?連接比較運算符的符號稱之為邏輯運算符。那么為什么要連接比較運算符血当? 舉例:當你去公司應聘幻赚,招聘要求,男性(判斷為真)臊旭,并且開發(fā)經驗1年(判斷為假)那么落恼,我們還適合去面試嗎,不能离熏,因為只滿足了一項佳谦,總體是不滿足的(總體結果為假)。
邏輯運算符用于對boolean型結果的表達式進行運算滋戳,運算的結果都是boolean型钻蔑。我們的比較運算符只能進行一次判斷,對于對此判斷無能為力奸鸯,那么邏輯運算符就可以經將較運算符連接起來咪笑。
邏輯運算符用于連接布爾型表達式,在Java中不可以寫成3<x<6娄涩,應該寫成x>3 & x<6 窗怒。
“&”和“&&”的區(qū)別:單與時,左邊無論真假,右邊都進行運算扬虚;雙與時努隙,如果左邊為真,右邊參與運算孔轴,如果左邊為假剃法,那么右邊不參與運算。
“|”和“||”的區(qū)別同理路鹰,雙或時贷洲,左邊為真右邊不參與運算。
“ ^ ”異或與“|”或的不同之處是:當左右都為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、&& 短路
研究發(fā)現进栽,&運算只有兩邊全為真的時候德挣,結果才為真,那么當左邊為假的時候就沒有必要在進行判斷快毛,&&就產生了格嗅。
int a =4;
a >3 && a< 6;
a >3 & a< 6 ;
在這種情況下世沒有區(qū)別的
如果:
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)執(zhí)行布爾運算屯掖,最終生成一個結果。按位操作符來源于C語言面向底層的操作襟衰,Java設計的初衷是嵌入式電視機機頂盒贴铜,所以面向底層的操作也保留了下來。
任何信息在計算機中都是以二進制的形式保存的瀑晒,”&”阀湿、“|”、“^”除了可以作為邏輯運算符也可以作為位運算符瑰妄。位運算是直接對二進制進行運算。他們對兩個操作數中的每一個二進制位都進行運算映砖。例如int是由32個二進制數組成间坐,因此使用位運算符可以對整數值的二進制數進行運算。
位(bit)運算符:
位運算符
運算符含義
& 與(AND)
| 或(OR)
^ 異或
~ 取反
規(guī)則:
可以把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 00000110 6
00000000 00000000 00000000 00000011 3
00000000 00000000 00000000 00000111 | =7
3好乐、^ 異或運算
只有參加運算的兩位不同,運算的結果才為1瓦宜,否則就為0蔚万。
00000000 00000000 00000000 00000110 6
00000000 00000000 00000000 00000011 3
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
0000-0000 0000-0000 0000-0000 0000-0110 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-0110 6
0000-0000 0000-0000 0000-0000 0000-0011 ^3
0000-0000 0000-0000 0000-0000 0000-0101
0000-0000 0000-0000 0000-0000 0000-0011 ^3
0000-0000 0000-0000 0000-0000 0000-0110 結果是6
除了這些位運算操作,還可以對數據按二進制位進行移位操作埋虹,Java的移位運算符有三種猜憎。
練習:取出一個二進制的某一段。
使用異或(^)數據對數據加密
對兩個變量的值進行互換搔课。
方式1:
對兩個變量進行值交換(不能使用第三個變量)
方式2:
兩個數相加的時候胰柑,值有可能超出int表示范圍,不推薦。
方式3:
該方式雖然效率高爬泥,而且避免了超出int值柬讨,但是可讀性較差。
三種方式都可以對兩個變量的值進行交換急灭,但是推薦使用第一種姐浮。(面試除外)
8.5 移位操作符
<< 左移
右移
無符號右移
位運算符
運算符 運算 范例
<< 左移 3 << 2 = 12 --> 322=12
右移 3 >> 1 = 1 --> 3/2=1
無符號右移 3 >>> 1 = 1 --> 3/2=1
& 與運算 6 & 3 = 2
| 或運算 6 | 3 = 7
^ 異或運算 6 ^ 3 = 5
~ 反碼 ~6 = -7
位運算符的細節(jié)
<< 空位補0,被移除的高位丟棄葬馋,空缺位補0卖鲤。
被移位的二進制最高位是0,右移后畴嘶,空缺位補0蛋逾;
最高位是1,空缺位補1窗悯。被移位二進制最高位無論是0或者是1区匣,空缺位都用0補。
& 二進制位進行&運算蒋院,只有1&1時結果是1亏钩,否則是0;
| 二進制位進行 | 運算,只有0 | 0時結果是0欺旧,否則是1;
^ 任何相同二進制位進行 ^ 運算姑丑,結果是0;1^1=0 , 0^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的幾次冪疫向。
右移規(guī)律
6>>2=1 ;6>>1=3 ;
6/4=1 ; 6/2=3 ;
右移兩位就是除以 2的2次方,右移一位就是除以 2的一次方竞帽。
總結 :>> 是除以2的移動位數次冪
<< 是乘以2的移動位數次冪
用處:最快的運算是位運算扛施。
練習:最有效率的方式算出2乘以8等于幾?
3屹篓、無符號右移 (邏輯移位)
通過演示發(fā)現右移時高位就空了出來, >> 右移時高位補什么要按照原有 數據的最高位來決定。
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 運算符的優(yōu)先級與結合性
10 作業(yè)
- 按照標準步驟完成hello world打印虐块。
- 如果定義一個變量俩滥,如何使用變量。
- 基本數據類型有哪些贺奠?
- 'a'+1霜旧,結果是什么?為什么儡率?都做了什么事情呢挂据?
- ++在前,在后的區(qū)別儿普?
- short s = 3; s = s+2; s+=2,有什么區(qū)別拦赠,為什么佛掖?
- &和&&的區(qū)別?