CoreJava學習第二課
阿新 • • 發佈:2018-12-14
一:程式設計習慣(很重要!!!提高程式可讀性)
1.註釋(描述程式碼的文字)
1.單行註釋 //註釋內容
2.多行註釋 /* 多行註釋,
可以跨越多行 注意:多行註釋不能巢狀
*/
3.文件註釋 /**
配合javadoc工具使用
*/
2.縮排
· 同級程式碼左對齊,每行一句程式碼
· 每進入一個程式碼塊{},縮排一次
3.識別符號(程式設計師為程式元件起的名字)
語法: 1) 字母 數字 下劃線 貨幣符號 數字不能開頭 2) 不能使用關鍵字和保留字 (goto const) true false null 3) 大小寫敏感 4) 沒有長度限制
4.命名規範:【很重要】
① 望文生義
② 大小寫
包名:全小寫 com.cps.corejava.day01
類名:所有單詞首字母大寫 HelloWorld
變數名|函式名: 首單詞小寫,其它單詞首字母大寫 printStar
常量名:所有單詞大寫,單詞之間使用_連線 HELLO_WORLD
二:進位制轉換
1.位元組(1 Byte = 8 bit)
計算機把8個二進位制位固定在一起,稱為一個位元組
1Byte最多存8位:_ _ _ _ _ _ _ _ 128+64+32+16+8+4+2+1=255
2Byte最多存16位:_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 65535
2.進位制轉換
十進位制轉二進位制
90
45 0
22 1
11 0
5 1
2 1
1 0
0 1 結果是: 1011010
小數是乘以2運算:從上往下
0.2
0.4 0
0.8 0
1.6 1
1.2 1
0.4 0
0.8 0
1.6 1
1.2 1 90.2 = 1011010.001100110011001100110011...
因為0.2轉二進位制後會出現無限迴圈,所以十進位制90.2轉二進位制,最後可能會出現精度丟失
三:變數
int a = 10; int是變數型別,a是變數名稱,10就是變數
1.變數
基本的資料儲存單元
2.變數型別
決定計算機要提供多大的記憶體空間(byte short int ...提供的最大儲存量不一樣)
3.強型別和弱型別約束
為了提高計算機記憶體的使用效率,引入強型別約束:
強型別:變數的型別和資料的型別必須一致
弱型別:定義變數不用指定變數型別,例如:JavaScript中 的var
注:
var a = 10;在JDK10之後就是對的,因為編譯器會自動推斷a的字面值是10,10是int型別。
如果再寫a = 2.5;就會報錯,因已經認定a是int型別
四:資料型別(2種:基本資料型別,物件資料型別)
一.1 基本(原始/簡單)資料型別(1-4,共8種)
1.byte 1B -128 - 127
1B 8 位 _ _ _ _ _ _ _ _ 第一個是符號位,0正1負
2.short 2B -32768 - 32767
3.int 4B -2147483648 - 2147483647
4.long 8B -9223372036854775808 - 9223372036854775807 字面值加l或L
一.2 基本資料型別(5-8,共8種)
float | double (預設) | |
---|---|---|
精度 | 單精度浮點數 | 雙精度浮點數 |
分配的記憶體空間 | 4B | 8B |
字面值 | 加 F 或 f | 加 D 或 d 或不加 |
舉例:
float f = 1.3;
這樣寫是錯的,因為1.3的字面值是double,編譯器會嘗試把double降級為float,但是會丟失精度,所以編譯器會報錯。
1.補充:面試題
System.out.println(2.0-1.1);//結果是0.8999999999999999
因為計算機在存1.1時,需要把1.1轉成二進位制,此時0.1在轉二進位制時會丟失精度,所以計算結果就不是0.9 。
System.out.println(2.0F-1.1F);//結果是0.9
此問題涉及到 java虛擬機器位元組碼指令。在java虛擬機器底層中,2.0-1.1會被當成double做運算,結果是0.8999999999999999,但結果是一個float型別,此時虛擬機器會四捨五入,“湊巧”變成了0.9 。
看下面兩個就和上面的不一樣了。
System.out.println(2.0-1.2);//0.8
System.out.println(2.0F-1.2F);//0.79999995
2.補充:浮點數在記憶體中如何表示?
float | double (預設) | |
---|---|---|
分配的記憶體空間 | 4B | 8B |
在記憶體中表示 ? | 第1個是符號位,指數位8,尾數位23 | 第1個是符號位,指數位11,尾數位52 |
字面值 | 加 F 或 f | 加 D 或 d 或不加 |
舉例表示:1.3*10^10 | 1.3e10F (對) ,1.3eF10(錯) | 1.3e10 |
精度 | 尾數位加上小數點前的1,共24位 | 尾數位加上小數點前的1,共53位 |
float和double可以用科學計數法表示: a(尾數) *2^ b(指數)
計算機中規定,浮點數在記憶體中採用科學計數法儲存時,小數點前必須是1.例如:
0.1011011 寫成 1.011011 指數位寫-1
3.char
char 存字元,分配2B的記憶體空間,所以表示資料範圍:0-65535
1.字面值表示: 1.用單引號引起來'A'
2. 直接寫char = 65
3.'\u0041' \u 表示是全球統一的Unicode編碼,這是十六進位制編碼(十六進位制編碼兩位是 1B,char是2B,所以用十六進位制編碼表示char是4位),所以65用十六進位制 表示是0041
2.Unicode編碼 全球統一
'A' ---> 65 編碼 ; 65 ---> 'A' 解碼
3.記住三個
'A' : 65 'a':97 '0':48
轉義字元:
\' 輸出 '
\" 輸出 "
\\ 輸出 \
'\n' 換行 ASCII值為10
'\t' Tab鍵功能 ASCII值為9
使用:
int n = 358;
System.out.println(n%10+"\t"+(n/10%10)+"\t"+(n/100)%10);// 8 5 3
System.out.println(n%10+'\t'+(n/10%10)+'\t'+(n/100)%10);//34 沒用雙引號時,
4.boolean型別
字面值 : true false
運算子: 布林表示式
== != > < >= <=
! 邏輯非
短路運算子: && 邏輯與,|| 邏輯或
非短路運算子:& 位運算與,| 位運算或
三元運算子 ?運算子 (布林表示式)?值1 : 值2 (a%2==0)?"偶數":"奇數"
舉例:短路運算子在判斷(a>b)&& (c<d)時,只要a<b,就不再算c<d,結果直接為假
非短路運算子會兩邊都判斷後,才出結果。
優先順序 括號優先順序最高 1+(2*3) (1+2)*3
補充一個面試題:
面試題:
boolean型別在記憶體中的儲存空間可以是1位/1B/4B ?
1.在邏輯層面,只需1位即可儲存布林值
2.在記憶體分配空間時,都是1位元組1位元組分配的,這樣就浪費了7位空間。
3.在虛擬機器的位元組碼指令中,沒有專門布林型別的資料,所以布林型別會轉化成int型別處理,佔4B空間。
1.計算機用二進位制運算(原碼,反碼,補碼)
二進位制表示:
5: 00000101
求-5的二進位制補碼錶示:是把5的原碼,按位求反再加1
原碼 0000 0101
按位求反 1111 1010
加1 1111 1011
-5: 11111011
計算機的CPU只會做加法運算,所以12-5變成12+(-5)
00001100 12
11111011 -5
00000111 7
01111111 表示 127
10000000 表示 -128
11111111 表示 -1
00000000 表示 0
2.字面值(“=”後面的就是字面值)
字面值: int a = 10; int a = 010; int a = 0x10 int a = 0b10
十進位制 八進位制 十六進位制 二進位制 (since JDK1.7)
二進位制 十進位制 十六進位制
1010 0101 = 2^7+2^5+2^2+2^0 = 128+32+4+1 165 = A5 十六進位制中2位表示一個位元組
簡單一點
1010=A 0101=5
3.表示式和運算子
表示式: 具有特定的值 如:a+b
運算子: + - * / % = 賦值運算子
+= -= *= /= %= ++ --
11/2 = 5 4/5 = 0 11%2 =1 4%5 = 4
兩個變數做運算,儲存結果的資料型別由這兩個變數的字面值決定。
例如:short和byte做運算,因short和byte沒有預設值int大,儲存結果的預設是int
long和int做運算,因long比預設值int大,儲存結果是long
a+=2;和a=a+2;有區別:
byte a = 1;
a+=2;結果還是byte型別;
a=a+2;因2預設是int型別,所以a+2結果也是int型別,把一個int型別存到byte裡會出錯。
4.位運算
&按位與 |按位或 ^按位異或 ~按位反
<<左移 相當於*2
>> 右移 相當於/2 高位補符號位
>>>無符號右移 高位補0
&按位與(同1才為1)
System.out.println(10&23); //2
/* 00 0 01 0 10 0 11 1
00001010 10
00010111 23
00000010 2
*/
|按位或(有1就為1)
System.out.println(10|23); //31
/*規則: 00 0 01 1 10 1 11 1
00001010 10
00010111 23
00011111 31
*/
^按位異或(01或10為1)
System.out.println(10^23); //29
/*
00001010 00 0 01 1 10 1 11 0
00010111
00011101
*/
~按位反
System.out.println(~10); //-11
/*
00001010
11110101 -11
*/
int a = 10;
<<左移 相當於*2
System.out.println(a<<1);//左移1位,最左邊的捨棄,最右邊補0
/*
00001010 10
00010100 20
11110110 -10
11101100 -20
*/
>> 右移 相當於/2 高位補符號位
System.out.println(a>>1); //右移1位,最右邊的捨棄,高位補符號位
/*
11110110 -10
11111011 -5
*/
>>>無符號右移 高位補0
System.out.println(a>>>1); //2147483643
/*
11111111 11111111 11111111 11110110 -10
01111111 11111111 11111111 11111011 2147483643
*/
5.補充:
①交換a,b的值的三種方式
a b 交換值:
1. c = a a = b b = c
2. a = a^b b = a^b a = a^b
3. a = a+b b = a-b a = a-b
a2=a^b
b2=a2^b=a^b^b = b^b^a = 0^a = a
a3 = a2^b2 = a^b^a = a^a^b = 0^b = b
a2 = a+b
b2 = a2-b=a+b-b=a
a3 = a2-b2 = a+b-a = b
②面試題(異或)
異或用於加密:(最原始的加密方式)
加密:把原檔案的所有位元組和某一個數(這個數叫做祕鑰)做異或,這樣原檔案的資料就會改變。
解密:再把原檔案和祕鑰做異或,即可解密。
6.自動型別提升和型別轉換
自動型別提升:當小型別變數賦值給大型別變數時,會自動提升型別。
a+b
1. 如果a和b中有double ===> 結果值自動提升為double
2. 否則, 如果a和b中有float ===> float
3. 否則, 如果a和b中有long ===> long
4. 否則 ===> int
強制型別轉換/型別間賦值原則: 如果可能改變資料,則需要進行強制型別轉換。
整數間強轉,會捨去多餘的高位位元組。
浮點數強轉整數,會把小數點後的直接抹去。
public class TestCast{
public static void main(String[] args){
byte b = 1;
short s = 1;
int i = 1;
long l = 1L;
float f = 1.0F;
double d = 1.0;
char c = 'A';
s = b;
i = s;
l = i;
d = f;
i = c;
s = 128; // 00000000 10000000
b = (byte)s ; // 10000000,大型別變數轉小型別變數,直接把高位去掉。
System.out.println(b);//-128 型別間賦值可能會改變資料。
f = (float)d ;
i = (int)f;
s = (short)c; // c = 40000
f = l ;
}
}