“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

134 阅读9分钟
原文链接: www.toutiao.com

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

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

1.内部类

前面学习过内部类相关知识,我们也来温故一下内部类。

演示:

请定义一个内部类。

代码:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

没有学习过的同学,可以点击下面文章链接来进行学习:

“全栈2019”Java第六十七章:内部类、嵌套类详解

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

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

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

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

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

“全栈2019”Java第七十三章:外部类里多个静态非静态内部类详解

“全栈2019”Java第七十四章:内部类与静态内部类相互嵌套

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

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

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

“全栈2019”Java第七十八章:内部类可以继承其他类吗?

“全栈2019”Java第七十九章:类中可以嵌套接口吗?

“全栈2019”Java第八十章:外部类是否能实现本类中的接口?

“全栈2019”Java第八十一章:外部类能否访问嵌套接口里的成员?

“全栈2019”Java第八十二章:嵌套接口能否访问外部类中的成员?

“全栈2019”Java第八十三章:内部类与接口详解

“全栈2019”Java第八十四章:接口中嵌套接口详解

“全栈2019”Java第八十五章:实现接口中的嵌套接口

“全栈2019”Java第八十六章:嵌套接口可以多继承吗?

“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

“全栈2019”Java第八十九章:接口中能定义内部类吗?

“全栈2019”Java第九十章:内部类可以向上或向下转型吗?

“全栈2019”Java第九十一章:内部类具有多态特性吗?

2.内部类里面能定义哪些成员?

只有内部类与外部类都能定义的成员才能发生覆盖,所以我们得先来了解一下内部类里面能定义哪些成员,为什么需要先了解内部类里面能定义的成员呢?

因为我们只有先把内部类成员先定义好,再去外部类定义和内部类一摸一样的成员,这样覆盖才有意义。定义一个只有外部类拥有而内部类没有拥有的成员是没有意义的,也发生不了覆盖。所以,综上所述得先了解内部类能定义哪些成员。

注意:本次成员不包括嵌套类型(内部类里面嵌套内部类);

演示:

请定义一个外部类Outer,然后在外部类Outer中定义一个内部类Inner。

请在内部类Inner中定义成员。

请观察程序代码。

代码:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

从程序代码中来看,内部类可以定义的成员有:

实例变量、常量、静态常量、实例方法和最终方法。

我们发现类变量、类方法和静态最终方法没有被定义,那是因为内部类中不能定义它们。想要定义它们,那必须得是静态内部类:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

我们发现可以定义的成员更多了,但是还有一个抽象方法没有被定义。那是因为非抽象类里面无法定义抽象方法,所以,再要加一个抽象方法,我们就必须得把静态内部类变为静态抽象内部类:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

说明一下,虽然静态抽象内部类里面定义的成员是最全的,但是我们做外部类与内部类成员覆盖讲解的话,还是以静态内部类作为主要演示对象,它可以直接创建对象。

3.外部类与内部类成员覆盖

上一小节,我们演示了在内部类中可以定义哪些成员,接下来,我们将这些可以在内部类中定义的成员也在外部类中定义一份。

演示:

请定义一个外部类Outer,然后在外部类Outer中定义一个静态内部类Inner。

请在静态内部类Inner中定义上一小节中可定义的成员。

请在外部类中定义和静态内部类中定义的成员一样的成员。

请在Main类的main()方法中创建外部类对象和静态内部类对象。

请观察程序运行结果。

代码:

Outer类:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

Main类:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

结果:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

从程序运行结果来看,程序没有问题。接下来,我们来一步一步来看看程序运行过程。

首先,先来看看Outer类,这个类里面的东西有点多。我们分成两部分来看,先看静态内部类Inner里面定义的成员:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

静态内部类里面定义了实例变量、常量、类变量、静态常量、实例方法、最终方法、类方法和静态最终方法

紧接着,我们定义了构造方法,在构造方法里面访问了这些成员:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

待会根据执行结果,我们就会知道在静态内部类里面访问和外部类中一样的成员时,到底是访问的自己里面的成员还是外部类里面的成员。

好,接下来我们就去看看外部类里面定义了哪些成员:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

我们在外部类里面定义了和静态内部类里面一摸一样的成员,有实例变量、常量、类变量、静态常量、实例方法、最终方法、类方法和静态最终方法

在变量这块我们做了区别:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

对的,它们的值不一样。外部类中的值是1、2、3、4,静态内部类里面的值是5、6、7、8。

同样的,我们也在外部类中定义了构造方法:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

好了,我们该去看看Main类中的main()方法了:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

先执行的是创建外部类对象:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

从而会去调用外部类Outer的构造方法:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

在外部类的构造方法中调用的成员都是外部类自身的:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

执行结果:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

从运行结果来看,外部类构造方法调用的成员全部来自自身。

继续往下执行:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

创建了静态内部类对象,从而回去调用静态内部类构造方法:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

那么,静态内部类里面调用的成员,是来自外部类中的呢?还是来自自身呢?我们先来看看执行结果:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

从运行结果来看,我们静态内部类里面调用和外部类一样成员时,实际调用的是自身里面的成员:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

到这里,程序执行完毕!

由此例我们得知,静态内部类访问和外部类一摸一样的成员时,实际是访问的自身成员。

那如果内部类里面没有的成员,外部类里面有呢?

那就访问的是外部类成员,我们来试试。

4.内部类与外部类成员结合

之前我们也有一篇文章专门讲解内部类访问外部类成员:

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

我们现在就来回顾一下。

演示:

请定义一个外部类Outer,然后在外部类Outer中定义一个内部类Inner。

请在外部类中定义和上一小节一样成员。

请在内部类Inner中定义构造方法,在构造方法中访问外部类成员。

请在Main类的main()方法中创建内部类对象。

请观察程序运行结果。

代码:

Outer类:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

Main类:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

结果:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

从运行结果来看,程序没有问题。内部类访问的成员全部来自与外部类中。

简单的来看一下程序:

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

调用的成员全部来自外部类。假如现在你在内部类里面写一个和外部类一摸一样的成员,那么就会发生覆盖,实际调用自身成员。

总结

  • 当内部类和外部类内有相同成员时,就会发生成员覆盖。
  • 内部类、静态内部类、抽象内部类、静态抽象内部类它们定义的成员有所不同,在成员覆盖的时候注意一下。

至此,Java中内部类与外部类成员覆盖相关内容讲解先告一段落,更多内容请持续关注。

答疑

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

上一章

“全栈2019”Java第九十一章:内部类具有多态特性吗?

下一章

“全栈2019”Java第九十三章:为什么要使用内部类?

学习小组

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

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

全栈工程师学习计划

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

“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

版权声明

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