1. 程式人生 > 實用技巧 >Java基礎[學習筆記]

Java基礎[學習筆記]

Java基礎

0. Hello World

//HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
};

1. classpath

2. 註釋

  • 單行 //
  • 多行
  • javadoc註釋

3. public class 和 class區別

4. 識別符號

  • 字母、數字、下劃線、$
  • 數字不能開頭
  • 命名規範
    • 類名、介面名:首字母大寫,後面每個單詞首字母大寫
    • 方法名、變數名:首字母小寫,後面每個單詞首字母大寫
    • 常量名:全部大寫
    • 駝峰規則:SystemService UserService CustomerService

5. 關鍵字

class extends implements interface import
package break case continue default
do if else for return
switch while false true null
boolean byte char short int
long float double try catch
throw throws finally abstract fianl
native private protected public static
synchronized transient volatile instanceof new
super void assert enum goto
const

6. 字面值

字面值就是資料

  • 10、100 //整數型字面值
  • 3.14 //浮點型字面值
  • "abc" //字串型字面值
  • 'a'、'人' //字元型字面值,單引號中只能放單個字元,屬於字元型字面值
  • true、false //布林型字面值

 ASCII:  A-66; a-97; 0-48

7. 變數

本質上是記憶體中的一塊空間,這塊空間有自己的“資料型別”、“名字”、“字面值【資料】”

  1. 資料型別

    1. 作用

      • 不同資料有不同的型別,不同的資料型別底層會分配不同大小的空間
      • 資料型別是指導程式在執行階段應該分配多大的記憶體空間
    2. 要求

      • 具體儲存的“字面值【資料】”必須和變數設定的“資料型別”一致,不一致時編譯報錯
    3. 宣告

      資料型別 變數名;
      
    4. 賦值

      變數名 = 字面值;
      //= 是賦值運算子:先運算等號右邊的表示式,表示式的結果複製給左側的變數
      
      //宣告和賦值可以同時執行,即宣告和變數初始化同時進行
      資料型別 變數名 = 字面值;
      
      //一行可以宣告多個同類型變數
      資料型別 變數名1,變數名2,變數名3
      eg.
      int a,b,c = 300; //a,b未初始化,c初始化為300
      
    5. 作用域

      • 作用域:變數的有效範圍

      • 作用範圍
        出了大括號就不認識;
        for迴圈,變數的作用域只在for迴圈中(依然滿足出了大括號就不認識)

      • 變數根據出現的位置進行劃分:
        在方法體當中宣告的變數:區域性變數
        在方法體之外,類體內宣告的變數:成員變數 //類體中不能直接編寫java語句,除了變數宣告
        重點依據是:宣告的位置
        在不同作用域中,變數名可以相同
        變數遵循就近原則

        class b {
            //成員變數
            static int a = 100;
            public static void main(String[] args) {
                //區域性變數
                int a = 1000;
        
                //就近原則
                System.out.println(a);
           }
        }
        

8. 資料型別

作用

每一個數據都是有相關型別的,不同型別的資料佔用空間大小不同。  
資料型別的作用是知道JVM在執行程式的時候給該資料分配多大的空間

資料型別

- 基本資料型別
- 引用資料型別  
  字串"abc"不屬於基本資料型別,而是屬於引用資料型別
    字元型使用單引號  
    字串型使用雙引號

