

Java 中的访问权限修饰符共有四种,分别是:
Default : 没有关键字修饰的
Private
Protected
Public
按照对于调用者来说可见性从小到大的次序排序是:
Private < Default < Protected < Public
在Java中访问修饰符可以作用在 class (类) ,field (属性) ,method (方法)上。
注意:作用在类上时,private , protected 只能作用在内部类上,而不能作用在外部类上。这在语法上是不允许的会引起编译错误。


Private
用 private 修饰的部分只能在当前类中访问,它们的可见性范围就是当前类。在当前类之外无法通过硬编码的方式直接使用。这也是 Java 封装性的体现,以及安全性体现,将潜在的变化隐藏在自己内部不要对外界暴漏。
package org.blackhat.chapter2.privatemodifier;/*** @author blackhat*/public class A {private int num = 100;private void printNum() {System.out.println("num = " + this.num);}public static void main(String[] args) {new A().printNum();}}class Simple {public static void main(String[] args) {A a = new A();// a.printNum(); // Compile Time Error}}
Default
访问修饰符为 default 的部分,允许本类中访问,允许在相同 package 下的非子类中访问 ,允许在相同 package 下的子类中访问。不允许在不同 package 下的类中访问,即使这个类是子类。
package org.blackhat.chapter2.defaultmodifier;/*** @author blackhat*/class A {int num = 100;void printNum() {System.out.println("num = " + this.num);}}
package org.blackhat.chapter2.defaultmodifier;/*** @author blackhat*/public class ASimple {public static void main(String[] args) {A a = new A();System.out.println(a.num);a.printNum();}}
package org.blackhat.chapter2.defaultmodifier;/*** @author blackhat*/public class ASub extends A {void invokeSuperPrintNum() {super.printNum();}int getNum() {return super.num;}}
package org.blackhat.chapter2.defaultmodifier;/*** @author blackhat*/public class ASubSimple {public static void main(String[] args) {ASub aSub = new ASub();aSub.invokeSuperPrintNum();System.out.println(aSub.getNum());}}
package org.blackhat.chapter2.defaultmodifier.otherpackage;/*** @author blackhat*/class ASimple {public static void main(String[] args) {// new A(); // Compile Time Error}}
package org.blackhat.chapter2.defaultmodifier.otherpackage;/*** @author blackhat*///public class ASub extends A { // Compile Time Error//}
Protected
protected 修饰的部分,允许在本类中访问,允许在相同的 package 中访问,允许在子类中访问。不允许在不同的 package 的非子类中访问。
package org.blackhat.chapter2.protectedmodifier;/*** @author blackhat*/public class A {protected int num = 100;protected void printNum() {System.out.println("num = " + this.num);}public static void main(String[] args) {new A().printNum();}}
package org.blackhat.chapter2.protectedmodifier;/*** @author blackhat*/public class Simple {public static void main(String[] args) {A a = new A();a.printNum();System.out.println(a.num);}}
package org.blackhat.chapter2.protectedmodifier;/*** @author blackhat*/public class ASub extends A {void invokeSuperPrintNum() {super.printNum();}int getNum() {return super.num;}}
package org.blackhat.chapter2.protectedmodifier;/*** @author blackhat*/public class ASubSimple {public static void main(String[] args) {ASub aSub = new ASub();aSub.invokeSuperPrintNum();System.out.println(aSub.getNum());}}
package org.blackhat.chapter2.protectedmodifier.otherpackage;import org.blackhat.chapter2.protectedmodifier.A;/*** @author blackhat*/public class OtherASub extends A {void invokeSuperPrintNum() {super.printNum();}int getNum() {return super.num;}}
package org.blackhat.chapter2.protectedmodifier.otherpackage;import org.blackhat.chapter2.protectedmodifier.ASub;/*** @author blackhat*/public class ASubSimple {public static void main(String[] args) {ASub aSub = new ASub();// aSub.invokeSuperPrintNum(); // Compile Time Error// System.out.println(aSub.getNum()); // Compile Time Error}}
Public
public 也就是完全公开的,被它修饰的部分允许在任何位置访问。
内部类也同样遵守上面的规则
package org.blackhat.chapter2;/*** @author blackhat*/public class OuterSuper {int defaultNum = 1000;protected int protectedNum = 2000;}
package org.blackhat.chapter2;/*** @author blackhat*/public class Outer extends OuterSuper {private int a = 100;int b = 200;protected int c = 300;private class Inner1 {void fun() {System.out.println("Outer.a = " + Outer.this.a+ " , Outer.b = " + Outer.this.b+ " , Outer.c = " + Outer.this.c+ ", OuterSuper.defaultNum = " + Outer.super.defaultNum+ ", OuterSuper.protectedNum = " + Outer.super.protectedNum);}}class Inner2 {void fun() {System.out.println("Outer.a = " + Outer.this.a+ " , Outer.b = " + Outer.this.b+ " , Outer.c = " + Outer.this.c+ ", OuterSuper.defaultNum = " + Outer.super.defaultNum+ ", OuterSuper.protectedNum = " + Outer.super.protectedNum);}}protected class Inner3 {void fun() {System.out.println("Outer.a = " + Outer.this.a+ " , Outer.b = " + Outer.this.b+ " , Outer.c = " + Outer.this.c+ ", OuterSuper.defaultNum = " + Outer.super.defaultNum+ ", OuterSuper.protectedNum = " + Outer.super.protectedNum);}}}
package org.blackhat.chapter2.otherpackage;import org.blackhat.chapter2.OuterSuper;/*** @author blackhat*/public class OtherOuter extends OuterSuper {private int a = 100;int b = 200;protected int c = 300;private class Inner1 {void fun() {System.out.println("Outer.a = " + OtherOuter.this.a+ " , Outer.b = " + OtherOuter.this.b+ " , Outer.c = " + OtherOuter.this.c// + ", OuterSuper.defaultNum = " + OtherOuter.super.defaultNum // Compile Time Error+ ", OuterSuper.protectedNum = " + OtherOuter.super.protectedNum);}}class Inner2 {void fun() {System.out.println("Outer.a = " + OtherOuter.this.a+ " , Outer.b = " + OtherOuter.this.b+ " , Outer.c = " + OtherOuter.this.c// + ", OuterSuper.defaultNum = " + OtherOuter.super.defaultNum // Compile Time Error+ ", OuterSuper.protectedNum = " + OtherOuter.super.protectedNum);}}protected class Inner3 {void fun() {System.out.println("Outer.a = " + OtherOuter.this.a+ " , Outer.b = " + OtherOuter.this.b+ " , Outer.c = " + OtherOuter.this.c// + ", OuterSuper.defaultNum = " + OtherOuter.super.defaultNum // Compile Time Error+ ", OuterSuper.protectedNum = " + OtherOuter.super.protectedNum);}}}
本期内容代码整理在 JavaTalk 代码仓库 :
https://github.com/GitHeP/JavaTalk

长按识别


原文作者:DevXTalk;如有侵权,请联系管理员删除。