难度
初级
学习时间
20分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.局部内部类
在任何 作用域 中定义的类都称之为局部内部类。
演示:
局部内部类。
代码:
没有学习过的同学或者是不太清楚局部内部类的同学也别急,可以点击下面局部内部类学习资料来进行学习。
附:局部内部类学习资料
2.局部内部类继承局部内部类
前面我们学过局部内部类和抽象局部内部类,接下来,我们要看看类与类之间能不能继承。
演示:
请在Main类main()方法中定义一个抽象局部内部类内部类People和一个局部内部类Student。
在抽象局部内部类People中定义一个抽象方法。
让局部内部类Student继承抽象局部内部类People,并实现其抽象方法。
在main()方法中(作用域内)创建局部内部类Student对象,并调用其实现方法。
请观察程序运行结果。
代码:
Main类:
结果:
从运行结果来看,局部内部类与局部内部类之间是可以继承的。我们简单的来分析一下程序运行过程。
首先,我们来看看定义的抽象局部内部类:
再来看看子类:
继续往下看:
此次执行的是创建了局部内部类对象,并调用其实现方法。
至此,程序执行完毕!
这个例子让我们知道了局部内部类与局部内部类之间是可以继承的。
3.局部内部类继承内部类
接下来,我们来试试局部内部类来继承内部类,看行不行。
演示:
请在Main类main()方法中定义一个局部内部类Student。
再定义一个抽象内部类People(外部类)。
让局部内部类Student继承抽象内部类People,并实现其抽象方法。
在main()方法中(作用域内)创建局部内部类Student对象,并调用其实现方法。
请观察程序运行结果。
代码:
Main类:
结果:
错误信息:
文字版:
从运行结果来看,我们程序错误了。我们来看看错误原因。
首先,我们在Main类里面定义了一个内部类:
然后在main()方法里面定义了一个局部内部类Student,让其继承People类,并实现其抽象方法:
再往下就是创建局部内部类对象:
好像都没有什么问题。
我们再来看看错误信息:
“无法从静态上下文中引用非静态 变量 this”
静态上下文指的是什么?非静态变量this指的又是什么?
静态上下文指的是:
这个 静态方法 main()。
非静态变量this指的是:
这个抽象内部类和变量一样,不被static关键字修饰就是一个实例变量,若被static关键字修饰则是一个静态变量。
如何解决这个问题?
只需将抽象内部类用static关键字修饰即可。
结果:
从运行结果来看,局部内部类定义在静态方法中需要继承静态内部类。
假如局部内部类定义在非静态方法中,继承还需要内部类是静态的吗?来试试。
结果:
从运行结果来看,定义在非静态方法中的局部内部类可以继承非静态内部类。
我们再来试试继承静态内部类:
结果:
从运行结果来看,定义在非静态方法中局部内部类也可以继承静态内部类。
4.局部内部类继承外部类
前面讨论了局部内部类继承局部内部类和局部内部类继承内部类。
现在我们来试试局部内部类继承外部类。
演示:
请在Main类main()方法中定义一个局部内部类Student。
再定义一个 抽象类 People(外部类)。
让局部内部类Student继承抽象类People,并实现其抽象方法。
在main()方法中(作用域内)创建局部内部类Student对象,并调用其实现方法。
请观察程序运行结果。
代码:
People类:
Main类:
结果:
从运行结果来看,局部内部类可以继承外部类。
总结
- 局部内部类无论定义在哪都可以继承局部内部类。
- 当局部内部类定义在静态方法中时,只能继承静态内部类。
- 当局部内部类定义在非静态方法中时,静态内部类和非静态内部类都可以继承。
- 局部内部类无论定义在哪都可以继承外部类。
至此,Java中局部内部类与继承相关内容讲解先告一段落,更多内容请持续关注。
附:类学习资料
附:抽象类学习资料
附:接口学习资料
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第一百章:局部内部类可以实现接口吗?
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!