關於基本資料型別

  • 四大類八小種
    • 整數型
      byte,short,int,long
    • 浮點型
      float,double
    • 布林型
      boolean
    • 字元型
      char
  • 佔用空間
    基本資料型別 佔用空間(bytes)
    byte 1
    short 2
    int 4
    long 8
    float 4
    double 8
    boolean 1
    char 2
  • 取值範圍
    基本資料型別 取值範圍
    byte -27 ~ 27-1 (-128~127)
    short -215 ~ 215-1(-32768~32767)
    int -231 ~ 231-1(-2147483648~2147483647 ±21億)
    long -263 ~ 263-1
    float ±3.40282347e+38(有效位數6~7位)
    double ±1.79769313486231570e+308(有效位數15位)
    boolean true/false
    char 02<sup>16</sup>-1(065535)
  • 預設值
    成員變數宣告時未賦值,那麼會自動賦預設值;(區域性變數不會)
    八種基本資料型別的預設值是一切向0看齊
    基本資料型別 預設值
    byte,short,int.long 0
    float,double 0.0
    boolean false(0)
    char \u000
    注: \u000 \u開頭後面跟的一串, 為該字元的unicode編碼

原碼、反碼、補碼

精度損失

整型

預設被當作int
l/L指定該字面值為long型別
0 開始=>八進位制
0x 開始=>十六進位制

浮點型資料

預設被當作double
f/F指定該字面值為float型別

  • float 4位元組 單精度
  • double 8位元組 雙精度(精度較高,但對於財務軟體而言還是不夠高,SUN提供了java.math.BigDecimal)
    SE類庫 %JAVA_HOME%\jre\lib\rt.jar
    SE類庫原始碼 %JAVA_HOME%\src.zip
  • 指定float型別字面值
    1. float a = (float)5.5
    2. float b = 5.5f

布林型別

boolean,取值只能為true、false(在底層儲存的是時候,true=>1 false=>0)

轉換規則:

  1. 八種基本資料型別當中,除布林型別之外,剩餘的七種型別之間可以相互轉換
  2. 小容量向大容量轉換,稱為自動型別轉換,容量從小到大排序為:
byte < short < int < long < float < double  
       char  <

注:
(1)任何浮點型別不管佔用多少個位元組,都比整型容量大;
(2)char和short可表示的種類數量相同,但是char可以取更大的正整數

  1. 大容量轉換成小容量,稱為強制型別轉換,需要加強制型別轉換符,程式才能編譯通過。但是,在執行階段可能會損失精度,所以要謹慎使用。
  2. 當整數字面值沒有超出byte,short,char的取值範圍,可以直接賦值為byte,short,char型別的變數(由java程式在編譯時自己轉換,不影響精度)
  3. byte,short,char混合運算的時候,各自先轉換成int型別,再做運算。
  4. 多種資料型別混合運算,先轉換成容量最大的那種型別,再做運算。
    不要在編譯階段摻雜執行過程

9. 運算子

算術運算子
關係運算符
邏輯運算子
位運算子
賦值運算子
字串連線運算子
條件運算子
其他運算子

算數運算子

+
-
*
/ 商
% 餘數
++ 自加1
-- 自減2

  • a++ 和 ++a 的區別

++出現在變數前: 變數先自加1, 然後執行其他語句

int a =100;
System.out.println(++ i); //101
System.out.println(i);    //101

++出現在變數後: 先執行其他語句,然後變數自加1

int a =100;
System.out.println(i ++); //100
System.out.println(i);    //101

關係運算符

  1. 運算結果一定是true或者false
  2. 進行關係運算時(如a == b),比較是的a和b中儲存的值之間是否相等

邏輯運算子

& 邏輯與
| 邏輯或
! 邏輯非
^ 邏輯異或 (兩邊運算元不一樣,結果為true;兩邊運算元)

&& 短路與 結果和“邏輯與”相同
|| 短路或 結果與“邏輯或”相同

  1. 邏輯運算子要求運算元都是布林型別,並且邏輯運算子運算結果也是布林型別
  2. 短路現象

賦值運算子

基本賦值運算子 =
擴充套件賦值運算子 +=、-=、*=、/=、%=
 擴充套件類的賦值運算子不改變運算結果型別。
  byte b = 1
  b += 4 => b = (byte)(b + 4)

字串連線運算子

"+"
 1) 加法運算,求和
 2) 字串的連線運算
 注1: 加號兩邊的運算元有一個是字串時,就會執行連線運算
