java 内部类面试题_面试题(一)关于内部类的面试题

2023-11-07

一、看下面代码求值

1 /要求:使用已知的变量,在控制台输出30,20,10。2  classOuter {3 public int num = 10;4 classInner {5 public int num = 20;6 public voidshow() {7 int num = 30;8 System.out.println(?);9 System.out.println(??);10 System.out.println(???);11 }12 }13 }14

15 classInnerClassTest {16 public static voidmain(String[] args) {17 Outer.Inner oi = new Outer().newInner();18 oi.show();19 }20 }

答案:num、this.num、Outer.this.num

解析:这题你如何明白了上面总结中的第二点,那么非常简单,考察的就是1、局部变量 2、this,和3、Outer.this,也就是内部类访问外部类属性方法的原理。这考察三个东西,

1、在一个方法中,使用直接使用变量名,肯定使用的是局部变量,因为会把大的成员变量给隐藏掉,这题中,也就是说show方法中的num会将内部类中的成员变量num隐藏掉,而内部类中的成员变量num又会把外部类中的成员变量num隐藏掉,所以通过直接输出num,会是show方法中的          局部变量的值30.

2、使用this.num调用,其this代表的是调用该方法的对象,调用show方法的是oi,oi也就是内部类对象,所以oi.num也就标识内部类的成员变量num的值20

3、Outer.this.num,调用的外部类中的成员变量num的值也就是10,这个如果不清楚就看上面总结中的第二点,就是那个原理。

二、按照要求补齐代码

