1. 程式人生 > >CoreJava學習第二課

CoreJava學習第二課

一:程式設計習慣(很重要!!!提高程式可讀性)

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 ; 
    	}
    }