JavaTalk第二期:Java中的访问权限修饰符

22579e19-a262-44fe-82a9-2dac8aabf667.gif

501eccb7-5bf8-437e-a12b-c9918a644eeb.png


Java 中的访问权限修饰符共有四种,分别是:

  • Default :  没有关键字修饰的

  • Private

  • Protected

  • Public


按照对于调用者来说可见性从小到大的次序排序是:

Private < Default < Protected < Public


在Java中访问修饰符可以作用在 class (类) ,field (属性) ,method (方法)上。

注意:作用在类上时,private , protected 只能作用在内部类上,而不能作用在外部类上。这在语法上是不允许的会引起编译错误。


79620c9b-ff59-4442-a825-9423f3e92fd3.png


1746b97d-1536-4d12-a064-9fc2391d2283.png


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






长按识别

32b99bd7-ae2f-4a43-a9e6-df71776ebc2a.jpg





e64e7cb6-82f8-4de0-ac84-9740091177c8.png 你点的每个在看,我都认真当成了喜欢


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值