1 按照要求,补齐代码2 interface Inter { voidshow(); }3 class Outer { //补齐代码 }

4 classOuterDemo {5 public static voidmain(String[] args) {6 Outer.method().show();7 }8 }9 要求在控制台输出”HelloWorld”

答案:

interface Inter { voidshow(); }classOuter {//补齐代码

public staticInter method(){return newInter(){voidshow(){

System.out.println("HelloWorld");

}

};

}

}classOuterDemo {public static voidmain(String[] args) {

Outer.method().show();

}

}

解析:这个题目挺有趣的,考了很多东西,一开始只能说我自己度懵逼了,是一个局部匿名内部类。  通过看主方法中的调用,Outer.method(),能直接用类名调用方法,

那么肯定该方法就是一个static方法,然后又直接调用了show()方法,说明这个method方法有一个返回值,其返回值类型就是实现该接口类的类型,因为只有接口中有show()这个方法。所以在method中就是一个匿名内部类。

三、以下代码运行结果是什么?

1 public classBwfOuterClass {2

3 private int x = 1;4

5 private int y = 2;6

7 private classBwfInnerClass{8

9 private int x = 3;10

11 public voidprint(){12

13 System.out.println("x+y="+(x+y) );14

15 }16

17 }18

19 public static voidmain(String[] args) {20

21 new BwfOuterClass().newBwfInnerClass().print();22

23 }24

25 }

答案:

x+y=5

[面试技术点]

Java中内部类的使用。

[解读]

在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这三种:成员内部类、局部内部类、匿名内部类,如下图所示:

16dac117a149f80afccc1ef261efce04.png

本题考的是成员内部类。成员内部类是最普通的内部类,它的定义为位于另一个类的内部,类似于一个成员属性。可以使用修饰符private、default、protected、public。

本题中BwfInnerClass是BwfOuterClass的成员内部类,成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。但是值得注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

外部类.this.成员变量

外部类.this.成员方法

本题中,如果把print方法做如下修改:

public void print(){

System.out.println("x+y=" + (BwfOuterClass.this.x+y));

}

则输出结果为:x+y=3四、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调。

五、为什么内部类调用的外部变量必须是final修饰的?

因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。

为了解决:局部变量的生命周期与局部内部类的对象的生命周期的不一致性问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 内部类面试题_面试题(一)关于内部类的面试题 的相关文章

  • 哈工大计算机网络MOOC作业题解答

    第一周 如图所示网络 A在t 0时刻开始向C发送一个2Mbits的文件 B在t 0 1 e秒 e为无限趋近于0的小正实数 向D发送一个1Mbits的文件 忽略传播延迟和结点处理延迟 请回答下列问题 如果图中网络采用存储 转发方式的报文交换
  • conda SSL错误 SSLError,爬虫应用总结

    1 conda SSL错误 SSLError Can t connect to HTTPS URL because the SSL module is not available 解决办法 使用conda环境来运行爬虫程序 因为无法使用电脑
  • 通过小皮面板启动后端php项目和数据库

    1 启动php项目开启后端网站 可去官网下载 下载后就能使用了 官网地址 小皮面板 phpstudy 让天下没有难配的服务器环境 下载完成后打开 php项目需要启动apache或nginx 目前我用的是nginx 可以更改一些配置 先下载后
  • Linux 定期清理内存脚本

    bin bash 清理内存脚本 释放 PageCache echo echo 1 gt proc sys vm drop caches sudo sh 释放 dentries 和 inodes echo echo 2 gt proc sys
  • 5个用于图像处理的Python库

    图像处理是操纵图像以从中提取特征的现象 在当今计算机视觉和深度学习的世界中 大量使用不同的图像处理算法对图像数据集进行边缘检测 识别和分类 有时 这些算法也会逐帧应用于视频 以从中提取特征 在今天的文章中 我们将介绍5个最好的Python库
  • 如何计算单个region server能支持的最大region数

    虽理论上说单个region server能支持最多1000个region 但实际上是不太可能的 RegionServer维护Master分配给它的region 处理对这些region的IO请求 负责切分在运行过程中变得过大的region r
  • git提交代码弹出windows安全中心

    不知道有没有uu和我一样 第一次用git提交代码到码云时 前面都挺好的 突然最后一步来个windows安全中心 我就上网搜 说啥都都有 就是一个用户名密码呗 我想 然后按照网上的方法是github的用户名和密码 我当时还奇怪了这和githu
  • Java设计模式——状态模式

    文章目录 介绍状态模式 状态模式 介绍状态模式 核心思想就是 当对象的状态改变时 同时改变其行为 也就是行为由其状态决定 介绍 意图 允许对象在内部状态发生改变时改变它的行为 对象看起来好像修改了它的类 主要解决 对象的行为依赖于它的状态
  • Java中的8种基本数据类型

    Java基本类型共有八种 基本类型可以分为三类 字符类型char 布尔类型boolean以及数值类型byte short int long float double 数值类型又可以分为整数类型byte short int long和浮点数类
  • 梯度下降算法对比

    损失函数为凸函数时 梯度下降一定可以得到全局最优解
  • Linux shell 暂停执行脚本

    bin bash current path pwd echo 当前路径 current path echo webapps path current path webapps echo 当前路径webapps子目录 webapps path
  • 玩具城

    官园小商品批发市场 路线 地铁2号线 车公庄 红桥市场路线 地铁5号线 天坛东门 来自 ITPUB博客 链接 http blog itpub net 118838 viewspace 625828 如需转载 请注明出处 否则将追究法律责任
  • 【系统】win11怎么退回win10

    根据微软官方提供的回滚方案显示 在升级Win11之后的10天之内 用户可以通过系统恢复选项将Win11还原Win10 操作方式也比较简单 大家可以打开系统设置 找到相应选项 选择并确认后即可轻松将Win11回退早期版本 详细操作步骤如下 一
  • C++学习(四六六)Multiple parse contexts are available for this file

    Note Multiple parse contexts are available for this file Choose the preferred one from the editor menu 参考 Multiple parse
  • Linux基础篇学习——常见系统命令:ls,pwd,cd,date,hwclock,passwd,su,clear,who,w,uname,uptime,last,dmesg,free,ps,top

    ls 显示指定目录中的内容 ls OPTION FILE OPTION a all 显示所有文件包括隐藏文件 l 列出长属性 显示出文件的属性与权限等数据信息 i 列出inode节点号 结合 l使用 d 显示目录本身 且不列出目录中的列表文
  • MD5算法分析及逆向详解

    题外话 最近在看加密与解密 看到加密算法部分 感觉对于初次接触的新手还是有些难度的 故写下该篇文章 算作一个引导吧 新手飘过 老鸟勿笑 基本原理 MD5的典型应用是对一段信息 Message 产生信息摘要 Message Digest 以防
  • springsecurity 获取token流程分析

    一 oauth token password模式获取token源码主要操作 1 定义请求参数 增加请求头 Authorization 否则 在请求参数使用 client id 注意 此头为base64拼接格式为 client id clie
  • 光耦隔离继电器驱动

    一 前言 因为吃亏了 而且不小 发个贴记录下 以后长记性 问题是由于不做光耦隔离 电路不稳定 做了光耦隔离 上电和断电瞬间被隔离器件上电抖动一下 明显不可以 错误的示范我就不发图了 二 环境 12V电源 stm32 驱动舵机 功率不大也不小
  • 一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    原创文章 经验总结 从校招到A厂一路阳光一路沧桑 详情请戳www coderccc com 1 造成内存泄漏的原因 threadLocal是为了解决对象不能被多线程共享访问的问题 通过threadLocal set方法将对象实例保存在每个线

随机推荐

  • 在ISO/OSI参考模型中,网络层的主要功能是()----百度2016研发工程师笔试题(六)

    在ISO OSI参考模型中 网络层的主要功能是 正确答案 A 你的答案 A 正确 路由选择 拥塞控制与网络互连 提供可靠的端一端服务 透明地传送报文 数据格式变换 数据加密与解密 数据压缩与恢复 在通信实体之间传送以帧为单位的数据 添加笔记
  • Dynamics 365 安装后续

    之前说到Dynamics365安装时遇到的错误 这里将讲述最后一个错误的解决办法 这里指的是蓝色条选中的错误 根据错误的提示 我们需要去对Reporting Services进行安装和配置 首先说Reporting Services的安装
  • 树莓派Linux内核源码

    前期工作 配置好交叉编译工具链 交叉编译工具链详细教程 树莓派Linux内核源码下载 查看树莓派操作版本命令 uname r 源码下载 一 嵌入式裸机和带操作系统启动过程了解 C51 stm32启动过程 c直接操控底层寄存器实现相关业务 业
  • python代码编写规范

    最近两年的工作都是和运维相关 有时运维人员也会写一些python程序 但基本上都没有遵循相应的代码规范 一向粗暴 能用就行 既不考虑可读性也不考虑可维护性 作为一个开发人员有时候看他们写代码就很不舒服 今天就谈谈python写代码时的一些规
  • beforefieldinit释义

    首先让我们认识什么是 当字段被标记为beforefieldinit类型时 该字段初始化可以发生在任何时候任何字段被引用之前 这句话听起了有点别扭 接下来让我们通过具体的例子介绍
  • 黑苹果oc清除nvram_黑苹果完善之路-英特尔蓝牙「开启/关闭」功能完善教程

    小编开篇提醒 玩转黑苹果有风险 建议随时备份好自己的重要数据 很多机友安装黑苹果之后 打开蓝牙选项却发现 关闭蓝牙 选项是灰色的 无法进行选择 但是一些具有强迫症的机友内心可能会接受不了 所以就此出一期关于英格尔蓝牙驱动相关的详细教程 博通
  • 10 种机器学习算法的要点(附 Python 和 R 代码)

    http blog jobbole com 92021 本文由 伯乐在线 Agatha 翻译 唐尤华 校稿 未经许可 禁止转载 英文出处 SUNIL RAY 欢迎加入 翻译组 前言 谷歌董事长施密特曾说过 虽然谷歌的无人驾驶汽车和机器人受到
  • 什么是 IaaS? 基础结构即服务

    基础结构即服务 IaaS 是通过 Internet 配置和管理的即时计算基础结构 它是四类云服务中的一种 其余三种为软件即服务 SaaS 平台即服务 PaaS 和无服务器 IaaS 可根据需求快速纵向扩缩 你只需按实际使用量付费 它让你无需
  • 甘特图生产排程(APS)定制开发

    快速开发完成APS的数据可视化 订单展示 资源调度 智能排程等几乎全部功能模块 自动智能排程功能 提供专业需求分析师及开发团队 按需开发 全自动智能排程 这一APS的主要功能 能够实现自定义排程规则 一键式产生计划等高级功能 无需人工干预既
  • python虚拟环境理解 conda创建虚拟环境 pycharm配置运行环境

    python虚拟环境理解 conda创建虚拟环境 pycharm配置运行环境 一 什么是python的虚拟环境 python虚拟环境是为了让不同的项目能够在不同的python环境中运行 比如项目A需要python2 numpy3 1 项目B
  • Openwrt学习笔记(四)——系统开机启动

    1 内核启动 bootloader将kernel从flash中拷贝到RAM以后 bootloader将退出舞台 并将这个舞台交给了kernel 中间有些交接的细节过程 这里不赘述 我们直接从kernel的启动开始分析 不同平台的kernel
  • 算法专题之矩阵

    前言 矩阵相关的算法在互联网世界有着广泛的应用 比如图片的像素修改 上一小结介绍过 获取地图路径方案等 在数学中 一个矩阵说穿了就是一个二维数组 矩阵相关的基础算法也都是基于二维数组的基础上完成各类数据操作 本小节列举了前端面试中高频出现的
  • Error:fatal error C1010: unexpected end of file while looking for precompiled head

    场景 在VC6 0进行编写C 代码时 创建了一个 简单的程序 s 然后编译就爆出这个错误 场景复现 创建流程 点击左上角的 文件 然后点击 新建 在左上方选择工程 然后下方选择 Win32 Console Application 在右侧填写
  • 接口参数返回值 根据不同的值去改变样式

    改变接口返回值的样式 div class btn scope row notificationStatus div css部分 noticion active border 1px
  • ReactJS报错 React createElement error type is invalid — expected a string ...

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Warning React createElement type is invalid expected a string for built in components
  • Lua中使用毫秒精度时间的方法

    这篇文章主要介绍了lua中使用毫秒精度时间的方法 本文讲解使用luasocket库实现毫秒精度时间 需要的朋友可以参考下 lua自带的时间函数只能到秒的精度 为了统计到毫秒精度的时间 可以使用luasocket 下载地址http files
  • 操作系统之线程

    一 线程简介 早期的计算机系统只允许一个任务独占系统资源 一次只能执行一个程序 由于对程序并发执行的需求 引入了多进程 进程的引入可以解决多任务支持的问题 但是也产生了新的问题 每个进程分别分配资源开销比较大 进程频繁切换导致额外系统开销
  • 用Docker部署SSM项目

    Docker环境的安装 卸载原有的环境 sudo yum remove docker docker client docker client latest docker common docker latest docker latest
  • java实现文件下载功能

    在工作中经常会遇到为文件下载的功能 但因为公司的各种下载时的要求不同 所以都在下载功能上或多或少的加减一些 今天就总结一下我写过的下载功能MVC的思想controller层 Description 下载 Param downloadPath
  • java 内部类面试题_面试题(一)关于内部类的面试题

    一 看下面代码求值 1 要求 使用已知的变量 在控制台输出30 20 10 2 classOuter 3 public int num 10 4 classInner 5 public int num 20 6 public voidsho