网站首页 > java教程 正文
难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.类中嵌套类
前面我们学习过类里面可以嵌套类,叫内部类。下面来演示一下。
演示:
请定义一个外部类Outer,在外部类Outer中定义一个内部类Inner。
请观察程序代码。
代码:
Outer类:
2.接口中嵌套类
同样的,我们能不能在接口中嵌套类呢?来试试。
演示:
请定义一个外部接口IOuter,在外部接口IOuter中定义一个内部类Inner。在内部类Inner构造方法中显示输出一段话“接口中定义内部类”,最后在Main类的main()方法中创建内部类Inner对象。
请观察程序运行结果。
代码:
IOuter接口:
Main类:
结果:
从运行结果来看,程序完全没有问题。那么我们来看一下整个程序的执行过程。
首先,看Main类中的main()方法:
直接是通过外部接口名调用内部类,然后是使用new关键字来创建对象。能够使用接口名直接调用的成员肯定是静态的,我们来看下IOuter接口中是不是这样的:
可以看到内部类用public static 修饰,意味着可以直接通过接口名调用,从而创建出内部类,执行内部类构造方法:
3.接口中的内部类默认是public static的
定义在接口中的内部类默认是public static的,所以public static可以省略不写。
演示:
请定义一个外部接口IOuter,在外部接口IOuter中定义一个内部类Inner。在内部类Inner构造方法中显示输出一段话“接口中定义内部类”,最后在Main类的main()方法中创建内部类Inner对象。
请观察程序运行结果。
代码:
IOuter接口:
Main类:
结果:
从运行结果来看,程序没有任何问题。
此次我们把内部类前面的public static 修饰符给省略了:
程序依然能够正常的运行,说明接口中的内部类默认是public static的,当你省略不写public static时,编译器会自动帮你添加上。
4.接口与内部类成员互访
接口中可以定义静态常量、抽象方法、默认方法、静态方法和嵌套类型(其中就包括内部类)。
类中可以定义实例变量、实例方法、常量、最终方法、类变量、类方法、静态常量、静态最终方法和嵌套类型(其中就包括内部类和嵌套接口)。
当然了还有抽象类,我们就不每一个都演示。拿部分进行演示。
第5小节演示:内部类访问接口中的成员。
第6小节演示:接口访问内部类中的成员。
5.内部类访问接口中的成员
演示:
请定义一个外部接口IOuter,在外部接口IOuter中定义一个内部类Inner。
请在外部接口IOuter中定义静态常量、默认方法和静态方法。
请在内部类构造方法中访问外部接口中的成员。
请在Mian类的main()方法中创建外部类Inner对象。
请观察程序运行结果。
代码:
IOuter接口:
Main类:
结果:
从运行结果来看,程序编写正确。我们来看看程序过程。
首先,我们从main()方法入手:
创建内部类Inner对象,所以会去调用Inner类构造方法:
构造方法内部开始执行:
此次执行的是显示输出外部接口中的静态常量,其执行结果是:
构造方法继续往下执行:
可能大家也看到了,我把其调用默认方法的代码注释起来了,因为它不能被直接调用。为什么外部接口中的默认方法不能被直接调用?因为我们的内部类是public static的,意味着内部只能调用静态成员,不能调用非静态成员,而默认方法和抽象方法一样都是非静态成员。
如果想尝试调用了会怎么样?那么我们来试试看。
打开调用外部接口中的默认方法代码注释:
运行程序:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/IOuter.java
Error:(38, 13) java: 无法从静态上下文中引用非静态 方法 sayDefault()
这里的静态上下文指的是我们静态内部类Inner。验证之前我们说过的不能直接调用其非静态成员。
好了,我们将调用默认方法这段代码注释上,继续运行程序。
接着往下讲:
此次执行的是调用外部接口中的静态方法,其执行结果是:
至此,程序整个执行完毕!
6.接口访问内部类中的成员
演示:
请定义一个外部接口IOuter,在外部接口IOuter中定义一个内部类Inner。
请在外部接口IOuter中定义静态方法。
请在内部类Inner中定义实例变量、实例方法、常量、最终方法、类变量、类方法、静态常量和静态最终方法。
请在外部接口中创建内部类对象,并在默认方法和静态方法中访问内部类成员。
请在Main类中main()方法中通过外部接口名直接调用其静态方法。
请观察程序运行结果。
代码:
IOuter接口:
Main类:
结果:
从运行结果来看,程序没有任何问题。
接下来,分析一下程序执行过程。
首先,从Main类的main()方法开始执行:
此次执行,调用了外部接口IOuter中的静态方法:
我们在看执行静态方法之前,先来看看外部接口中有一个常量对象:
为什么要创建内部类对象?
因为内部类有一些非静态成员,不能直接通过类名访问,所以必须得持有内部类对象才能访问,所以就创建了内部类对象,而且这个内部类对象还是public static final的。
好了,我们继续往下看:
此次执行的两步分别是调用实例变量和常量,它们都是非静态成员,所以需要用内部类实例对象来调用。对应的执行结果:
继续往下执行:
此次执行的两步分别是调用内部类中的类变量和静态常量。它们都是静态成员,所以使用类名就可以调用。其对应的执行结果:
继续往下执行:
此次执行的两步分别是调用内部类中的实例方法和最终方法。它们都是非静态方法,所以要使用内部类对象进行调用,其执行结果:
继续往下执行:
此次执行的两步分别是调用内部类中的类方法和静态最终方法。它们都是静态方法,可以直接使用类名进行调用,其对应执行结果:
程序整个执行完毕!
附:接口学习资料
附:类学习资料
总结
- 接口中可以定义内部类。
- 接口中内部类默认是public static的。
- 接口中内部类可以直接访问外部接口中静态成员。
- 外部接口不能直接访问内部类中的成员。
至此,Java中接口中定义内部类相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
“全栈2019”Java第八十八章:接口中嵌套接口的应用场景
下一章
“全栈2019”Java第九十章:内部类可以向上或向下转型吗?
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!
猜你喜欢
- 2024-09-19 “全栈2019”Java第一百一十二章:什么是闭包?
- 2024-09-19 Java两个Set集合判断是否有交集(java set求并集)
- 2024-09-19 从一道面试题说起:GET 请求能传图片吗?
- 2024-09-19 Java设计模式(二十):职责链模式(java责任链模式的应用场景)
- 2024-09-19 32位和64位的JVM应该用哪个?
- 2024-09-19 Mac下安装 JDK17(mac下安装nvm以及node)
- 2024-09-19 Java Web项目部署(二)——JDK、Tomcat
- 2024-09-19 Java Web项目部署(三)-MySQL8(javaweb连接mysql具体步骤)
- 2024-09-19 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
- 2024-09-19 win7下绿色版mysql-5.7.18winx64如何配置
你 发表评论:
欢迎- 最近发表
-
- class版本不兼容错误原因分析(class更新)
- 甲骨文Oracle公司为Java的最新LTS版本做出改进
- 「版本发布」Minecraft Java开发版 1.19.4-pre1 发布
- java svn版本管理工具(svn软件版本管理)
- 我的世界1.8.10钻石在第几层(我的世界1.7.2钻石在哪层)
- Java开发高手必备:在电脑上轻松切换多个JDK版本
- 2022 年 Java 开发报告:Java 8 八年不到,开发者都在用什么?
- 开发java项目,选择哪个版本的JDK比较合适?
- Java版本选型终极指南:8 vs 17 vs 21特性对决!大龄程序员踩坑总结
- POI Excel导入(poi excel导入附件)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)