JAVA-基礎知識-修飾符

JAVA-基礎知識-修飾符

大體上分兩類
訪問控制修飾符非訪問修飾符

訪問控制修飾符

在Java中一共有4種

  • 缺省(default,即默認,什麼也不寫):在同一包內可見,不使用任何修飾符。使用對象:類、接口、變量、方法。
  • private:在同一類內可見。使用對象:變量、方法。 注意:不能修飾類(外部類)
  • public: 對所有類可見。使用對象:類、接口、變量、方法
  • protected:對同一包內的類和所有子類可見。使用對象:變量、方法。 注意:不能修飾類(外部類)
修飾符 當前類 同一包內 子類(同一包內) 子類(不同包內) 其他包
public Y Y Y Y Y
protected Y Y Y Y/N N
缺省 Y Y Y N N
private Y N N N N

默認訪問修飾符-不使用任何關鍵字

一般類:使用默認(缺省)修飾符聲明的類與方法對於同一包內的類是可見的。
接口類:

  • 所有變量都是隱式聲明爲public static final
  • 所有方法默認聲明爲public

另外 接口的方法可以聲明default(不是缺省),寫方法體。

私有訪問修飾符-private

private不能修飾外部類,接口。
所有修飾的變量,方法,構造器都不能被外部訪問。
使用的目的在於隱藏類的實現細節和保護類的數據。

公共訪問修飾符-public

被聲明爲public的類,方法,構造器,接口都能被其他類訪問。
備註:一個java文件中只能有一個public修飾的類,類名要與文件名一致。

受保護的訪問修飾符-protected

子類與基類在同一包中:被聲明爲 protected 的變量、方法和構造器能被同一個包中的任何其他類訪問;

  • 基類的 protected 成員是包內可見的,並且對子類可見;
  • 若子類與基類不在同一包中:那麼在子類中,子類實例可以訪問其從基類繼承而來的 protected 方法,而不能訪問基類實例的protected方法。

不同包內

public class A {
 protected void t1() {
  System.out.println("A-t1");
 }
}
public class B extends A{
 @Override
 protected void t1() {
  System.out.println("B-t1");
 }
 
 public static void main(String[] args) {
  B b = new B();
  //子類可以訪問繼承而來的protected方法
  b.t1();
  A a = b;
  //不能訪問基類實例的protect方法
  a.t1();//編譯錯誤無法訪問
 }
}

訪問控制與繼承

  • 父類中聲明爲 public 的方法在子類中也必須爲 public。
  • 父類中聲明爲 protected 的方法在子類中要麼聲明爲 protected,要麼聲明爲 public,不能聲明爲 private。
  • 父類中聲明爲 private 的方法,不能夠被繼承。

概述:
繼承的訪問權限只能>=父類權限
private不能被繼承

非訪問修飾符

爲實現一些其他的功能,java也提供了許多非訪問修飾符

  • static修飾符:用於修飾類方法和類變量
  • final修飾符:用來修飾類、方法和變量,final 修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變量爲常量,是不可修改的
  • abstract修飾符:用來創建抽象類和抽象方法
  • transient 修飾符:序列化過程中跳過修飾變量
  • synchronized 修飾符:用於修飾方法,避免當前方法同時被不同線程訪問調用,主要用於線程編程
  • volatile 修飾符:主要用於線程編程

static修飾符

  • 靜態變量:
    static用來聲明獨立於對象的靜態變量,每個類的靜態變量是唯一的,與類實例化對象數目無關。可以通過類名調用,也稱作類變量。
  • 靜態方法:
    static用來聲明獨立於對象的靜態方法,靜態方法不能使用非靜態變量。可以通過類名調用,也叫類方法。

備註(在之後的內部類那一塊細講):
非靜態內部類中不允許定義靜態成員
外部類的靜態成員不可以直接使用非靜態內部類
靜態內部類,不能訪問外部類的實例成員,只能訪問外部類的類成員

final修飾符

修飾變量
final修飾的變量只允許一次賦值。一旦賦值之後不再允許重新賦值。
final變量必須顯示的賦值,或通過構造器賦值。
在賦值之前處於final空白的狀態,不允許調用。
final修飾的變量允許繼承,但不允許重寫
修飾方法
final修飾的方法運行繼承,但不允許重寫
修飾類
final修飾的類不能被繼承,沒有類能繼承final的任何特性

abstract修飾符

修飾類:抽象類
一個類不能同時被abstract與final修飾
抽象類不能實例化
抽象類可以包含抽象方法和非抽象方法,也可以不包含抽象類
修飾方法:抽象方法
抽象方法不能被聲明爲final和static
任何非抽象子類都需要實現父類所有抽象方法
抽象類不能再一般類中聲明。

transient修飾符

修飾變量
在序列化時java虛擬機(JVM)跳過transient修飾的變量,不對其進行持久化

synchronized修飾符

修飾方法
該修飾符修飾的方法在同一時間僅允許一個線程訪問

volatile修飾符

volatile 修飾的成員變量在每次被線程訪問時,都強制從共享內存中重新讀取該成員變量的值。而且,當成員變量發生變化時,會強制線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
一個 volatile 對象引用可能是 null。

後兩個將在多線程處詳盡介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章