“全栈2019”Java第九十九章:局部内部类与继承详解

111 阅读7分钟
原文链接: www.toutiao.com

难度

初级

学习时间

20分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

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

1.局部内部类

在任何作用域中定义的类都称之为局部内部类。

演示:

局部内部类。

代码:

“全栈2019”Java第九十九章:局部内部类与继承详解

没有学习过的同学或者是不太清楚局部内部类的同学也别急,可以点击下面局部内部类学习资料来进行学习。

附:局部内部类学习资料

全栈2019”Java第九十四章:局部内部类详解

全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?

全栈2019”Java第九十六章:抽象局部内部类详解

全栈2019”Java第九十七章:在方法中访问局部内部类成员详解

全栈2019”Java第九十八章:局部内部类访问作用域成员详解

2.局部内部类继承局部内部类

前面我们学过局部内部类和抽象局部内部类,接下来,我们要看看类与类之间能不能继承。

演示:

请在Main类main()方法中定义一个抽象局部内部类内部类People和一个局部内部类Student。

在抽象局部内部类People中定义一个抽象方法。

让局部内部类Student继承抽象局部内部类People,并实现其抽象方法。

在main()方法中(作用域内)创建局部内部类Student对象,并调用其实现方法。

请观察程序运行结果。

代码:

Main类:

“全栈2019”Java第九十九章:局部内部类与继承详解

结果:

“全栈2019”Java第九十九章:局部内部类与继承详解

从运行结果来看,局部内部类与局部内部类之间是可以继承的。我们简单的来分析一下程序运行过程。

首先,我们来看看定义的抽象局部内部类:

“全栈2019”Java第九十九章:局部内部类与继承详解

再来看看子类:

“全栈2019”Java第九十九章:局部内部类与继承详解

继续往下看:

“全栈2019”Java第九十九章:局部内部类与继承详解

此次执行的是创建了局部内部类对象,并调用其实现方法。

至此,程序执行完毕!

这个例子让我们知道了局部内部类与局部内部类之间是可以继承的。

3.局部内部类继承内部类

接下来,我们来试试局部内部类来继承内部类,看行不行。

演示:

请在Main类main()方法中定义一个局部内部类Student。

再定义一个抽象内部类People(外部类)。

让局部内部类Student继承抽象内部类People,并实现其抽象方法。

在main()方法中(作用域内)创建局部内部类Student对象,并调用其实现方法。

请观察程序运行结果。

代码:

Main类:

“全栈2019”Java第九十九章:局部内部类与继承详解

结果:

“全栈2019”Java第九十九章:局部内部类与继承详解

错误信息:

“全栈2019”Java第九十九章:局部内部类与继承详解

文字版:

/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(51, 17) java: 无法从静态上下文中引用非静态 变量 this

从运行结果来看,我们程序错误了。我们来看看错误原因。

首先,我们在Main类里面定义了一个内部类:

“全栈2019”Java第九十九章:局部内部类与继承详解

然后在main()方法里面定义了一个局部内部类Student,让其继承People类,并实现其抽象方法:

“全栈2019”Java第九十九章:局部内部类与继承详解

再往下就是创建局部内部类对象:

“全栈2019”Java第九十九章:局部内部类与继承详解

好像都没有什么问题。

我们再来看看错误信息:

“无法从静态上下文中引用非静态 变量 this”

静态上下文指的是什么?非静态变量this指的又是什么?

静态上下文指的是:

“全栈2019”Java第九十九章:局部内部类与继承详解

这个静态方法main()。

非静态变量this指的是:

“全栈2019”Java第九十九章:局部内部类与继承详解

这个抽象内部类和变量一样,不被static关键字修饰就是一个实例变量,若被static关键字修饰则是一个静态变量。

如何解决这个问题?

只需将抽象内部类用static关键字修饰即可。

“全栈2019”Java第九十九章:局部内部类与继承详解

结果:

“全栈2019”Java第九十九章:局部内部类与继承详解

从运行结果来看,局部内部类定义在静态方法中需要继承静态内部类。

假如局部内部类定义在非静态方法中,继承还需要内部类是静态的吗?来试试。

“全栈2019”Java第九十九章:局部内部类与继承详解

结果:

“全栈2019”Java第九十九章:局部内部类与继承详解

从运行结果来看,定义在非静态方法中的局部内部类可以继承非静态内部类。

我们再来试试继承静态内部类:

“全栈2019”Java第九十九章:局部内部类与继承详解

结果:

“全栈2019”Java第九十九章:局部内部类与继承详解

从运行结果来看,定义在非静态方法中局部内部类也可以继承静态内部类。

4.局部内部类继承外部类

前面讨论了局部内部类继承局部内部类和局部内部类继承内部类。

现在我们来试试局部内部类继承外部类。

演示:

请在Main类main()方法中定义一个局部内部类Student。

再定义一个抽象类People(外部类)。

让局部内部类Student继承抽象类People,并实现其抽象方法。

在main()方法中(作用域内)创建局部内部类Student对象,并调用其实现方法。

请观察程序运行结果。

代码:

People类:

“全栈2019”Java第九十九章:局部内部类与继承详解

Main类:

“全栈2019”Java第九十九章:局部内部类与继承详解

结果:

“全栈2019”Java第九十九章:局部内部类与继承详解

从运行结果来看,局部内部类可以继承外部类。

总结

  • 局部内部类无论定义在哪都可以继承局部内部类。
  • 当局部内部类定义在静态方法中时,只能继承静态内部类。
  • 当局部内部类定义在非静态方法中时,静态内部类和非静态内部类都可以继承。
  • 局部内部类无论定义在哪都可以继承外部类。

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

附:类学习资料

全栈2019”Java第三十六章:类

全栈2019”Java第三十七章:类与字段

全栈2019”Java第三十八章:类与方法

全栈2019”Java第三十九章:构造函数、构造方法、构造器

全栈2019”Java第四十章:this关键字

全栈2019”Java第四十一章:static关键字

全栈2019”Java第四十二章:静态代码块与初始化顺序

全栈2019”Java第四十三章:封装

全栈2019”Java第四十四章:继承

全栈2019”Java第四十五章:super关键字

全栈2019”Java第四十六章:继承与字段

全栈2019”Java第四十七章:继承与方法

全栈2019”Java第四十八章:重写方法Override

全栈2019”Java第四十九章:重载与重写对比详解

全栈2019”Java第五十章:继承与构造方法详解

全栈2019”Java第五十一章:继承与final关键字详解

全栈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第一百章:局部内部类可以实现接口吗?

学习小组

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

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

全栈工程师学习计划

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

“全栈2019”Java第九十九章:局部内部类与继承详解

版权声明

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