匿名内部类探究——它是一个实例

目录

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

我的学习过程

昨天想学习一下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

结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用SQL查找表中的质数(prime number)和完全数(perfect number)以及几个有趣的SQL语句...

之前在某次interview中被老外问到如何用SQL找出列上的质数和完全数的问题;我当时已经多年没有写过这种考算法和SQL技巧(纯粹的技巧)的语句了,乍遇此问题倒是有些棘手。现在录以记之,供人参考. SQL> create table numbers(NO int) ;表已创建…

Lambda表达式及应用

目录Lambda表达式概念应用在forEach()方法使用用来替代匿名内部类代码验证(Lambda表达式替代匿名内部类)Lambda表达式 概念 语法形式: () -> {} 组成: 括号:表示参数列表;箭头:表示lambda…

UrlRewriter 伪url的配置

UrlRewriter 是微软封装好了的一个URL重写组件。使用它可以让我节约很多自已开发的时间。 好了,开始讲述我的应用经验,这只是很菜鸟的经验,高手就不用看了。 第一步,请从此下载此组件。解压,把UrlRewriter.dll copy到你…

网络地址和广播地址的快速计算方法

目录前提条件方法原理网络地址快速计算示例广播地址快速计算示例前提条件 由IP地址和子网掩码,快速计算网络地址和广播地址。 小窍门前提:当子网掩码组成只有255和0组成时。 方法原理 利用255(或者0)和其他数字的&&#xf…

职场提醒:面试失败n次以后

投了一份简历,是中国一个很有名的医药公司的职位。面试后对方回复说,我不符合他们的要求。之前也参加过很多公司面试,结果都是说我经验不足。一次次的失败也让我对自己有了新的认识,也不断的刺激我。发现一个工作经验不足的人&…

关于list遍历时sychronizedList方法和synchronized同步块的线程安全问题思考

目录我的难点sychronizedList方法无法解决List遍历时线程不安全问题sychronizd同步块为什么可以解决List遍历时线程不安全问题我的思考过程我的难点 sychronizedList方法无法解决List遍历时线程不安全问题 关于慕课网的socket课程学习中,qiujuer老师在课程中讲到&…

WinCE CEDDK之DMA相关函数

CEDDK提供了DMA的相关函数,在CEDDK/DDK_DMA/ddk_dma.c中定义。实际上里面最有用的就两个函数,HalAllocateCommonBuffer(..)和HalFreeCommonBuffer(..)分别用于为DMA申请和释放 首先介绍一下会用到的DMA适配器结构,在ceddk.h中定义,如下: type…

Navicat中无法自定义标量值函数的问题

目录自定义标量函数代码自定义函数无法创建问题自定义标量函数代码 我的思路:我要创建一个自定义标量函数。使用软件:navicat12.1版本。点击Fx图标进行创建。代码中,使用num作为入参,根据num的大小返回颜色。num大于0返回白色&am…

把十六进制字符转换成十进制数

2019独角兽企业重金招聘Python工程师标准>>> /*** Get the hex value of a character (base16).* param c A character between 0 and 9 or between A and F or* between a and f.* return An int between 0 and 15, or -1 if c was not a hex digit.*/public stat…

明白90/10的原理吗?

什么是90/10原理?即在您的一生中,只有10的事情您无能为力,而90的事情都在您的把握之中。 我们无法阻止汽车老化出故障,我们无法预料飞机晚点,我们的行程可能被司机耽误在路上,等等,这些都是我们…

SQL Server更新某一列中多个字典码对应内容(sql示例)

目录示例-查询出多个字典码对应的内容示例-替换多个字典码对应的内容说明CHARINDEXFOR XML PATH示例-查询出多个字典码对应的内容 建立表格:学生-学习科目表student_study 注意:科目kemu列内容是字典码,需要更换成对应内容。 建立表格&…

DirectX支配游戏!历代GPU架构全解析

http://tech.163.com/digi/10/0430/08/65GM21CJ001618J7.html转载于:https://www.cnblogs.com/qilinzi/archive/2010/06/23/1940494.html

mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题

目录mybatisPlus中null值插入和更新问题实际项目解决方法示例一实际项目解决方法示例二field-strategy字段更新插入策略介绍枚举类FieldStrategy源码枚举类字段简介mybatisPlus中null值插入和更新问题 配置mybatisPlus的项目中,默认进行了不是全量更新的策略&#…

javascript变量声明语法的应用和分号讲究适用性

变量声明语法:var变量名,通常应用在语句的代码当中。在语句ECMAScript中必须与关键字var变量名之间至少有一个空格。(也就是变量名需要遵守一定的规范,至少不应该出现中文;如出现中文那就使语法中的语句代码不能相应连接到有关系地对数据处理…

SQL Server和MysQL中的联表更新sql示例

目录需求说明SQL Server中联表更新sql示例MySQL中联表更新sql示例需求说明 需求说明:把表B的报名号数据,更新到另一张表A的报名号列。通过表A证件号码和表B身份证号相等。 SQL Server中联表更新sql示例 UPDATE a SET a.bmhb.bmh FROM A aINNER J…

Mybatis中(#{ })模糊查询like(使用oracle的concat函数嵌套拼接SQL)

需求: 模糊查询需要左右各拼接一个’%’,如:like %key% 。 项目情况: mybatis中动态传参一般采用占位符#{key}。使用数据库:orecle。 错误的尝试: 尝试使用: like % #{key} %这样写不起作用…

linux构建主从域名服务器

实验步骤:一、构建主域名服务器1、安装域名服务(BIND服务器软件包)BIND软件包是目前Linux下使用最广泛的DNS服务器安装包,它可以运行到大多数UNIX服务器中,也包括Linux系统。RHEL4默认没有安装BIND服务器软件包&#x…

HashMap的put方法(Java7)和putVal方法(Java8)

目录数组链表:存在性能最坏情况O(n)Java7的HashMap的put方法思路数组链表红黑树:性能提高到O(logn)Java8的HashMap的putVal方法思路数组链表:存在性能最坏情况O(n) Java8以前,HashMap底层数据结构采用数组链表的结构。 数组特点&…

管道过滤器(Pipe-And-Filter)模式

按照《POSA(面向模式的软件架构)》里的说法,管道过滤器(Pipe-And-Filter)应该属于架构模式,因为它通常决定了一个系统的基本架构。管道过滤器和生产流水线类似,在生产流水线上,原材料在流水线上经一道一道的…

Java创建对象的方式——反序列化创建对象

目录Java创建对象的几种方式反序列化创建对象思路代码示例Java创建对象的几种方式 Java创建对象的方式共有4种。分别为: 1、通过new语句实例化一个对象。 2、通过反射机制创建对象。 3、通过clone()方法创建一个对象。 4、通过反序列化的方式创建对象。 思考&#…