“全栈2019”Java第七十六章:静态、非静态内部类访问权限

186 阅读5分钟
原文链接: www.toutiao.com

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。

1.内部类与静态内部类

我们先来温习一下内部类和静态内部类的定义。

演示:

请定义一个内部类和一个静态内部类。

请观察程序运行结果。

代码:

Outer类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

Main类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

结果:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

从运行结果来看,程序完全没有问题。

2.访问修饰符public

public:表示紧随其后的元素对任何人都是可用的。

内部类也是相当于我们外部类中的成员,所以它也是可以被成员权限修饰符所修饰的。

上例中演示的就是public修饰符,这里就不再重复演示。

提示:

因为public访问修饰符无论是在同一个包下还是在不同包下都可以正常访问,所以这里就不演示不同包情况。

3.访问修饰符protected

protected:与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。

接下来我们看看将上例中内部类和静态内部类权限修饰符改为protected是什么情况。

演示:

将上例中内部类和静态内部类权限修饰符改为protected。

代码:

Outer类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

Main类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

结果:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

错误信息:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

文字版:

/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(11, 14) java: lab.Outer.Inner 在 lab.Outer 中是 protected 访问控制Error:(11, 39) java: lab.Outer.Inner 在 lab.Outer 中是 protected 访问控制Error:(14, 14) java: lab.Outer.StaticInner 在 lab.Outer 中是 protected 访问控制Error:(14, 50) java: lab.Outer.StaticInner 在 lab.Outer 中是 protected 访问控制

从运行结果来看,我们的内部类和静态内部类只能在Outer的子类中访问。于是,我们来创建一个Outer的子类。

演示:

请创建一个Outer的子类,然后在其构造方法中访问父类Outer中的内部类和静态内部类。

请观察程序运行结果。

代码:

Outer类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

OuterChild类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

Main类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

结果:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

从运行结果来看,被protected修饰的元素只能被子类所使用。

提示:

因为protected访问修饰符无论是在同一个包下还是在不同包下都可以正常访问,所以这里就不演示不同包情况。

4.默认的访问修饰符

默认访问修饰符,当没有使用前面提到的任何访问指定名词时,它将发挥作用。这种权限通常被称为包访问权限,因为在这种权限下,类可以访问在同一个包(库构件)中的其他类成员,但是在包之外,这些成员如同指定了private一样。

接下来我们看看将上例中内部类和静态内部类权限修饰符改为默认的访问修饰符是什么情况。

演示:

将上例中内部类和静态内部类权限修饰符改为默认的访问修饰符。

代码:

Outer类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

Main类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

结果:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

错误信息:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

文字版:

/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(11, 14) java: lab.Outer.Inner在lab.Outer中不是公共的; 无法从外部程序包中对其进行访问Error:(11, 39) java: lab.Outer.Inner在lab.Outer中不是公共的; 无法从外部程序包中对其进行访问Error:(14, 14) java: lab.Outer.StaticInner在lab.Outer中不是公共的; 无法从外部程序包中对其进行访问Error:(14, 50) java: lab.Outer.StaticInner在lab.Outer中不是公共的; 无法从外部程序包中对其进行访问

从错误信息来看,我们需要将Outer类与Main类放置在同一个包下才可以,于是我们将Outer类移至main包下:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

再运行程序:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

从运行结果来看,只有同一个包下的类才可以访问被默认访问修饰符修饰的元素。

5.访问修饰符private

private:表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。private就像你跟客户端程序猿之间的一堵墙,如果有人试图访问private成员,就会在编译时得到错误信息。

接下来我们看看将上例中内部类和静态内部类权限修饰符改为private修饰符是什么情况。

演示:

将上例中内部类和静态内部类权限修饰符改为private访问修饰符。

代码:

Outer类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

Main类:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

结果:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

错误信息:

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

文字版:

/Users/admin/Workspace/Java/Hello/src/main/Main.java

Error:(11, 14) java: lab.Outer.Inner 在 lab.Outer 中是 private 访问控制

Error:(11, 39) java: lab.Outer.Inner 在 lab.Outer 中是 private 访问控制

Error:(14, 14) java: lab.Outer.StaticInner 在 lab.Outer 中是 private 访问控制

Error:(14, 50) java: lab.Outer.StaticInner 在 lab.Outer 中是 private 访问控制

从运行结果来看,私有成员无法直接访问。

提示:

因为private访问修饰符无论是在同一个包下还是在不同包下都可以正常访问,所以这里就不演示不同包情况。

总结

  • 内部类和静态内部类都属于外部类成员。
  • 内部类和静态内部类都可以被public、protected、package-private和private访问修饰符修饰。
  • 外界只能直接访问到非私有的内部类和静态内部类。

至此,Java中静态、非静态内部类访问权限相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java第七十五章:内部类持有外部类对象

下一章

“全栈2019”Java第七十七章:抽象内部类与静态抽象内部类详解

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

版权声明

原创不易,未经允许不得转载!