物件和類

2020-08-14 11:06:38

java語言

主要特性-java白皮書的關鍵術語

  • 簡單
  • 物件導向的
  • 分佈式
  • 解釋性
  • 健壯性
  • 安全性
  • 體系結構中立
  • 可移植性
  • 高效能
  • 多執行緒

基本數據型別

  • 概要:java是一種強型別語言,必須爲每一個變數宣告一種型別

  • 整形

    • int
      • 4位元組:-2 147 483 648 ~2 147 483 647
      • 較常用
    • short
      • 2位元組:-32 768 ~32 767
      • 用於特定場合,底層的檔案處理或者需要控制佔用 儲存空間量的大陣列
    • long
    • 8位元組:-9 223 372 036 854 775 808 ~9 223 372 036 854 775 807
    • byte
      • 1節字:-128~127
      • 用於特定場合,底層的檔案處理或者需要控制佔用 儲存空間量的大陣列
  • 注意事項

    • 長整型數值有一個後綴 L 或 1 ( 如 4000000000L。) 十六進制數值有一字首 Ox 或 0X (如 OxCAFEL 八進制有一個字首 0 , 例如, 010 對應八進制中的 8。 很顯然, 八進制表示法比較 容易混淆, 所以建議最好不要使用八進制常數。
  • 浮點型

    • float
      • 4位元組:有效位數爲6-7位
      • float 型別的數值有一個後綴 F 或 f (例如,3.14F。) 沒有後綴 F 的浮點(如 3.14 ) 默 認爲 double 型別。當然,也可以在浮點數值後面新增後綴 D 或 d (例如,3.14D)
    • double
      • 8個位元組:有效位數爲15位
    • 特殊浮點數值: 所有的浮點計算都遵循IEEE 754規範,一個正整數除以0的結果爲正無窮大,計算0或者負數的平方根結果爲NaN
      • 正無窮大:Double_POSITIVE_INFINITY
      • 負無窮大:Double.NEGATIVEJNFINITY
      • NaN(不是一個數字):Double.NaN
  • char型別

    • char型別的字面量值要用單引號括起來
  • boolean型別

    • boolean
    • false和true.整型值和布爾值不能進行相互轉換

變數

  • 變數:每個變數都有一個型別
    • 範圍:AZ,az,_,$
    • 範例:double salary;
    • 注意事項:
      • 雖然$是一個合法字元,但是不要在自己的程式碼使用這個字元,他只用於Java編譯器和其他工具生成的名字
      • 變數名對大小寫敏感
  • 常數:利用關鍵字final來指示常數
    • 關鍵字final表示這個變數只能被賦值一次,一旦被賦值,就不能再更改了
    • 變數名使用全大寫
    • 在Java中,經常希望某個常數可以在一個類的多個方法中使用,通常將這些常數叫做類常數,使用static final進行修飾
      • public static final double PI=3.14
  • 列舉型別:enum Size{large,small,}
  • 字串:爲不可變字字串,Java 沒有內建的字串型別, 而是在標準 Java 類庫中提供了 一個預定義類,很自然地叫做 String。
    • substring
    • + 號連線
    • equals
    • 空串 與 Null串
      • 空串 「」 是長度爲 0 的字串。空串是一個 Java 物件, 有自己的串長度( 0 ) 和內容(空)。String 變數還可以存 放一個特殊的值, 名爲 null,
      • 要檢查一個字串是否爲 null, 要使用以下條件:if (str == null)
    • length:返回採用 UTF-16 編碼表示的給定字串所需要的程式碼單元數量
    • s.charAt(n) 將返回位置 n 的程式碼單元,n 介於 0 ~ s.length()-l 之間
    • 字串轉陣列:int[] codePoints = str.codePoint().toArray();
    • 碼點陣列轉字串:String str = new String(codePoints, 0, codePoints.length);
    • String提供了五十多個方法
  • 構建字串:有些時候, 需要由較短的字串構建字串。採用字 符串連線的方式達到此目的效率比較低。
    • StringBuilder()
    • int length()
    • StringBuilder append(String str)
    • StringBuilder append(char c)
    • 運算子號:運算子號之間有優先順序
      • 運算子:+ 加-減 *乘 /除%取餘
      • 數學函數與常數
      • 數值之間進行轉化
      • 自增自減:字首會先完成加一,後綴會使用原來變數的值
      • 關係和boolean:3==7–結果是false
      • 位運算子
      • 移位運算子>>和<<
  • 大數:BigInteger和BigDecimal
    • add
    • subtract
    • multiply
    • divide

輸入輸出

  • 讀取輸入:Scanner in = new Scanner(System.in);
    • nextLine()下一行內容
    • next下一個單詞
  • 密碼讀取–爲輸入是可見的, 所以 Scanner 類不適用於從控制檯讀取密碼
    • Console cons = System.console();
    • String username = cons.readLine("User name: ");
    • char[] passwd = cons.readPassword(「Password:」);
  • 格式化輸出:System.out.printf("%8.2f",x) 與C類似
    • 列印當前時間:System.out.printfCXtc", new Date());
  • 檔案的輸入和輸出

控制流程

  • 塊控制域:塊(即複合語句)是指由一對大括號括起來的若幹條簡單的 Java 語句。塊確定了變數的作用域。不能在巢狀的兩個塊中宣告同名的變數。

  • 條件語句:if (condition) statement

  • 回圈

    • while (condition) statement 條件爲真時,while回圈體一次也不執行(先判定)
    • do statement while(condition) 先執行語句
  • 確定回圈

    • for(對計數器初期化,;判定條件,;更新計數器)
  • 多重選擇:switch語句

    switch(choice){
    	case 1:--- break;
        case 2:---break;
        default:-----break;
        }
    
    • case 標籤 char byte short int java SE 7 開始 case 標籤還可以字串字面量
  • 中斷控制流程語句

    • goto作爲保留,但實際上並沒有打算在語言裡使用它

    • java中帶標籤的break

      label:
      {
      if (condition) break label ] // exits block
      }
      …
      
    • continue跳過本次回圈

