目录

  • 我的学习过程
  • 匿名内部类概述
  • 匿名内部类探究
  • 代码验证(匿名内部类是一个实例)
  • 结论

我的学习过程

昨天想学习一下Java8新特性,看到Lambda表达式可以替代匿名内部类。我对匿名内部类不太理解,决定学习一下。并进行了下面的归纳和思考。

匿名内部类概述

继承式匿名内部类声明格式:

new 类名(){};

接口式匿名内部类声明格式:

new 接口名(){
//接口中方法要重写(@Override可省略,不需要重写接口的全部方法)
...
};

匿名内部类有什么特点呢?

  1. 匿名内部类没有类名,它也就不能定义出构造器,所以它没有自己的构造器。
  2. 匿名内部类是隐式地继承了一个特定的类,或者隐式地实现了一个特定的接口。
  3. 匿名内部类无法定义静态成员和静态方法。
  4. 匿名内部类不能用public,protected,private,static修饰。
  5. 匿名内部类只能创建一个实例。

匿名内部类探究

匿名内部类是一个实例吗?
答:继承式匿名内部类是一个实例,接口式匿名内部类不是一个实例。有待考证*1
我的思考:
隐名内部类由于没有类名,就没有自己的构造器。

对于继承式匿名内部类来说,匿名内部类是某个特定类的子类,使用new时候,相当于通过父类构造器实例化了一个实例。

对于接口式匿名内部类来说,匿名内部类是实现了某个特定的接口,使用new的时候,相当于实现了特定接口,不是实例化。
有待考证*1
另外想法:接口式匿名内部类是一个类,使用new时,就是相当于实例化了一个对象,只是对象内部实现了特定接口,所以是一个实例。倾向于认为:接口式匿名内部类也是一个实例。

进一步考证*1
接口式匿名内部类是一个实例。

代码验证(匿名内部类是一个实例)

代码文件包含(同一个包下):类:Car.java、接口:CarFun.java、main函数验证:Test.java

类:Car.java

上图说明:这是一个叫Car的类,它实现了CarFun接口,对接口中的drive()和stop()方法进行了重写。

接口:CarFun.java

上图说明:这个是叫CarFun的接口,它有drive()和stop()两个方法。

main函数验证:Test.java

==进一步待考证*1:==匿名内部类可以传参数吗?我这里示例传了参数height的值175,所以它还是匿名内部类吗?

进一步考证*1
去掉height参数。代码如下:
通过第8行的zerocar.getHeight()语句打印,执行结果得到

Height: 0

说明:不传参数时候,zerocar是一个实例对象,匿名内部类是一个实例。
思考:所以有参数情况下还是一个匿名内部类吗?
暂时不知道。有待进一步考证*2

这部分在main函数下写了继承式匿名内部类。它是一个Car的子类,通过Car的有参构造器实例化了一个实例zerocar。

//Car的有参构造器
public Car(int height, int weight) {this.height = height;}

且通过第7行的zerocar.getHeight()语句打印,执行结果得到

Height: 175

进一步印证了zerocar是个实例对象。

(续上一张图片)

这部分在main函数下写了接口式匿名内部类。我选择把接口CarFun里的两个方法都进行了重写(不一定要全部方法重写,因为此处可以省略@Override)。并用zerocarfun调用了drive()和stop()方法。执行结果:

zero开车了,已经开了0.2600633412878144千米
zero停车了

执行成功,说明zerocarfun可以调用方法,说明它是一个对象。所以接口式匿名内部类也是一个实例。

同时验证了:
继承式匿名内部类是通过父类构造器实例化,可以是有参构造器,也可以是无参构造器。

同时发现:
继承式匿名内部类的花括号内写不了打印语句,因为我写的打印语句println报红,末尾分号颜色变灰色。

