第二章(續)
一.基本數據類型變量和引用數據類型變量:
1)使用基本數據類型定義的變量叫做基本數據類型變量
int a=10;
保存是數據本身的數值(二進制)
2)使用引用數據類型定義的變量叫做引用數據類型變量
Teacher t=new Teacher();
保存是堆區開闢的地址
new關鍵字:
a)在棧區開闢空間保存對象的引用
b)在堆區開闢空間保存對象本身
c)堆區的地址賦值給棧區的對象的引用
二:運行時數據區
一個完整的Java程序運行過程會涉及以下內存區域
方法區/代碼區:存放類的信息
堆區:用來存放動態產生的數據,比如new出來的對象。
注意創建出來的對象只包含屬於各自的成員變量,
並不包括成員方法。因爲同一個類的對象擁有各自
的成員變量,存儲在各自的堆中,但是他們共享該
類的方法,並不是每創建一個對象就把成員方法複製一次。
棧區:保存局部變量的值,包括:
1.用來保存基本數據類型的值;
2.保存類的實例,即堆區對象的引用(指針)。
也可以用來保存加載方法時的幀
常量池:JVM爲每個已加載的類型維護一個常量池,
常量池就是這個類型用到的常量的一個有序集合。
常量池存在於堆中。
PC寄存器:指向下一條需要執行的指令,將該數據傳遞給CPU
第三章: 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;
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=
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);
00000000 00000000 00000000 0000 0001
11111111 11111111 11111111 111111111
11111111
11111111 11111111
00000000 00000000 11111111 111111111
65535
數據類型在轉換的時候注意:
a)如果將精度小的數據轉爲精度大的數據時。
如果轉之前是有符號數,在前面補符號位
如果轉之前是無符號數,在前面補0
b)如果將精度大的數據轉爲精度小的數據時。
從低位竊取位數
2)引用數據類型轉換
隱式的數據類型轉換:子類轉換父類
強制(顯式)的數據類型轉換:父類轉換子類
String str="hello";
Object o=str;
String str2=(String)o;
Person p = new Student();
Student s = (Student)new person();
System.out.println((int)(char)(byte)-1);
0000 0000 0000 0000 1111 1111 1111 1111
1+2+4+8+16+32+64+128+
256+512+1024+2048+
4096+8192+16384+32768
int c=a>b?a:b;
等價於
if(a>b)c=a;
else c=b;