1. 程式人生 > 其它 >Java自學小白——面向物件進階課程學習1

Java自學小白——面向物件進階課程學習1

這是我的第一篇隨筆(是文章嗎?)主要是為了複習一節課程中學習的知識,可以說是知識總結,手寫的筆記侷限太多,現在選擇使用部落格來記錄每天的學習成果。

今天是學習Java的第22天(但是寫的是前幾天的學習成果),因為還要上課進度就沒有很快,每天想著能學多少學多少,希望可以儘快學完。

面向物件進階課程——static靜態變數、繼承

一、static關鍵字

  • static是靜態的意思,可以修飾成員變數和方法

1.Static修飾成員變數

  • static修飾成員變量表示該成員變數在記憶體中只儲存一份,可以被共享訪問、修改。 
    • 示例:
    •  1 public class User {
       2     public
      static int onlineNumber = 161; 3 4 public static void main(String[] args) { 5 System.out.println(User.onlineNumber); 6 User u = new User(); 7 u.onlineNumber++; 8 System.out.println(u.onlineNumber); 9 System.out.println(User.onlineNumber); 10 11 }
      12 }

      這便是static修飾成員變數的一種形式。

(有沒有大佬指導下程式碼插入啊?是不是隻能是這樣的樣式,看程式碼的話需要花費一點時間。)

  •    成員變數可以分為兩類:
    •   靜態成員變數(有static修飾,是屬於類下的,記憶體中只加載一次
      • 訪問格式:類名.靜態變數成員      例:
      • 還有第二種訪問格式:物件.靜態成員變數(不推薦)
    •   例項成員變數(無static修飾,存在於每個物件中)

      • 訪問格式:物件.例項成員變數

    •   兩種成員變數在什麼情況下定義?
      • 靜態成員變數:表示線上人數等需要被共享的資訊。
      • 例項成員變數:屬於每個物件,且每個物件資訊不同時
  •   static修飾成員變數的記憶體原理
    • 建立的物件訪問Static修飾的成員變數都是記憶體中的同一個地址 

2.static修飾成員方法的基本用法

  •  成員方法的分類
    •   靜態成員方法(有static修飾,屬於類下)
      •   訪問格式:類.靜態成員方法
    •   例項成員方法(無static修飾,屬於物件下)
      •   訪問格式:物件.例項成員方法
      • 注:如果是以執行一個通用功能為目的,或需要方便訪問,可以申明成靜態方法
  • 案例練習:
    • 員工類程式碼如下(還沒有寫註釋的習慣,這個要改)
    •  主函式如下:

  • 修飾成員方法的記憶體原理

 

3.static的實際應用案例

  • 工具類 :工具類中定義一些靜態方法,每個方法都是以完成一個共用的功能為目的。
    • 注意:1.建議工具類的構造器私有化處理 2.工具類不需要建立物件(直接用類名訪問即可)
    • 使用場景:
    •  

      好處:1.內部都是靜態方法,每個方法完成一個功能(呼叫方便) 2.一次編寫,處處可用(提高程式碼複用性)

    • 案例:
    •  

      程式碼:

       1 public class ArrayUtils {
       2 
       3     private ArrayUtils() {
       4 
       5     }
       6 
       7     public static String toString(int[] arr){
       8         String pri = "[";
       9         int j = 0;
      10         for (int i = 0; i < arr.length; i++) {
      11             j = arr[i];
      12             if(i == arr.length-1){
      13                 pri += j ;
      14             }else{
      15                 pri += j + "," ;
      16             }
      17         }
      18         pri += "]";
      19         return pri ;
      20     }
      21     
      22     public static double getAverage(double[]arr1){
      23         double max =arr1[0];
      24         double min =arr1[0];
      25         double j = 0.0;
      26         double sum = arr1[0];
      27         for (int i = 1; i < arr1.length; i++) {
      28             sum += arr1[i];
      29             j = arr1[i];
      30             if(max > j){
      31                 max = j ;
      32             }
      33             if (min < j){
      34                 min =j;
      35             }
      36         }
      37       sum = (sum -max -min)/ (arr1.length-2);
      38         return sum ;
      39     }
      40 
      41 
      42 }

       

    • 主函式:(經典不寫註釋)

 

4.static訪問的注意事項

  • 靜態方法只能訪問靜態的成員,不可以直接訪問例項成員
  • 例項方法可以訪問靜態的成員,也可以訪問例項成員
  • 靜態方法中是不可以出現this關鍵字的

二、static應用知識

1.程式碼塊

  • 程式碼塊是類的五大成分之一(成員變數、構造器、方法、程式碼塊、內部類),定義在類中方法外
  • 在Java類下,使用 {} 括起來的程式碼被稱為程式碼塊  
  • 案例:

  •  (程式碼不見了,有時間重新敲一遍補上)

  •  靜態程式碼塊的作用

    • 在啟動系統時對資料進行初始化,程式碼優雅

2.單例設計模式

  • 單例模式

    • 可以保證系統中,應用該模式的這個類永遠都只有一個例項,即一個類永遠只能建立一個物件(例如工作管理員)

  • 餓漢單例設計模式
    • 在獲取物件前,物件已經為你提前建立好了。
    • 設計步驟:
      • 定義一個類,把構造器私有
      • 定義一個靜態變數儲存一個物件
  • 懶漢設計模式
    • 在真正需要一個物件的時候,才去建立一個物件(延遲載入物件)。
    • 設計步驟 :
      • 定義一個類,把構造器私有。
      • 定義一個靜態變數儲存一個物件。
      • 提供一個返回單例物件的方法

二、繼承 

  • 什麼是繼承
    • Java中提供一個關鍵字extends使一個類和另一個類建立起父子關係
    • 繼承的格式
      • 子類 extends 父類  例:public class Student extends People {}
    • Student 稱為子類(派生類),People 稱為父類(基類或超類)。
  • 使用繼承的好處
    • 子類繼承父類後,就可以直接使用父類的公共的屬性和方法了。
  • 繼承後子類的特點
    • 子類繼承父類,子類可以得到父類的屬性和行為,子類可以使用
    • Java中子類更加強大
  • 繼承設計規範
    • 子類們相同特徵(共性屬性,共性方法)放在父類中定義,子類獨有的屬性和行為應定義在子類自己裡面。
    •     案例
    •   
    •   父類:

    •   

    • 學生子類:

    •   

    • 教師子類:

    •   

    • main方法:

    •   

    • 執行結果:

    •   

       

  • 執行記憶體原理:

 

    •   物件是子類的物件,子類的物件中會開闢父類空間和子類空間。父類的成員會在父類空間儲存。子類的成員會在子類空間儲存,但用的都是同一個子類物件的地址
  • 繼承的特點
    • 子類可以繼承父類的屬性和行為,但是子類不能繼承父類構造器
    • 子類可以繼承父類的私有成員,但是不能直接訪問(有爭議)
    • 子類可以直接用子類名訪問父類私有靜態成員,但這並不是繼承,只是共享地去訪問父類靜態成員
    • Java是單繼承模式,一個類只能繼承一個父類
    • Java不支援多繼承,但是支援多層繼承
    • Java中所有的類都是Object類的子類
  • 繼承後子類方法中訪問成員(成員變數、成員方法)的特點:
  • 如果子父類中出現了重名的成員,會優先使用子類的,此時如果一定要在子類中使用父類,應:
  • 方法重寫
    • 在繼承體系中,如果子類出現和父類一模一樣的方法宣告,則稱子類的方法是重寫的方法。
  • @Override重寫註解
  • 方法重寫的注意事項和要求

 

  • 子類繼承父類後構造器的特點:
    • 子類中所有的構造器預設都會先訪問父類的無參構造器,在執行自己的構造器
    • 子類的構造器第一行預設是:super();不寫也會存在。

  • 子類構造器訪問父類有參構造器
    • 通過super(.......);手動呼叫父類有參構造器。
      • 作用:通過呼叫父類有引數構造器來初始化繼承父類的資料。
  • this與super的使用總結
    • this和super的使用注意點: