难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.抽象内部类
一个外部类里面还可以定义抽象内部类。抽象内部类具有抽象类的特性,类里面可以添加抽象方法。
抽象内部类定义格式:
演示:
请定义一个外部类Outer,在外部类Outer里面定义一个抽象内部类Inner。实例化其抽象内部类的Inner。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(10, 35) java: lab.Outer.Inner是抽象的; 无法实例化
从运行结果来看,抽象内部类不可以被实例化。抽象内部类具备和抽象类一样的特性,那就是不能被实例化。
2.外部类不可以继承抽象内部类
既然抽象内部类要实例化,那么抽象内部类是不是可以被外部类继承呢?答案是不行的。不光抽象内部类不可以被外部类继承,就连内部类、静态内部类都不可以被外部类继承。
演示:
请定义一个外部类Ouer,在外部类Outer里面定义一个抽象内部类Inner,再让外部类Outer继承抽象内部类Inner。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
错粗信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Outer.javaError:(6, 8) java: 涉及lab.Outer的循环继承/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(9, 9) java: 找不到符号 符号: 类 Outer 位置: 类 main.MainError:(9, 27) java: 找不到符号 符号: 类 Outer 位置: 类 main.Main
我们来看这个错误,循环继承?什么叫循环继承?说白点就是A继承B,B继承C,C继承A,这就叫循环继承,还有比如像A继承A也叫循环继承。例如下面我举的例子:
Outer类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Outer.javaError:(6, 8) java: 涉及lab.Outer的循环继承/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(9, 9) java: 找不到符号 符号: 类 Outer 位置: 类 main.MainError:(9, 27) java: 找不到符号 符号: 类 Outer 位置: 类 main.Main
所以,这个外部类继承(抽象、静态)内部类都属于循环继承。是一个错误的写法。
3.抽象内部类权限修饰符
抽象内部类一样可以被权限修饰符所修饰。
演示:
请定义一个外部类Outer,在外部类Outer里面定义四个分别被public、protected、package-private、private所修饰的抽象内部类。然后在Main类中创建外部类Outer对象。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
在本例中,我们演示了四种不同的权限修饰符来修饰抽象内部类,程序运行没有任何问题。这四种权限修饰符的作用在之前章节也有详细讲解,这里就不在赘述,只是展示它们可以用来修饰抽象内部类。
抽象内部类与static关键字搭配就成了静态抽象内部类。
抽象内部类与final关键字不能搭配使用,因为抽象内部类是抽象的意味着不能被实例化,只有它的(非抽象)子类才能被实例化,而final关键字的作用在类上能使该类不可以被继承,所以就与抽象类相悖,自相矛盾,不能与抽象内部类搭配使用。
4.抽象内部类同内部类访问外部类成员规则一样
抽象内部类访问外部类成员和内部类访问外部类成员规则一样,并无区别。
演示:
请定义一个外部类Outer,然后在外部类Outer里面定义一个抽象内部类和四种访问权限的成员,内部类里面也一样。然后在外部类构造方法中访问抽象内部类成员,在抽象内部类里面访问外部类成员。
代码:
Outer类:
Main类:
结果:
从运行结果来看,我们的程序是没有问题的。抽象内部类和内部类一样,无论是外部类访问抽象内部类成员还是抽象内部类访问外部类成员,都和内部类与外部类成员互访是一样的。这里呢,方法就不演示了。
上面Outer类中有一个inner对象,它的值是一个匿名内部类,匿名内部类后面马上要讲解到,请大家持续关注。
请注意:
抽象内部类和内部类一样,静态成员不允许定义,但静态常量除外。
5.静态抽象内部类
一个外部类里面还可以定义静态抽象内部类。静态抽象内部类具有抽象类的特性,类里面可以添加抽象方法,但是不能添加静态抽象方法,因为静态不能与抽象搭配,原因是静态方法不能被子类重写,也就无法实现父类静态抽象方法。
静态抽象内部类定义格式:
演示:
请定义一个外部类Outer,在外部类Outer里面定义一个静态抽象内部类Inner。实例化其静态抽象内部类的Inner。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
从运行结果来看,静态抽象内部类和静态内部类特性一样,静态抽象内部类与外部类互访和静态内部类与外部类互访一样。
静态抽象内部类权限访问和抽象内部类一样,这里就不再赘述。
总结
- 抽象内部类是将内部类用abstract关键字修饰的内部类。
- 静态抽象内部类是内部类用static和abstract关键字修饰的内部类。
- 抽象内部类里面可以添加抽象方法,不能添加静态抽象方法。
- 静态抽象内部类里面可以添加抽象方法,不能添加静态抽象方法。
- 抽象内部类里面不能添加静态成员,但静态常量除外。
- 静态抽象内部类里面可以添加静态成员。
- 抽象内部类与外部类成员互访和内部类与外部类成员互访规则是一样的。
- 静态抽象内部类与外部类成员互访和静态内部类与外部类成员互访规则是一样的。
至此,Java中抽象内部类和静态抽象内部类相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
“全栈2019”Java第七十六章:静态、非静态内部类访问权限
下一章
“全栈2019”Java第七十八章:内部类可以继承其他类吗?
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!