java基礎(四)

m0_47635604發表於2020-12-19

一級目錄

二級目錄

三級目錄

Java語言提供了很多修飾符,主要分為以下兩類:

訪問修飾符
非訪問修飾符

修飾符用來定義類、方法或者變數,通常放在語句的最前端。

訪問控制修飾符
Java中,可以使用訪問控制符來保護對類、變數、方法和構造方法的訪問。
Java 支援 4 種不同的訪問許可權:
default (即預設,什麼也不寫): 在同一包內可見,不使用任何修飾符。使用物件:類、介面、變數、方法。
private : 在同一類內可見。使用物件:變數、方法。 注意:不能修飾類(外部類)
public : 對所有類可見。使用物件:類、介面、變數、方法
protected : 對同一包內的類和所有子類可見。使用物件:變數、方法。 注意:不能修飾類(外部類)。
可以通過以下表來說明訪問許可權:

修飾符當前類同一包內子孫類(同一包)子孫類(不同包)其他包
publicYYYYY
protectedYYYY/NY
defaultYYYNN
privateYNNNN

預設訪問修飾符-不使用任何關鍵字
使用預設訪問修飾符宣告的變數和方法,對同一個包內的類是可見的。介面裡的變數都隱式宣告為 public static final,而介面裡的方法預設情況下訪問許可權為 public。

如下例所示,變數和方法的宣告可以不使用任何修飾符。
String version = “1.5.1”;
boolean processOrder() {
return true;
}

私有訪問修飾符-private
私有訪問修飾符是最嚴格的訪問級別,所以被宣告為 private 的方法、變數和構造方法只能被所屬類訪問,並且類和介面不能宣告為 private。
宣告為私有訪問型別的變數只能通過類中公共的 getter 方法被外部類訪問。
Private 訪問修飾符的使用主要用來隱藏類的實現細節和保護類的資料。
下面的類使用了私有訪問修飾符:
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
例項中,Logger 類中的 format 變數為私有變數,所以其他類不能直接得到和設定該變數的值。為了使其他類能夠操作該變數,定義了兩個 public 方法:getFormat() (返回 format的值)和 setFormat(String)(設定 format 的值)

公有訪問修飾符-public
被宣告為 public 的類、方法、構造方法和介面能夠被任何其他類訪問。
如果幾個相互訪問的 public 類分佈在不同的包中,則需要匯入相應 public 類所在的包。由於類的繼承性,類所有的公有方法和變數都能被其子類繼承。
以下函式使用了公有訪問控制:
public static void main(String[] arguments) {
// …
}
Java 程式的 main() 方法必須設定成公有的,否則,Java 直譯器將不能執行該類。

受保護的訪問修飾符-protected
protected 需要從以下兩個點來分析說明:
子類與基類在同一包中:被宣告為 protected 的變數、方法和構造器能被同一個包中的任何其他類訪問;
子類與基類不在同一包中:那麼在子類中,子類例項可以訪問其從基類繼承而來的 protected 方法,而不能訪問基類例項的protected方法。
protected 可以修飾資料成員,構造方法,方法成員,不能修飾類(內部類除外)。
子類能訪問 protected 修飾符宣告的方法和變數,這樣就能保護不相關的類使用這些方法和變數。
下面的父類使用了 protected 訪問修飾符,子類重寫了父類的 openSpeaker() 方法。
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 實現細節
}
}

class StreamingAudioPlayer extends AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 實現細節
}
}
如果把 openSpeaker() 方法宣告為 private,那麼除了 AudioPlayer 之外的類將不能訪問該方法。
如果把 openSpeaker() 宣告為 public,那麼所有的類都能夠訪問該方法。
如果我們只想讓該方法對其所在類的子類可見,則將該方法宣告為 protected。

訪問控制和繼承
父類中宣告為 public 的方法在子類中也必須為 public。
父類中宣告為 protected 的方法在子類中要麼宣告為 protected,要麼宣告為 public,不能宣告為 private。
父類中宣告為 private 的方法,不能夠被繼承。

非訪問修飾符
為了實現一些其他的功能,Java 也提供了許多非訪問修飾符。
static 修飾符,用來修飾類方法和類變數。
final 修飾符,用來修飾類、方法和變數,final 修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變數為常量,是不可修改的。
abstract 修飾符,用來建立抽象類和抽象方法。
synchronized 和 volatile 修飾符,主要用於執行緒的程式設計。

