面试题(一)关于内部类的面试题
一、看下面代码求值
1 /要求:使用已知的变量,在控制台输出30,20,10。
2 class Outer {
3 public int num = 10;
4 class Inner {
5 public int num = 20;
6 public void show() {
7 int num = 30;
8 System.out.println(?);
9 System.out.println(??);
10 System.out.println(???);
11 }
12 }
13 }
14
15 class InnerClassTest {
16 public static void main(String[] args) {
17 Outer.Inner oi = new Outer().new Inner();
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 { void show(); }
3 class Outer { //补齐代码 }
4 class OuterDemo {
5 public static void main(String[] args) {
6 Outer.method().show();
7 }
8 }
9 要求在控制台输出”HelloWorld”
答案:
interface Inter { void show(); }
class Outer {
//补齐代码
public static Inter method(){
return new Inter(){
void show(){
System.out.println("HelloWorld");
}
};
}
}
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
解析:这个题目挺有趣的,考了很多东西,一开始只能说我自己度懵逼了,是一个局部匿名内部类。 通过看主方法中的调用,Outer.method(),能直接用类名调用方法,
那么肯定该方法就是一个static方法,然后又直接调用了show()方法,说明这个method方法有一个返回值,其返回值类型就是实现该接口类的类型,因为只有接口中有show()这个方法。所以在method中就是一个匿名内部类。
三、以下代码运行结果是什么?
1 public class BwfOuterClass {
2
3 private int x = 1;
4
5 private int y = 2;
6
7 private class BwfInnerClass{
8
9 private int x = 3;
10
11 public void print(){
12
13 System.out.println("x+y="+(x+y) );
14
15 }
16
17 }
18
19 public static void main(String[] args) {
20
21 new BwfOuterClass().new BwfInnerClass().print();
22
23 }
24
25 }
答案:
x+y=5
[面试技术点]
Java中内部类的使用。
[解读]
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这三种:成员内部类、局部内部类、匿名内部类,如下图所示:
本题考的是成员内部类。成员内部类是最普通的内部类,它的定义为位于另一个类的内部,类似于一个成员属性。可以使用修饰符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所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。 为了解决:局部变量的生命周期与局部内部类的对象的生命周期的不一致性问题
- 干货 | ElasticSearch相关性打分机制
- FCN 的简单实现
- 2.运行一个demo
- ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)/ ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY CO
- 干货 | 前端常用的通信技术
- TP-LINK WR941N路由器研究
- ORA-01113问题的简单分析(r6笔记第3天)
- Tensorflow 中 learning rate decay 的奇技淫巧
- hive数据:名词解释
- 巧妙使用exchange partition的一个案例(r6笔记第1天)
- r与rjava
- 使用expect运行动态脚本(r6笔记第19天)
- 数据库日志中一条"异常"信息所包含的细节(r6笔记第18天)
- linux下编辑VI窗口插入与编辑命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kubernete编排技术三:StatefulSet
- Qt网络聊天室客户端
- 聊聊java中的StampedLock并发锁原理
- tomcat对AQS的扩展:使用LimitLatch控制连接数
- kubernete编排技术五:DaemonSet
- 深度剖析github上15.1k Star项目:redux-thunk
- 在不影响程序使用的情况下添加shellcode
- [K8s 1.9实践]Kubeadm 1.9 HA 高可用 集群 本地离线镜像部署
- ansible模块command、shell、raw、script
- systemd - CentOS 7进程守护&监控
- Java 8的新特性还不了解?快进来!
- 【Vulnhub】Play XML Entities
- 一切皆是映射:詳解 Kotlin Map 集合類
- 10大高性能开发宝石,我要消灭一半程序员!
- 面试官:你说你会RabbitMQ,那聊聊它的交换机(Exchange)吧