陣列

  • 陣列宣告,初始化,初始化匿名陣列

    int [] a;  //這條語句只宣告瞭變數 a,並沒有將 a 初始化爲一個真正的陣列,應該使用 new 運算子建立陣列。
    int [] a=new int [100];  //這條語句建立了一個可以儲存 100 個整數的陣列。陣列長度不要求是常數:newint[n] 會建立一個長度爲 n 的陣列。
    **警告**: 如果建立了一個 100 個元素的陣列, 並且試圖存取元素 a[100] (或任何在 0 ~ 99之外的下標,) 程式就會引發「 array index out of bounds」 異常而終止執行。
    int[] small Primes = { 2, 3, 5, 7, 11, 13 };  //在 Java中, 提供了一種建立陣列物件並同時賦予初始值的簡化書寫形式。
    new intD { 17, 19, 23, 29, 31, 37 }  //初始化匿名陣列
    small Primes = new int[] { 17, 19, 23, 29, 31, 37 };   //使用這種語法形式可以在不建立新變數的情況下重新初始化一個數組
    
  • for each回圈

    for (int element : a)
    System.out.println(element)
    
  • 陣列拷貝

    //允許將一個數組變數拷貝給另一個數組變數。這時, 兩個變數將參照同一個陣列:
    intQ luckyNumbers = smallPrimes;
    1uckyNumbers[S] = 12; // now smallPrimes[5] is also 12
    //如果希望將一個數組的所有值拷貝到一個新的陣列中去,就要使用 Arrays 類的 copyOf方法:
    int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers , luckyNumbers.length);
    
  • 陣列排序

    int [] a=new int[10000];
    Arrays.sort(a)
    
  • 多維陣列

    //在 Java 中,宣告一個二維陣列相當簡單
    double [][] balances;
    //與一維陣列一樣,在呼叫new對多維陣列進行初始化之前不能使用它
    balances=new double[NYEARS][NRATES];
    //如果知道陣列元素, 就可以不呼叫 new, 而直接使用簡化的書寫形式對多維陣列進行初始化
    int[][] magicSquare =
    {
        {16, 3, 2, 13},
        {5, 10, 11, 8},
        (9, 6, 7, 12},
        {4, 15, 14, 1}
    };
    //for each處理二維陣列
    for (doubleG row : a)
        for (double value : row)
            do something with value
    //快速列印二維陣列的數據列表
    System.out.println(Arrays.deepToString(a));
    

物件和類

  • ( class) 是構造物件的模板或藍圖。由類構造(construct) 物件的過程稱爲建立類的範例 (instance ).
    • 物件 中的數據稱爲範例域( instance field ), 操縱數據的過程稱爲方法( method )。
    • 對於每個特定的 類範例(物件)都有一組特定的範例域值。這些值的集合就是這個物件的當前狀態( state )。
  • 類之間的關係
    • 依賴(「user-a」)
      • 應該儘可能地將相互依賴的類減至最少,讓類之間的耦合度最小。
    • 聚合(「has-a」)
      • 是一種具體且易於理解的關係。例如, 一個 Order 物件包含一些 Item 物件。聚合關係意味着類 A 的物件包含類 B 的物件。
    • 繼承(「is-a」)
      • 是一種用於表示特殊與一般關係的