&nbsp:注2: 執行從左至右執行,括號優先 System.out.println(10 + 10 + "10") => "2010"

int a = 10;
int b = 20;
System.out.println("10 + 20 = 30");
System.out.println(a + " + " + b + " = " + (a + b));

條件運算子/三元運算子

布林表示式 ? 表示式1 : 表示式2
注: 布林表示式true時, 選擇表示式1作為整個表示式結果, false時選擇表示式2

boolean sex = false;
sex ? '男' : '女'  //編譯報錯

//正確表達
char c = sex ? '男' : '女'
System.out.println(c);

//編譯報錯, 編譯器後面的三元運算子可為字元也可以為字串, 不能直接賦值給char型別的變數c
char c = sex ? '男' : '女'
System.out.println(c)
//編譯、執行正常: println可列印字元也可列印字串
System.out.println(sex ? "男" : '女');

//處理"錯誤: 編碼GBK的不可對映字元"
//javac -encoding UTF-8 xxx.java

10. 控制語句

java中控制語句分以下7種:

  • 控制選擇結構語句
    • if, if..else
    • switch
  • 控制迴圈結構語句
    • for
    • while
    • do while
  • 改變控制語句順序
    • break
    • continue

if語句

語法結構:

  1. if(布林表示式){java語句...}
  2. if(布林表示式){java語句...}else{java語句...}
  3. if(布林表示式){java語句...}else if(布林表示式){java語句...}...
  4. if(布林表示式){java語句...}else if(布林表示式){java語句...}...else{java語句};
    注: if(布林表示式) 一條java語句; 也是if語句的正確格式.

接受使用者鍵盤輸入

public class KeyInputTest{
    public static void main(String[] args){
        //建立鍵盤掃描器物件
        java.util.Scanner s = new java.util.Scanner(System.in);

        System.out.print("請輸入: ");
        //呼叫Scanner物件的next()方法開始接受使用者鍵盤輸入(當輸入回車鍵時, 鍵入的資訊會自動賦值給userInputContent)
        String userInputContent = s.next();

        //接收數字[以整數型int的形式來接收]
        int num = s.nextInt("請輸入: ");

        System.out.println(userInputContent);
        System.out.println(num);
    }
}

switch語句

語法結構:  
switch(int或string型別的字面值或變數){  
    case int或string型別的字面值或變數 :   
        java語句;  
        ...
    case int或string型別的字面值或變數 :   
        java語句;  
        ...
    ...
    default{

    }
}
//switch穿透(break可避免switch穿透):  
//  匹配成功的分支, 即可執行該分支下的java語句;但如果該分支中沒有break語句,那麼執行完該分支的java語句後,無論下一分支是否匹配,都會立刻執行下一分支的java語句。

 byte,short,char也可以直接作為switch的判斷,因為它們可以自動轉換到int型別

for迴圈

語法結構:  
for( 初始化表示式; 布林表示式 ; 更新表示式 ){  
    迴圈體
}
// 1. 初始表示式,布林表示式,更新表示式都不是必須的;但兩個分號不能省略
// 2. 布林表示式必須是true或這false
// 3. 初始化表示式最開始執行,並只執行一次

while迴圈和do..while迴圈

while (布林表示式) {
    迴圈體;
}

do {
    迴圈體
} while (布林表示式); //注意這個分號不要落下

11. 方法

[修飾符列表] 返回值型別 方法名(形式引數列表) {
    方法體;
}

/* 
  1. 修飾符列表:  
      * 可選項, 不是必須的(目前統一下稱public static)
      * 當方法的修飾符列表中有static時, 呼叫: *類名.方法名(實際引數列表); *
  2. 返回值型別: 
      * 支援所有資料型別;
      * 當不返回任何資料時,返回值型別必須為void; 當返回值型別不是void時,表示該方法執行結束以後必須返回一個具體的數值,且數值型別應該與返回值型別相同,不然會編譯報錯;
      * 當返回值型別是void時,不能返回任何值; 但是可以寫" return; "
      * return關鍵字標誌著方法結束
  3. 方法名
      * 合法的識別符號
      * 動+名詞結構
      * 字串首字母小寫,後面每個單詞首字母大寫
  4. 形參
      * 是區域性變數
      * 個數可以為[0, n], 形參之間用逗號隔開
*/

