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

187 阅读11分钟
原文链接: www.toutiao.com

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

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

1.静态内部类

内部类分为两类:静态和非静态。 声明为static的内部类称为静态内部类。 非静态内部类称为内部类。

静态内部类定义格式:

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

演示:

请定一个外部类Outer,外部类Outer里面有一个静态内部类Inner。

代码:

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

2.创建静态内部类对象

要为静态内部类创建对象,请使用以下语法:

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

演示:

请定义一个外部类Outer,在外部类Outer里面定义一个静态内部类Inner。

请实例化静态内部类Inner。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们不必创建外部类的实例对象就可以直接创建静态内部类对象。在本例中,直接使用外部类Outer类名调用它里面的静态内部类Inner创建对象,因为内部类是静态的,所以可以直接用外部类类名调用。

注意:

静态内部类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。 实际上,静态内部类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。

就是说静态内部类和你把这个类声明到新文件中是一样的,它不存在谁包含谁。内部类就存在外部类包含内部类,而静态内部类不存在这个问题,和顶级类一样。

3.静态内部类中的实例变量

演示:

请创建一个外部类Outer,在外部类Outer里面创建一个静态内部类Inner。在静态内部类Inner中定义实例变量。试试在静态内部类构造方法中访问。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们在静态内部类Inner中定义了四种不同访问权限的实例变量,访问权限分别为private,public,protected或package private。在静态内部类Inner构造方法中我们访问了这些实例变量,从运行结果来看,完全没有问题。同样的我们可不可以在外界创建静态内部类对象,然后通过静态内部类Inner对象成员访问静态内部类实例变量呢?来看看吧:

Outer类:

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

Main类:

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

结果:

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

错误信息:

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

文字版:

/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(12, 68) java: anInt 在 lab.Outer.Inner 中是 private 访问控制Error:(13, 69) java: aFloat在lab.Outer.Inner中不是公共的; 无法从外部程序包中对其进行访问Error:(14, 71) java: aBoolean 在 lab.Outer.Inner 中是 protected 访问控制

由此可见,在外界静态内部类对象只能访问到非私有的成员。

注意:

静态内部类实例变量在外界静态内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。

静态内部类常量在外界静态内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。

静态内部类类变量在外界静态内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。

静态内部类静态常量在外界静态内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。

为什么要说上面这些提示,因为后面会直接演示外界静态内部类对象怎么获取静态内部类中实例变量、常量、类变量、静态常量。

4.静态内部类访问本类中的实例方法

演示:

请创建一个外部类Outer,在外部类Outer里面创建一个静态内部类Inner。在静态内部类Inner中定义实例方法。试试在静态内部类构造方法中访问。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们在静态内部类Inner中定义了四种不同访问权限的实例方法,访问权限分别为private,public,protected或package private。在静态内部类Inner构造方法中我们访问了这些实例方法,从运行结果来看,完全没有问题。

因为在外界静态内部类对象无法直接访问静态内部类实例方法,所以可以在静态内部类中提供了访问静态内部类实例方法的方法。

注意:

静态内部类实例方法在外界静态内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。

静态内部类最终方法在外界静态内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。

静态内部类类方法在外界静态内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。

静态内部类静态最终方法在外界静态内部类对象无法直接获取,只能通过提供一些非私有的方法间接获取。

为什么要说上面这些提示,因为后面会直接演示外界静态内部类对象怎么获取静态内部类中实例方法、最终方法、类方法、静态最终方法。

5.静态内部类访问本类中的常量

演示:

请创建一个外部类Outer,在外部类Outer里面创建一个静态内部类Inner。在静态内部类Inner中定义常量。试试在静态内部类构造方法中访问。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们在静态内部类Inner中定义了四种不同访问权限的常量,访问权限分别为private,public,protected或package private。在静态内部类Inner构造方法中我们访问了这些常量,从运行结果来看,完全没有问题。

因为在外界静态内部类对象无法直接访问静态内部类常量,所以可以在静态内部类中提供了访问静态内部类常量的方法。

6.静态内部类访问本类中的最终方法

演示:

请创建一个外部类Outer,在外部类Outer里面创建一个静态内部类Inner。在静态内部类Inner中定义最终方法。试试在静态内部类构造方法中访问。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们在静态内部类Inner中定义了四种不同访问权限的最终方法,访问权限分别为private,public,protected或package private。在静态内部类Inner构造方法中我们访问了这些最终方法,从运行结果来看,完全没有问题。

因为在外界静态内部类对象无法直接访问静态内部类最终方法,所以可以在静态内部类中提供了访问静态内部类最终方法的方法。

7.静态内部类访问本类中的类变量

演示:

请创建一个外部类Outer,在外部类Outer里面创建一个静态内部类Inner。在静态内部类Inner中定义类变量。试试在静态内部类构造方法中访问。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们在静态内部类Inner中定义了四种不同访问权限的类变量,访问权限分别为private,public,protected或package private。在静态内部类Inner构造方法中我们访问了这些类变量,从运行结果来看,完全没有问题。

因为在外界静态内部类对象无法直接访问静态内部类类变量,所以可以在静态内部类中提供了访问静态内部类类变量的方法。

8.静态内部类访问本类中的类方法

演示:

请创建一个外部类Outer,在外部类Outer里面创建一个静态内部类Inner。在静态内部类Inner中定义类方法。试试在静态内部类构造方法中访问。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们在静态内部类Inner中定义了四种不同访问权限的类方法,访问权限分别为private,public,protected或package private。在静态内部类Inner构造方法中我们访问了这些类方法,从运行结果来看,完全没有问题。

因为在外界静态内部类对象无法直接访问静态内部类类方法,所以可以在静态内部类中提供了访问静态内部类类方法的方法。

9.静态内部类访问本类中的静态常量

演示:

请创建一个外部类Outer,在外部类Outer里面创建一个静态内部类Inner。在静态内部类Inner中定义静态常量。试试在静态内部类构造方法中访问。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们在静态内部类Inner中定义了四种不同访问权限的静态常量,访问权限分别为private,public,protected或package private。在静态内部类Inner构造方法中我们访问了这些静态常量,从运行结果来看,完全没有问题。

因为在外界静态内部类对象无法直接访问静态内部类静态常量,所以可以在静态内部类中提供了访问静态内部类静态常量的方法。

10.外部类访问内部类中的静态最终方法

演示:

请创建一个外部类Outer,在外部类Outer里面创建一个静态内部类Inner。在静态内部类Inner中定义类方法。试试在静态内部类构造方法中访问。

请观察程序运行结果。

代码:

Outer类:

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

Main类:

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

结果:

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

我们在静态内部类Inner中定义了四种不同访问权限的静态最终方法,访问权限分别为private,public,protected或package private。在静态内部类Inner构造方法中我们访问了这些静态最终方法,从运行结果来看,完全没有问题。

因为在外界静态内部类对象无法直接访问静态内部类静态最终方法,所以可以在静态内部类中提供了访问静态内部类静态最终方法的方法。

总结

  • 在Java中,我们可以在一个类中再定义一个类,这样称之为内部类。
  • 内部类又称之为嵌套类。
  • 内部类分为两类:静态和非静态。 声明为static的内部类称为静态内部类。 非静态内部类称为内部类。
  • 要实例化内部类,必须首先实例化外部类。
  • 内部类中的实例变量。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
  • 内部类中的实例方法。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
  • 内部类中的常量。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
  • 内部类中的最终方法。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
  • 内部类中的类变量。内部类不可以定义任何类变量。
  • 内部类中的类方法。内部类不可以定义任何类方法。
  • 内部类中的静态常量。可以通过外部类中内部类对象访问,外界内部类对象只能访问public修饰的。
  • 内部类中的静态最终方法。内部类不可以定义任何静态最终方法。
  • 静态内部类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。 实际上,静态内部类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。
  • 静态内部类实例化无需外部类实例化,直接通过外部类类名调用静态内部类即可。

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

答疑

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

上一章

“全栈2019”Java第六十九章:内部类访问外部类成员详解

下一章

“全栈2019”Java第七十一章:外部类访问静态内部类成员详解

学习小组

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

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

全栈工程师学习计划

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

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

版权声明

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