【报错1】:Cannot resolve symbol ‘println’
【报错2】:Unnecessary semicolon ‘;’
Inspection info: Reports on any unnecessary semicolons, whether between class members, inside block statements, or after class definitions. While valid Java, these semicolons are redundant, and may be removed.
这个和百度百科中Java内部类-继承式匿名内部类的写法有出入。为什么我这边不能用打印语句呢?
百度一下。没百度到原因。有说缺少main函数导致。可是我的代码并不缺少main函数。难道是继承式匿名内部类开辟了另外一个区域,独立于main函数了吗?有待考证*2

结论

匿名内部类它是一个实例。

匿名内部类探究——它是一个实例相关推荐

  1. php中访问控制_一个实例:基于RBAC理论的访问控制实践

    基于角色的访问控制(RBAC)是目前公认的解决大型企业的统一资源访问控制的有效方法.访问控制实际是复杂的,解决方式也是多样的.不用一味追求完善,在有限的资源内选择最合适自己的更重要. 基于角色的访问控 ...

  2. 限制程序只打开一个实例(转载)

    当我们在做一些管理平台类的程序(比如Windows的任务管理器)时,往往需要限制程序只能打开一个实例.解决这个问题的大致思路很简单,无非是在程序打开的时候判断一下是否有与自己相同的进程开着,如果有,则 ...

  3. 众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?...

    string 类型每次实例化都会重新创建一个实例: 解释:string 类型重载了运算符 "=" ,每次 "=" 操作都是一次 "new". ...

  4. ​iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景.

    2019独角兽企业重金招聘Python工程师标准>>> 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在 ...

  5. docker 主进程 日志_[docker]从一个实例,一窥docker进程管理

    在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...

  6. 让Java程序只运行一个实例

    一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...

  7. php单例模式的实例,PHP的单例模式的一个实例_php

    这篇文章对于php单例模式的解释并不一定完善!只是举一个实例而已,目的是让我自己通过一个实例可以加深对单例模式的理解!在此,仅供参考! 单例:可以简单的理解是通过一个类,只能实例化单个对象,不能实例化 ...

  8. 从一个实例,一窥docker进程管理

    在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...

  9. 如何聚焦自己的研究方向?一个实例研究

    如何聚焦自己的研究方向?一个实例研究 文章目录 如何聚焦自己的研究方向?一个实例研究 目标人群 主讲人介绍 平台 内容 Part I: 如何看到领域内文献的Overview? Part II: 如何专 ...

最新文章

  1. Mask-RCNN论文解读
  2. 教育的本质是人点亮人
  3. 第五章:条件、循环以及其他语句(上)
  4. |Vijos|树状数组|P1512 SuperBrother打鼹鼠
  5. java语言实验报告,Java语言 实验报告(二)
  6. 视图计算背后的技术架构思考
  7. 跨越DDD从理论到工程落地的鸿沟
  8. 95-240-060-源码-state-状态生存时间(TTL)
  9. 小技巧:Mac下快速锁屏
  10. sqlite3数据存储最多存储多少条数据?达到上限如何处理?_在线公开课 | 在数据爆炸的当下,教你设计一个能实现9个9数据可靠性的存储系统...
  11. RocketMQ(一)RocketMQ介绍及核心概念
  12. 动词ing形式做定语的用法总结
  13. 有趣--等额本息还款
  14. 斯坦福公布3D街景数据集:2500万张图像,8个城市模型 | 下载
  15. Hive3.1.2 on spark
  16. IT江湖--这个冬天注定横尸遍野
  17. 电视机的4k和8k是什么意思
  18. linux 的时区设置函数tzset()
  19. Oracle触发器来记录表删除操作简单方法
  20. SAP实施项目上的内部顾问与外部顾问,相互为难还是相互成就?

热门文章

  1. Windows 7 资源管理器搜索Channel 9 视频
  2. Jquery简单的右侧浮动菜单
  3. USB peripherals can turn against their users
  4. AutoCAD_acadiso.dwt卡死
  5. linux6.0 SVN 服务搭建
  6. Scott Mitchell 的ASP.NET 2.0数据教程之五:: 声明参数
  7. Spark应用日志级别设置
  8. Hive的数据模型-管理表
  9. count(*),count(1),count(0)效率
  10. python定时任务是异步的吗_定时任务、异步任务