方法執行時的記憶體劃分

  • 1.方法只定義而沒有呼叫時,不分配記憶體空間;
  • 2.JVM記憶體有三塊主要的記憶體空間:
    • 方法區記憶體
    • 堆記憶體
    • 棧記憶體
  • 3.關於棧資料結構
    • 棧: stack, 是一種資料結構 //常見的資料結構: 陣列, 佇列, 棧, 連結串列, 二叉樹, 雜湊表/散列表......
    • 資料結構反應的是資料的一種儲存形態
    • 資料結構作為單獨的學科,不屬於任何程式語言的範疇, 只不過在大多數程式語言當中要使用資料結構
    • 程式設計師需要精通: 資料結構 + 演算法
  • 4.方法程式碼片段
    • 方法程式碼片段 屬於.class位元組碼檔案的一部分, 位元組碼檔案在類載入的時候, 將其放到 方法區記憶體 中, 所以方法區記憶體最先有資料
    • 程式碼片段在記憶體中雖然只存有一份,但是可以重複呼叫; 每一次呼叫方法的時候,需要給它分配獨立的活動場所,這個活動場所在 棧記憶體 中分配
      • 方法在呼叫時, 需要在棧中給它分配對立的記憶體空間, 此時發生壓棧/入棧動作; 方法執行結束之後, 給該方法分配的記憶體空間需要全部釋放, 此時發生彈棧/出棧動作
      • 區域性變數執行階段的記憶體在棧中分配: 區域性變數在"方法體"(即大括號"{}"之間)定義

方法的過載機制

功能相似但不相同時

  • 1.什麼時候考慮方法過載
    • 功能相似時, 儘可能讓方法名相同
    • 功能不相似/不同時, 儘可能不同
  • 2.滿足什麼條件構成方法過載
    • 在同一個類中
    • 方法名相同
    • 引數列表不同
      • 數量不同
      • 順序不同
      • 型別不同

方法的遞迴呼叫

  • 1.方法自身呼叫自身
  • 2.遞迴很耗費棧記憶體,能不使用盡量不使用
  • 3.當提示java.lang.StackOverflowError, 表示發生棧記憶體溢位錯誤; 此錯誤無法挽回,只有一個結果:JVM停止工作
  • 4.遞迴的函式必須要有結束條件,不然必會發生記憶體溢位
  • 5.遞迴的函式即使有的結束條件,也可能因為遞迴的太"深"了,而發生記憶體溢位
  • 6.必須使用遞迴方式的: 目錄拷貝

12.面向物件[JAVA核心機制]

面向過程和麵向物件的區別

  • 1.面向過程關注點: 實現的具體過程,因果關係

    • 優點: 業務簡單的程式可以快速開發, 前期投入少
    • 缺點: 很難解決非常複雜的業務邏輯; 耦合度非常高,只要一環出現問題,整個系統就會受到影響,導致軟體擴充套件力差; 沒有獨立體的概念,無法達到元件複用
  • 2.面向物件關注點: 物件(獨立體)能完成哪些功能

    • 優點: 耦合度低, 擴充套件性高; 解決複雜業務邏輯; 容易達到元件服用
    • 缺點: 前期投入高, 需要進行獨立提的抽取, 大量的系統分析與設計

面向物件的三大特徵: 封裝,繼承,多型

  • 1.封裝
  • 2.繼承
  • 3.多型

面向物件程式設計的生命週期:
  面向物件的分析: OOA
  面向物件的設計: OOD
  面向物件的程式設計: OOP

類和物件