static 修飾符
靜態變數:
static 關鍵字用來宣告獨立於物件的靜態變數,無論一個類例項化多少物件,它的靜態變數只有一份拷貝。 靜態變數也被稱為類變數。區域性變數不能被宣告為 static 變數。
靜態方法:
static 關鍵字用來宣告獨立於物件的靜態方法。靜態方法不能使用類的非靜態變數。靜態方法從引數列表得到資料,然後計算這些資料。
對類變數和方法的訪問可以直接使用 classname.variablename 和 classname.methodname 的方式訪問。
如下例所示,static修飾符用來建立類方法和類變數。
public class InstanceCounter {
private static int numInstances = 0;
protected static int getCount() {
return numInstances;
}
private static void addInstance() {
numInstances++;
}
InstanceCounter() {
InstanceCounter.addInstance();
}
public static void main(String[] arguments) {
System.out.println(“Starting with " +
InstanceCounter.getCount() + " instances”);
for (int i = 0; i < 500; ++i){
new InstanceCounter();
}
System.out.println(“Created " +
InstanceCounter.getCount() + " instances”);
}
}
以上例項執行編輯結果如下:
Starting with 0 instances
Created 500 instances

final 修飾符
final 變數:
final 表示"最後的、最終的"含義,變數一旦賦值後,不能被重新賦值。被 final 修飾的例項變數必須顯式指定初始值。
public class Test{
final int value = 10;
// 下面是宣告常量的例項
public static final int BOXWIDTH = 6;
static final String TITLE = “Manager”;

public void changeValue(){
value = 12; //將輸出一個錯誤
}
}

final 方法
父類中的 final 方法可以被子類繼承,但是不能被之類重寫。
宣告 final 方法的主要目的是防止該方法的內容被修改。
如下所示,使用 final 修飾符宣告方法。
public class Test{
public final void changeName(){
// 方法體
}
}

final 類
public final class Test {
// 類體
}

abstract 修飾符
抽象類:
抽象類不能用來例項化物件,宣告抽象類的唯一目的是為了將來對該類進行擴充。
一個類不能同時被 abstract 和 final 修飾。如果一個類包含抽象方法,那麼該類一定要宣告為抽象類,否則將出現編譯錯誤。
抽象類可以包含抽象方法和非抽象方法。
abstract class Caravan{
private double price;
private String model;
private String year;
public abstract void goFast(); //抽象方法
public abstract void changeColor();
}

抽象方法
抽象方法是一種沒有任何實現的方法,該方法的的具體實現由子類提供。
抽象方法不能被宣告成 final 和 static。
任何繼承抽象類的子類必須實現父類的所有抽象方法,除非該子類也是抽象類。
如果一個類包含若干個抽象方法,那麼該類必須宣告為抽象類。抽象類可以不包含抽象方法。
抽象方法的宣告以分號結尾,例如:public abstract sample();。
public abstract class SuperClass{
abstract void m(); //抽象方法
}

class SubClass extends SuperClass{
//實現抽象方法
void m(){

}
}

synchronized 修飾符
synchronized 關鍵字宣告的方法同一時間只能被一個執行緒訪問。synchronized 修飾符可以應用於四個訪問修飾符。
public synchronized void showDetails(){

}

transient 修飾符
序列化的物件包含被 transient 修飾的例項變數時,java 虛擬機器(JVM)跳過該特定的變數。
該修飾符包含在定義變數的語句中,用來預處理類和變數的資料型別。
public transient int limit = 55; // 不會持久化
public int b; // 持久化

volatile 修飾符
volatile 修飾的成員變數在每次被執行緒訪問時,都強制從共享記憶體中重新讀取該成員變數的值。而且,當成員變數發生變化時,會強制執行緒將變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的執行緒總是看到某個成員變數的同一個值。一個 volatile 物件引用可能是 null。
public class MyRunnable implements Runnable
{
private volatile boolean active;
public void run() {
active = true;
while (active) { // 第一行
// 程式碼
}
}
public void stop() {
active = false; // 第二行
}
}
通常情況下,在一個執行緒呼叫 run() 方法(在 Runnable 開啟的執行緒),在另一個執行緒呼叫 stop() 方法。 如果 第一行 中緩衝區的 active 值被使用,那麼在 第二行 的 active 值為 false 時迴圈不會停止。

但是以上程式碼中我們使用了 volatile 修飾 active,所以該迴圈會停止。

相關文章