1. 程式人生 > 實用技巧 >java修飾符詳解

java修飾符詳解

  1. 訪問修飾符

    public:公共的

    protected:受保護的(不能修飾類)

    default(預設不寫)

    private:私有的(不能修飾類)

    修飾符 當前類 同一包內 被繼承的類(同包) 被繼承的類(不同包) 其他包
    public 能訪問 能訪問 能訪問 能訪問 能訪問
    protected 能訪問 能訪問 能訪問 能/不能 不能訪問
    default 能訪問 能訪問 能訪問 不能訪問 不能訪問
    private 能訪問 不能訪問 不能訪問 不能訪問 不能訪問

    注:

    protected:

    • 基類的 protected 成員是包內可見的,並且對子類可見
    • 若子類與基類不在同一包中,那麼在子類中,子類例項可以訪問其從基類繼承而來的protected方法,而不能訪問基類例項的protected方法
  2. 特徵修飾符

    abstract:抽象的
    1. 修飾方法

      用abstract修飾符修飾的方法 只有方法的結構 沒有方法執行體叫做抽象方法

      注:native修飾的方法雖然也沒有方法體 但不是抽方法,過程是其他語言寫的

      public class Person(){
          //被abstract修飾的方法沒有方法體
          public abstract void medth();
      }
      
    2. 修飾類

      用abstract修飾符修飾的類 叫做抽象類

      public abstract class Person(){
          //抽象類裡面可以有抽象方法 也可以有普通方法
          //抽象方法
          public abstract void medth();
          //普通方法
          public void medth1(){
              System.out.println("這是一個普通方法");
          }
      }
      
    3. 特點

      • 抽象類中不是必須要有抽象方法

      • 抽象方法必須放在抽象類中或者介面中,普通類中不允許有抽象方法

    4. 如何使用

      • 抽象類中含有構造方法,但是我們不能通過呼叫構造方法直接建立物件
      • 抽象類只能通過子類繼承來做事
      //定義一個抽象類
      public abstract class Person(){
          public abstract void run();
      }
      //定義一個類 並繼承Person
      public class Son extends Person(){
          //重寫Person中的run方法
           @Override
          public void run() {
              System.out.println("這是我繼承我的父類重寫的方法");
          }
      }
      public static void main(String[] args) {
          son son=new son();
          son.run();
      }
      

      以上程式執行結果為:

      這是我繼承我的父類重寫的方法
      

      5.類和類之間的關係:

      • 抽象類---單繼承---抽象類
      • 抽象類---單繼承---具體類 (一般不會出現)
      • 具體類---單繼承---抽象類 不可以(將父類的抽象方法具體化或子類也變成抽象類)
    final:最終的 不可改變的
    • 修飾變數

      如果儲存的是值型別:變數內的值不讓更改---常量

      如果儲存的是引用型別:變數裡面的地址引用不讓更改---物件唯一

    • 修飾屬性

      屬性如果沒有賦值 有預設值存在的

      屬性用final修飾後必須給屬性賦初始值,否則會編譯錯誤

    • 修飾方法

      方法是最終的方法 不可以更改(覆蓋)

      final修飾的方法,要求不可以被子類重寫(覆蓋)

    • 修飾類本身

      類是最終的 不可以更改、

      (太監類)此類不可以被其它子類繼承

    static:靜態的
    • 修飾變數:

      • static修飾的成員變數也叫做靜態變數,也叫作類變數,說明這個變數屬於類的,而不是屬於物件的
      • 被所有的物件共享,在記憶體中只有一個副本,static成員變數的初始化順序按照定義的順序進行初始化
      • 靜態變數必須要靜態成員才能呼叫或者訪問
      public class Test(){
          //定義一個靜態變數
          static String name;
          //這裡定義一個靜態方法  注意:要想使用靜態變數 方法也必須定義成靜態方法 
          //如果不定義成靜態方法 呼叫靜態變數就會報錯
          public static void medth(){
              name="定義的靜態變數";
              System.out.println(name);
          }
          public static void main(String[] args){
              medth();
          }
      }
      

      以上程式執行的結果為:

      定義的靜態變數
      
    • 修飾方法:

      被static修飾的方法也叫做靜態方法,因為對於靜態方法來說是不屬於任何例項物件的

      public class Test(){
      	//定義一個靜態變數
          static String name;
          //定義一個普通的變數
          int age;
          //定義一個靜態方法
         public static void medth(){
             	//列印輸出靜態name	
               System.out.println(name);
              //列印輸出普通變數age
               System.out.println(age);
            }
          public static void main(String[] args) {
              medth();
            }
      }
      

      以上程式執行的結果:

      • age是訪問不到的,會報錯誤:無法從靜態上下文中引用非靜態變數age

      注:

      靜態變數和普通變數的區別:

      • 靜態變數屬於類變數 成員變數屬於物件變數
      • 靜態變數儲存在方法區的靜態區 成員變數儲存在記憶體中的堆
      • 靜態變數隨著類的載入而載入,隨著類的消失而消失
      • 成員變數隨著物件的載入而載入,隨著物件的消失而消失
      • 靜態通過類名呼叫 成員變數通過物件呼叫

    特點:

    • 靜態元素在類載入時就初始化了
    • 靜態元素儲存在靜態元素區中,每一個類有一個自己的區域,與別的類不衝突
    • 靜態元素只加載一次(只有一份)全部的類物件及類本身共享
    • 由於靜態元素區載入的時候,有可能沒有建立物件,可以通過類名字直接訪問
    • GC機制時無法管理靜態元素的,可以認為是常駐記憶體
    • 非靜態成員中可以訪問靜態成員
    • 靜態成員中可以訪問靜態成員
    • 靜態成員中不可以訪問非靜態成員
    • 在靜態元素中不能出現this或super
    native:本地的

    java原始碼中看到native就已經看不到後續的程式碼了

    後續會呼叫其他語言C++ C執行的記憶體操作 幫我們操作記憶體