訪問控制修飾符用法總結(jié)
訪問控制修飾符一共四類:default
浦夷、public
、private
、protected
default
關(guān)鍵字:無撵孤。不寫訪問控制修飾符即為
default
訪問權(quán)限:同一包內(nèi)可見
修飾對象:類摔寨、接口去枷、變量、方法
import pkg1.A;
public class Main {
public static void main(String[] args) {
A a = new A(); // 編譯不通過:'pkg1.A' is not public in 'pkg1'. Cannot be accessed from outside package
}
}
// ---------------------------------------------------------------------
package pkg1;
class A implements B { // 該類的訪問權(quán)限為default
int field; // 該字段訪問權(quán)限為default
void method(int aInt) {
// 該方法的訪問權(quán)限為default
}
@Override
public void method1() {
System.out.println("method1 is implemented.");
}
}
interface B { // 該接口的訪問權(quán)限為default
void method1();
}
class C {
public void method3() {
A a = new A();
a.method(a.field); // 同包內(nèi)可以訪問權(quán)限為default的類是复、方法删顶、字段
}
}
public
- 關(guān)鍵字:
public
- 訪問權(quán)限:對所有類可見
- 修飾對象:類、接口佑笋、變量翼闹、方法
import pkg2.A;
public class Main {
public static void main(String[] args) {
A a = new A();
a.method(a.field); // 所有類均可以訪問權(quán)限為public的class A
}
}
// ---------------------------------------------------------------------
package pkg2;
public class A implements B { // 該類的訪問權(quán)限為public
public int field; // 該字段的訪問權(quán)限為public
public void method(int aInt) {
// 該方法的訪問權(quán)限為public
}
@Override
public void method1() {
System.out.println("method1 is implemented.");
}
}
public interface B { // 該接口的訪問權(quán)限為public
public void method1();
}
private
- 關(guān)鍵字:
private
- 訪問權(quán)限:在同一類內(nèi)可見
- 修飾對象:變量、方法蒋纬,不能修飾類(外部類)猎荠、接口
import pkg3.C;
public class Main {
public static void main(String[] args) {
C c = new C();
c.method(0); // 編譯不通過:'method()' has private access in 'pkg3.C'
}
}
// ---------------------------------------------------------------------
package pkg3;
public class C { // 該類為外部類,訪問權(quán)限不能為private蜀备,否則編譯不通過
private int field; // 該字段的訪問權(quán)限為private
private class B {} // 該類為內(nèi)部類关摇,訪問權(quán)限可以為private
private void method() {
// 該方法的訪問權(quán)限為private
System.out.println(this.field); // 類內(nèi)部可以訪問私有字段
}
}
package pkg3;
private interface E { // 編譯不通過:Modifier 'private' not allowed here
//...
}
protected
- 關(guān)鍵字:
protected
- 訪問權(quán)限:
- 基類的protected成員是包內(nèi)可見的,并且對子類可見碾阁;
- 若子類與基類不在同一包中输虱,那么在子類中,子類實例可以訪問其從基類繼承而來的protected方法脂凶,而不能訪問基類實例的protected方法宪睹。
- 修飾對象:變量、方法蚕钦。 不能修飾類(外部類)亭病、接口
package pkg4;
import pkg1.H;
import pkg1.K;
public class Test {
public static void main(String[] args) {
F f = new F();
G g = new G(); // 是F類的同包子類
H h = new H(); // 是F類的不同包子類
f.method();
g.method(); // protected方法是包內(nèi)可見的
h.method(); // protected方法是對子類可見的
K k = new K();
k.method(); // 編譯不通過:'method()' has protected access in 'pkg1.K'
}
}
// ---------------------------------------------------------------------
package pkg4;
public class F { // 該類為外部類,訪問權(quán)限不能為protected嘶居,否則編譯不通過
protected int field; // 該字段的訪問權(quán)限為protected
protected void method() {
// 該方法的訪問權(quán)限為protected
}
}
public class G extends F {} // 同包子類
// ---------------------------------------------------------------------
package pkg1;
import pkg4.F;
import pkg4.Test;
public class H extends F {} // 不同包子類
public class K extends Test {
protected void method() {
//...
}
}