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
长按识别
本文分享自微信公众号 - 黑帽子技术(SNJYYNJY2020)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。