基本概念
Java語言提供了很多修飾符,主要分為以下兩類:
- 訪問修飾符
- 非訪問修飾符
修飾符用來定義類被辑、方法或者變量纫溃,通常放在語句的最前端沪羔。我們通過下面的例子來說明:
public class className {
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
// 方法體
}
訪問控制修飾符
Java中巍沙,可以使用訪問控制符來保護對類葵姥、變量、方法和構造方法的訪問句携。Java支持4種不同的訪問權限榔幸。
- 默認的,也稱為 default矮嫉,在同一包內(nèi)可見削咆,不使用任何修飾符。
- 私有的蠢笋,以 private 修飾符指定拨齐,在同一類內(nèi)可見。
- 共有的昨寞,以 public 修飾符指定瞻惋,對所有類可見。
- 受保護的援岩,以 protected 修飾符指定歼狼,對同一包內(nèi)的類和所有子類可見。
我們可以可以通過以下表來說明訪問權限:
修飾符 | 當前類 | 同一包內(nèi) | 子孫類 | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
默認訪問修飾符-不使用任何關鍵字
使用默認訪問修飾符聲明的變量和方法享怀,對同一個包內(nèi)的類是可見的羽峰。接口里的變量都隱式聲明為 public static final,而接口里的方法默認情況下訪問權限為 public。
如下例所示添瓷,變量和方法的聲明可以不使用任何修飾符限寞。
String version = "1.5.1";
boolean processOrder() {
return true;
}
私有訪問修飾符-private
私有訪問修飾符是最嚴格的訪問級別,所以被聲明為 private 的方法仰坦、變量和構造方法只能被所屬類訪問,并且類和接口不能聲明為 private计雌。
聲明為私有訪問類型的變量只能通過類中公共的 getter 方法被外部類訪問悄晃。
Private 訪問修飾符的使用主要用來隱藏類的實現(xiàn)細節(jié)和保護類的數(shù)據(jù)。
下面的類使用了私有訪問修飾符:
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 類所在的包叉钥。由于類的繼承性,類所有的公有方法和變量都能被其子類繼承篙贸。
以下函數(shù)使用了公有訪問控制:
public static void main(String[] arguments) {
// ...
}
Java 程序的 main() 方法必須設置成公有的投队,否則,Java 解釋器將不能運行該類爵川。
受保護的訪問修飾符-protected
被聲明為 protected 的變量敷鸦、方法和構造器能被同一個包中的任何其他類訪問,也能夠被不同包中的子類訪問寝贡。
protected 訪問修飾符不能修飾類和接口扒披,方法和成員變量能夠聲明為 protected,但是接口的成員變量和成員方法不能聲明為 protected圃泡。
子類能訪問 protected 修飾符聲明的方法和變量碟案,這樣就能保護不相關的類使用這些方法和變量。
下面的父類使用了 protected 訪問修飾符洞焙,子類重寫了父類的 openSpeaker() 方法蟆淀。
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
// 實現(xiàn)細節(jié)
}
}
class StreamingAudioPlayer extends AudioPlayer {
boolean openSpeaker(Speaker sp) {
// 實現(xiàn)細節(jié)
}
}
如果把 openSpeaker() 方法聲明為 private,那么除了 AudioPlayer 之外的類將不能訪問該方法澡匪。如果把 openSpeaker() 聲明為 public熔任,那么所有的類都能夠訪問該方法。如果我們只想讓該方法對其所在類的子類可見唁情,則將該方法聲明為 protected疑苔。
訪問控制和繼承
請注意以下方法繼承的規(guī)則:
- 父類中聲明為 public 的方法在子類中也必須為 public。
- 父類中聲明為 protected 的方法在子類中要么聲明為 protected甸鸟,要么聲明為 public惦费,不能聲明為 private。
- 父類中聲明為 private 的方法抢韭,不能夠被繼承薪贫。
非訪問修飾符
為了實現(xiàn)一些其他的功能,Java 也提供了許多非訪問修飾符刻恭。
- static 修飾符瞧省,用來創(chuàng)建類方法和類變量。
- final 修飾符鳍贾,用來修飾類鞍匾、方法和變量,final 修飾的類不能夠被繼承骑科,修飾的方法不能被繼承類重新定義橡淑,修飾的變量為常量,是不可修改的咆爽。
- abstract 修飾符梁棠,用來創(chuàng)建抽象類和抽象方法置森。
- synchronized 和 volatile 修飾符,主要用于線程的編程掰茶。
關于這些修飾符的詳細含義在后續(xù)的章節(jié)中介紹暇藏。