物件

  • 物件的三個主要特性:

    • 物件的行爲(behavior) —可以對物件施加哪些操作,或可以對物件施加哪些方法?
    • 物件的狀態(state ) —當施加那些方法時,物件如何響應?
    • 物件標識(identity ) —如何辨別具有相同行爲與狀態的不同對象?
  • 構造物件

    //構造器的名字應該與類名相同。因此 Date 類的構造器名爲 Date。要想構造一個 Date 物件, 需要在構造器前面加上 new 操作符,
    new Date()
    
  • 物件變數和物件

    //定義了一個物件變數 deadline, 它 可 以 引 用 Date 型別的物件。但是,一定要認識到: 變數deadline 不是一個物件, 實際上也沒有參照物件。此時,不能將任何 Date 方法應用於這個變數上
    s = deadline.toStringO; // not yet
    //必須首先初始化變數 deadline,可以用新構造的物件初始化這個變數:
    deadline = new Date();
    //這個變數參照一個已存在的物件
    deadline = birthday;
    //在 Java 中,任何物件變數的值都是對儲存在另外一個地方的一個物件的參照。
    Date deadline = new Date();  //表達式 new Date() 構造了一個 Date 型別的物件,並且它的值是對新建立物件的參照。這個參照儲存在變數deadline中。
    //可以顯式地將物件變數設定爲null,表明這個物件變數目前沒有參照任何物件。
    deadline = null;
    if (deadline != null)
    System.out.println(deadline);
    如果將一個方法應用於一個值爲 null 的物件上,那麼就會產生執行時錯誤。
    birthday = null;
    String s = birthday.toStringQ; // runtime error!
    //區域性變數不會自動地初始化爲 null,而必須通過呼叫new或將它們設定爲null進行初始化
    
  • 構造器

    • 構造器與類同名
    • 每個類可以有一個以上的構造器
    • 構造器可以有 0 個、1 個或多個參數
    • 構造器沒有返回值
    • 構造器總是伴隨着 new 操作一起呼叫
  • 隱式參數和顯式參數

    //第一個參數稱爲隱式 ( implicit ) 參數, 是出現在方法名前的 Employee 類物件。第二個參數位於方法名後面括號中的數值,這是一個顯式 ( explicit) 參數
    number007. raiseSalary(5);
    public void raiseSalary(double byPercent){
    double raise = salary * byPercent / 100;
    salary += raise;
    }
    
  • final範例域

    • final 修飾符大都應用於基本 (primitive ) 型別域,或不可變(immutable) 類的域(如果類 中的每個方法都不會改變其物件, 這種類就是不可變的類。例如,String類就是一個不可變的類)

      //對於可變的類, 使用 final 修飾符可能會對讀者造成混亂。例如,
      private final StringBuiIcier evaluations;
      //在 Employee 構造器中會初始化爲
      evaluations = new StringBuilder();
      //final 關鍵字只是表示儲存在 evaluations 變數中的物件參照不會再指示其他 StringBuilder物件。不過這個物件可以更改:
      public void giveGoldStarO{
      evaluations.append(LocalDate.now() + ": Gold star!\n");
      }
      
  • 靜態域與靜態方法

    • 靜態域

      //現在, 每一個僱員物件都有一個自己的 id 域, 但這個類的所有範例將共用一個 iiextld域。換句話說, 如果有 1000 個 Employee 類的物件, 則有 1000 個範例域 id。但是, 只有一個靜態域 nextld。即使沒有一個僱員物件, 靜態域 nextld 也存在。它屬於類,而不屬於任何獨立的物件
      class Employee{
      private static int nextld = 1;
      private int id;
      }
      
    • 靜態常數

      //如果關鍵字 static 被省略, PI 就變成了 Math 類的一個範例域。需要通過 Math 類的物件存取 PI,並且每一個 Math 物件都有它自己的一份 PI 拷貝。
      public class Hath{
      public static final double PI = 3.14159265358979323846;
      }
      
    • 靜態方法

      //靜態方法是一種不能向物件實施操作的方法。例如, Math 類的 pow 方法就是一靜態方法。可以認爲靜態方法是有this參數的方法
      Math.pow(x, a)
      使用靜態方法的情況
      **一個方法不需要存取物件狀態,其所需參數都是通過顯式參數提供(例如:Math.pow)**
      Employee中的靜態方法不能存取Id 範例域, 因爲它不能操作物件。但是靜態方法可以存取自身類中的靜態域
      **一個方法只需要存取類的靜態域(例如:Employee.getNextld)**
      
    • 工廠方法

      //靜態方法還有另外一種常見的用途。類似 LocalDate 和 NumberFormat 的類使用靜態工廠方法 (factory method)來構造物件
      NumberFormat currencyFormatter = NumberFormat.getCurrencylnstanceO;
      NumberFormat percentFormatter = NumberFormat.getPercentlnstance();
      double x = 0.1;
      System.out.println(currencyFormatter.format(x)); // prints $O.10
      System.out.println(percentFomatter.format(x)); // prints 10%
      
    • 方法參數

      //首先回顧一下在程式設計語言中有關將參數傳遞給方法(或函數)的一些專業術語。按值呼叫 (call by value) 表示方法接收的是呼叫者提供的值。而按參照呼叫 ( call by reference)表示方法接收的是呼叫者提供的變數地址。
      //Java總是按值呼叫
      C++,Pascal提供了兩種參數傳遞的方式
      
      • 一個方法不能修改一個基本數據型別的參數(即數值型或布爾型)。
      • 一個方法可以改變一個物件參數的狀態。
      • 一個方法不能讓物件參數參照一個新的物件。
  • 物件構造

    • 過載

      //有些類有多個構造器。例如, 可以如下構造一個空的 StringBuilder 物件:
      StringBuilder messages = new StringBuilder();
      //或者, 可以指定一個初始字串:
      StringBuilder todoList = new StringBuilder('To do:\n");
      //這種特徵叫做過載( overloading。) 如果多個方法(比如, StringBuilder 構造器方法)有相同的名字、 不同的參數,便產生了過載。編譯器必須挑選出具體執行哪個方法,它通過用各個方法給出的參數型別與特定方法呼叫所使用的值型別進行匹配來挑選出相應的方法。如果編譯器找不到匹配的參數, 就會產生編譯時錯誤,因爲根本不存在匹配, 或者沒有一個比其他的更好。(這個過程被稱爲過載解析(overloading resolution)。)
      

      要完整地描述一個方法, 需要指出方法名以及參數型別。這叫做方法的簽名(signature)

      indexOf(int)
      indexOf(int, int)
      indexOf(String)
      indexOf(String, int)
      //返回型別不是方法簽名的一部分。也就是說, 不能有兩個名字相同、 參數型別也相同卻返回不同類型值的方法。
      
    • 預設域初始化

      如果在構造器中沒有顯式地給域賦予初值,那麼就會被自動地賦爲預設值: 數值爲 0、 布爾值爲 false、 物件參照爲 null。然而,只有缺少程式設計經驗的人纔會這樣做。確實, 如 果不明確地對域進行初始化,就會影響程式程式碼的可讀性。

    • 無參數的構造器

      //很多類都包含一個無參數的建構函式,物件由無參數建構函式建立時, 其狀態會設定爲適當的預設值。
      public Employee0
      {
      name =""
      salary = 0;
      hireDay = LocalDate,now();
      }
      

      如果在編寫一個類時沒有編寫構造器, 那麼系統就會提供一個無參數構造器。這個構造 器將所有的範例域設定爲預設值。於是, 範例域中的數值型數據設定爲 0、 布爾型數據設定 爲 false、 所有物件變數將設定爲 null。 如果類中提供了至少一個構造器, 但是沒有提供無參數的構造器, 則在構造物件時如果 沒有提供參數就會被視爲不合法。

    • 顯示域初始化

      //通過過載類的構造器方法,可以採用多種形式設定類的範例域的初始狀態。確保不管怎樣呼叫構造器,每個範例域都可以被設定爲一個有意義的初值,這是一種很好的設計習慣。
      
    • 參數

    • 呼叫另外一個構造器

    • 初始化數據域的方法

      • 在構造器中設定值

      • 在宣告中賦值

      • 初始化塊

        由於初始化數據域有多種途徑,所以列出構造過程的所有路徑可能相當混亂。下面 下麪是調 用構造器的具體處理步驟:

        1. 所有數據域被初始化爲預設值(0、false 或 null。
        2. 按照在類宣告中出現的次序, 依次執行所有域初始化語句和初始化塊。
        3. 如果構造器第一行呼叫了第二個構造器,則執行第二個構造器主體
        4. 執行這個構造器的主體.
    • 物件解構與 finalize 方法

      • 有些物件導向的程式設計語言,特別是 C++, 有顯式的解構器方法,其中放置一些當對 象不再使用時需要執行的清理程式碼。在解構器中, 最常見的操作是回收分配給物件的儲存空 間。由於 Java 有自動的垃圾回收器,不需要人工回收記憶體, 所以 Java 不支援解構器。
      • 當然,某些物件使用了記憶體之外的其他資源, 例如,檔案或使用了系統資源的另一個對 象的控制代碼。在這種情況下,當資源不再需要時, 將其回收和再利用將顯得十分重要。
      • 可以爲任何一個類新增 finalize 方法。finalize 方法將在垃圾回收器清除物件之前呼叫。
    • 類的匯入
    • 靜態匯入
    • 將類放入包中
    • 包作用域
  • 類路徑

    • 設定類路徑
  • 文件註釋

    • 註釋插入
    • 類註釋
    • 方法註釋
    • 域註釋
    • 通用註釋
    • 包與概述註釋
    • 註釋的抽取