第三章: Expressions and Flow Control
一:局部變量和實例變量
定義變量是指設定變量的數據類型和變量的名字,
Java語言要求變量遵循先定義,再初始化,而後使用的規則。
做用域:指它的存在範圍,只有在這個範圍內,程序代碼才能訪問它。
變量的生命週期是指從一個變量被建立並分配內存空間開始,
到這個變量被銷燬並清除其所佔用內存空間的過程
局部變量(參數變量也能夠當作是局部變量):
1)位置:定義在方法中或者在方法中的{}
2)使用:先賦值後使用
3)做用域:定義的方法中或者定義的{}中
4)生命週期:從變量的定義到方法調用結束
實例變量:
1)位置:定義方法外,類裏面
2)使用:系統會進行默認初始化
3)做用域:做用於整個類
4)生命週期:從對象建立的時候到gc回收內存結束
局部變量的例子:
public void method1() {
int a = 0; //局部變量,做用域爲整個method01方法;
{ int b = 0; //局部變量,做用域爲所處的代碼塊;
b = a;
}
b = 20; //編譯出錯,b不能被訪問;
}
實例變量的例子:
class Test {
private int n1=0;
private int n2=0;java
public int add() {
int result = n2 + n2;
return result;
}
}對象
二:操做符:操做符能與相應類型的數據組成表達式,來完成相應的運算。
a)數學運算操做符
+數據類型值相加或字符串鏈接;
System.out.println(1+2+"a"); //輸出3a
System.out.println(1+2.0+"a"); //輸出3.0a
System.out.println(1+2.0+"a"+true); //輸出3.0atrue
System.out.println("a"+1+2); //輸出a12
System.out.println(1+"a"+2); //輸出1a2
/整除, 如操做數均爲整數,運算結果爲商的整數部分
int a1=12/5; //a1變量的取值爲2
int a2=13/5; //a2變量的取值爲2
int a3=-12/5; //a3變量的取值爲-2
int a4=-13/5; //a4變量的取值爲-2
int a5=1/5; //a5變量的取值爲0
double a6=-12/5; //a6變量的取值爲-2.0
double a7=-12/5.0; //a7變量的取值爲-2.4
%取模操做符, 如操做數均爲整數,運算結果爲商的整數部分
int a1=1%5; //a1變量的取值爲1
int a2=13%5; //a2變量的取值爲3
double a3=1%5; //a3變量的取值爲1.0
double a4=12%5.1; //a4變量的取值爲1.8000000000000007繼承
b) 賦值操做符:
= :int x=0,i=1,j=1;
*=:這裏的"*="由操做符"*"和"="複合而成,它等價於 a=a*b;
這種複合操做符能使程序變得更加簡潔。
/=:a/=b 等價於 a=a/b;
%=:a%=b 等價於 a=a%b;
...
注意:+=和+的區別
如:short a=0;
int b=123456;
a+=b;和a=a+b的區別
+=系統會進行隱式的數據類型轉換,向=左邊的數據類型進行轉換。
a+b會向數據類型高的類型轉換接口
c) 比較操做符
> 大於
>= 大於等於
< 小於
<= 小於等於
以上操做符只適用於整數類型和浮點數類型;
int a=1,b=1;
double d=1.0;
boolean result1 = a>b; //result1的值爲false;
boolean result2 = a<b; //result2的值爲false;
boolean result3 = a>=d; //result3的值爲true;
boolean result4 = a<=b; //result4的值爲true; 生命週期
instanceof: 判斷一個引用類型所引用的對象是不是一個類的實例。
該操做符左邊是一個對象,右邊是一個類名或接口名。形式以下:
如:String str="hello"
System.out.println(str instanceof String);
System.out.println(str instanceof Object);
System.out.println(str instanceof Student); //false
java.lang.Object是全部類的父類,
每個類都會默認繼承Object
子類是一個父類 是is a的關係內存
d)相等操做符
== 等於
!= 不等於
既能夠是基本類型,也能夠是引用類型:
基本數據類型比較是真正的數值
引用類型比較的是地址,若是要比較引用類型真正的數據使用equals()方法
如:int a=1,b=1;
System.out.println(a==b); //輸出true;
如:String s1="hello";
String s2="hello";
String s3=new String("hello");
String s4=new String("hello");
System.out.println(s1==s2); //true
System.out.println(s3==s4); //false
System.out.println(s1==s3); //false
System.out.println(s3.equals(s4)); //true作用域
e) 移位操做符,針對二進制操做
>> 算術右移位運算,也稱作帶符號右移位運算。最高爲補符號位。
>>> 邏輯右移位運算,也稱爲不帶符號右移位運算。
<< 左移位運算,也稱爲不帶符號左移位運算。字符串
f) 位運算操做符
& :與運算,運算規則爲:1&1->1, 1&0->0, 0&1->0, 0&0->0;
|:或運算,運算規則爲:1|1->1, 1|0->1, 0|1->1, 0|0->0;
^:異或運算,運算規則爲:1^1->0, 1^0->1, 0^1->1, 0^0->0;
兩個值相同爲0,不一樣爲1;
~ : 取反運算, ~1->0, ~0->1;數學
例如:8>>2====>8/2^2=2
8:0000...00001000
0000.........10 ====>2
8>>>3=====>8/2^3=1
8:0000...00001000
00000000.000001=====>1
8<<2======>8*2^2=32
8:0000...00001000
000000000100000======>32
1&1=1 1&0=0 0&0=0
1|1=1 1|0=1 0|0=0
1^1=0 1^0=1 0^0=0
~1=0
~0=1
8&2=0 8|2=10 8^2=10
~8=
~2=it
1010
10===>第三位置1===>14
10===>第二位清0===>8
10===>第一位置反===>11
10===>輸出相應的二進制
f) 邏輯操做符
短路操做符,若是能根據操做左邊的布爾表達式
就能推算出整個表達式的布爾值,將不執行操做
符右邊的布爾表達式;
&&:左邊的布爾表達式的值爲false, 整個表達式值確定爲false,
此時會忽略執行右邊的布爾表達式。
||:左邊的布爾表達式的值爲true, 整個表達式值確定爲true,
此時會忽略執行右邊的布爾表達式。
if(條件1&&條件2){}
if條件1爲假,不會執行條件2
if條件1爲真,會執行條件2
if(條件1||條件2){}
if條件1爲真,不會執行條件2
if條件1爲假,會執行條件2
g) 條件操做符
布爾表達式 ? 表達式1 : 表達式2
若是布爾表達式的值爲true,就返回表達式1的值,不然返回表達式2的值。
int score = 61;
String result = score>=60?"及格":"不及格";
h)++,--
前++與後++
前--與後--
int a=10;
b=++a =====>a=11,b=11,先計算,後賦值
b=a++ =====>a=11,b=10,先賦值,後計算
System.out.println("a:"+a+" b:"+b);
三.數據類型的轉換
1)基本數據類型轉換
隱式的數據類型轉換:精度小的數據給精度大的數據
強制(顯式)的數據類型轉換:(type)精度大的數據給精度小的數據
System.out.println((int)(char)(byte)-1);
數據類型在轉換的時候注意:
a)若是將精度小的數據轉爲精度大的數據時。
若是轉以前是有符號數,在前面補符號位
若是轉以前是無符號數,在前面補0
b)若是將精度大的數據轉爲精度小的數據時。
從低位竊取位數
2)引用數據類型轉換
隱式的數據類型轉換:子類轉換父類
強制(顯式)的數據類型轉換:父類轉換子類
String str="hello";
Object o=str;
String str2=(String)o;
四.語句
a)條件語句:有些代碼只有知足特定條件的狀況下才會被執行
1)if...else
a. if後面的表達式必須是布爾表達式,而不能爲數字類型,例以下面的if(x)是非法的。
b. 假如if語句或else語句的程序代碼塊中包括多條語句,則必須放在大括號{}內。
若程序代碼塊只有一條語句則能夠不用大括號{}。流程控制語句(如if...else語句)
可做爲一條語句看待。
c.只可能執行一個分支,不可能執行多條分支
2)switch
a. switch後條件的類型必須是byte, short, char或者int;
jdk1.7以後可使用String類型。
b. 各個case子句的值不一樣,數據類型必須和switch後條件的數據類型相同;
c. 當switch表達式的值不與任何case子句匹配時,程序執行default子句,
假如沒有default子句,則程序直接退出switch語句。
default子句能夠位於switch語句中的任何位置。
d. 若是switch表達式與某個case表達式匹配,或者與default狀況匹配,
就從這個case子句或default子句開始執行。
假如遇到break,就退出整個switch語句,不然依次執行switch語句中後續的case子句,
再也不檢查case表達式的值。
e. switch語句的功能也能夠用if...else語句來實現。
但switch語句會使程序更簡潔,可讀性更強。而if...else功能更爲強大。
b)循環語句
循環語句的做用是反覆執行一段代碼,直到不知足循環條件爲止。
循環語句通常應包括以下四部份內容:
i)初始化部分:用來設置循環的一些初始條件,
好比循環控制變量的初始值;
ii)循環條件:這是一個布爾表達式,
每一次循環都要對該表達式求值,
以判斷到底繼續循環仍是終止循環。
iii) 循環體:這是循環操做的主體內容,能夠是一條語句,也能夠是多條語句;
iv) 迭代部分:用來改變循環控制變量的值,
從而改變循環條件表達式的值;
1)for
語法:for(初始化部分;循環條件;迭代部分) {
循環體
}
2)while
語法:[初始化部分]
while(循環條件) {
循環體,包括迭代部分
}
當循環條件爲true時,就重複執行循環,不然終止循環;
3)do..while 和while很是相似,只不過先執行循環體,而後再判斷循環條件。 語法:[初始化部分] do { 循環體,包括迭代部分 } while(循環條件); 4)循環語句中流程跳轉 a) break: 終止當前或指定循環; b) continue: 跳過本次循環,執行下一次循環, 或執行標號標識的循環體。 c) label: 標號用來標識程序中的語句,標號的名字能夠是任意的合法標識符。 continue語句中的標識必須定義在while、do...while和for循環語句前面; break語句中的標識必須定義在while、do...while和for循環語句或switch語句前面;