网站首页 > java教程 正文
难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.多态
如果多态还不清楚的同学可以先去复习一下多态:
“全栈2019”Java第五十五章:方法的静态绑定与动态绑定
“全栈2019”Java第五十八章:多态中方法返回类型可以是子类类型
2.内部类与多态
我们之前学习过类与多态,接下来看看内部类与多态。
演示:
请定义一个外部类Outer,在外部类Outer中定义一个嵌套接口Animal,再定义两个内部类Dog和Cat。内部类Dog和Cat分别都实现了嵌套接口Animal。
在嵌套接口Animal中定义一个抽象方法eat()。
在Main类中定义一个静态方法eat(),方法参数接受一个接口类型Animal。方法定义完毕之后,在main()方法中分别创建Dog类和Cat类对象,然后调用eat()方法,传入Dog类对象和Cat类对象。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
从运行结果来看,程序没有什么问题。我们来简单分析一下程序执行过程。
首先,我们来看main()方法:
率先执行的是创建外部类Outer对象:
这是因为创建内部类对象之前,外部类对象必须先要存在,再使用外部类对象去创建内部类对象。
再往下执行:
创建了两个内部类对象Dog和Cat。继续往下执行:
调用其eat()方法,该方法使用到多态的特性,方法参数接受一个接口类型,也就是两个内部类Dog和Cat共同实现的接口。方法参数接受一个接口类型多态特性体现在方法可以接受该接口的实现类。
eat()方法具体做了哪些事情?来看看:
可以看到的是,方法体中调用了接口的抽象方法,而这个抽象方法在其实现类Dog和Cat里面都有各自的实现,所以这里程序运行时会去调用实际对象的eat()方法:
同样的,eat(cat)也会去调用cat对象中的eat()方法:
这里涉及到方法的静态绑定和动态绑定。
在此例中,Animal接口中的抽象方法属于动态绑定方法,所以程序运行时会去执行实际对象的实现方法。什么意思?
接口中的抽象方法都是动态绑定方法,所以Animal接口中的eat()方法也是动态绑定方法:
动态绑定方法有个特性,那就是程序运行时执行实际对象的方法。什么意思?
我们来看看Main类中的eat()方法:
它的参数Animal类型并没有一个实际存在的对象,animal(注意大小写,在此例中大写是类型,小写是引用)是一个引用并不是实际存在的对象,我们的实际存在的对象只有dog和cat,根本就没有animal对象,所以animal在调用eat()方法时,如果dog对象传递进来,那么就去调用dog对象的eat()方法;
如果是cat对象传进来,那么就去调用cat的eat()方法。
程序分析完毕!
为什么使用内部类?
使用内部类的令人信服的理由包括:
它是一种逻辑分组仅在一个地方使用的类的方法:如果一个类只对另一个类有用,那么将它嵌入该类并将两者保持在一起是合乎逻辑的。 嵌套这样的“帮助类”使得它们的包更加简化。
它增加了封装:考虑两个顶级类A和B,其中B需要访问A的成员,否则这些成员将被声明为私有。 通过将类B隐藏在类A中,可以将A的成员声明为私有,并且B可以访问它们。 另外,B本身可以隐藏在外面。
它可以带来更易读和可维护的代码:在顶级类中嵌套小类会使代码更接近于使用它的位置。
总结
- 内部类也具有多态特性。
至此,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)
本文暂时没有评论,来添加一个吧(●'◡'●)