Java核心技术点之内部类
1. 为什么要使用内部类
2. 如何使用内部类
public class Outer {
private int own = 1;
public void outerMethod() {
System.out.println("In Outer class");
Inner inner = new Inner();
inner.innerMethod();
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.outerMethod();
}
private class Inner {
public void innerMethod() {
System.out.println("The var own in Outer is " + own);
}
}
}
public void innerMethod() {
System.out.println("The var own in Outer is " + <strong>outer</strong>.own);
}
编译器会修改Inner类的构造器,添加一个外部类Outer的引用作为参数,大概是这个样子:
public Inner(Outer outer) {
this.outer = outer;
}
所以我们在Outer类的outerMethod方法中调用Inner构造器那条语句实际上会被编译器“改成“这个样子:
Inner inner = new Inner(this);
我们来通过javap看下生成的字节码,来直观地感受下:

我们再来看下编译器为内部类生成的字节码:
OuterClass.this
例如,以上Inner类的innerMethod方法我们使用正规语法应该这么写:
public void innerMethod() {
System.out.println("The var own in Outer is " + Outer.this.own);
}
Inner inner = this.new Inner();
我们还可以显示的将内部类持有的外围类引用指向其它的外围类对象,假设outerObject是一个Outer类实例,我们可以这样写:
Outer.Inner inner = outerObject.new Inner();
这样一来,inner所持有的外围类对象引用即为outerObject。
OuterClass.InnerClass
(3)局部内部类
public class Outer {
private int own = 1;
public void outerMethod() {
class Inner {
public void innerMethod() {
System.out.println("The var own in Outer is " + own);
}
}
System.out.println("In Outer class");
Inner inner = new Inner();
inner.innerMethod();
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.outerMethod();
}
}
局部类的作用域就被限制在定义它的方法的方法体中,因此它不能用public或private访问修饰符来修饰。
new SuperType(construction parameters) {
inner class methods and data
}
匿名类不能有构造器,因此将构造器参数传给超类的构造器(SuperType)。匿名类内部可以定义一些方法与属性。
new Interface() {
methods and data
}
注意,以上代码的含义并不是实例化一个接口,而是实例化实现了某种接口的匿名内部类。
...
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent event) {
...
}
};
public class Outer {
private int own = 1;
public void outerMethod() { }
public static void main(String[] args) { }
private class Inner {
public void innerMethod() { }
}
}
现在内部类Inner是非静态的,我们用javap查看下编译器生成的相应class文件:
3. 参考资料
Java核心技术点之内部类的更多相关文章
- Java类成员之内部类
内部类含义: 在Java中允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类. Inner class 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称. Inner ...
- java学习面向对象之内部类
什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...
- Java语法糖之内部类
例1: class Outer { public void md1(final int a) { final int b = 1; class LocalA { int c = a; } class ...
- JAVA基础之内部类
JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...
- java之内部类
最近学了java,对内部类有一点拙见,现在分享一下 所谓内部类(nested classes),即:面向对象程序设计中,可以在一个类的内部定义另一个类. 内部类不是很好理解,但说白了其实也就是一个类中 ...
- java核心技术卷一
java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128- ...
- 面试必备!Java核心技术100+面试题
一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...
- Java核心技术点之泛型
1. Why ——引入泛型机制的原因 假如我们想要实现一个String数组,并且要求它可以动态改变大小,这时我们都会想到用ArrayList来聚合String对象.然而,过了一阵,我们想要实现一个大小 ...
- Java核心技术点之集合框架
1. 概述 Java集合框架由Java类库的一系列接口.抽象类以及具体实现类组成.我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据.集合类型就是容纳这些对象的一个容 ...
随机推荐
- Xcode8如何去除控制台多余的打印信息
Xcode8如何去除控制台多余的打印信息 最近刚使用了Xcode8.遇到了一些问题,总结如下.希望对大家有所帮助. 一.如何去除控制台多余的打印信息. 方法:点击Product----Scheme-- ...
- iOS开发--Swift 最近项目开发中遇到的一些小问题与解决方法
1, Swift 修改导航栏颜色 self.navigationController?.navigationBar.barTintColor 2, Swift button 属性设置时直接进行初始化 ...
- Java Gradle入门指南之内建与定制任务类(buildSrc、Groovy等)
上一篇随笔介绍了Gradle的安装与任务管理,这篇着重介绍Gradle的内建任务(in-built tasks)与自定义任务(custom tasks),借助Gradle提供的众多内建任务类型 ...
- easy ui 1.4的NumberBox,失去焦点后不能再次输入小数点
这也是1.4版本的bug,现在1.4.1也发布了,经验证,该问题在新版本中已经解决了 在网上找到的解决办法,地址:http://www.jeasyui.com/forum/index.php?topi ...
- JavaScript(二)——语法
1.基本数据类型: 字符串.小数.整数.日期时间.布尔型等. 2.类型转换: 分为自动转换和强制转换,一般用强制转换. 其他类型转换为整数:parseint(): 其他类型转换为小数:parseflo ...
- 一篇博客理解Recyclerview的使用
从Android 5.0开始,谷歌公司推出了RecylerView控件,当看到RecylerView这个新控件的时候,大部分人会首先发出一个疑问,recylerview是什么?为什么会有recyler ...
- jquery中attr和prop的区别、 什么时候用 attr 什么时候用 prop (转自 芈老头 )
jquery中attr和prop的区别. 什么时候用 attr 什么时候用 prop 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这 ...
- mysql-1
接触mysql已经一年多了,但是平时很少用到,仅限于安装部署,最近在学习运维开发,需要用到数据库,于是买了一本mysql必知必会,给自己一个两个星期的时间,学完这本书, 写这一系列的博客,就是记录学习 ...
- 说一下output子句
Output子句日常灰常有用,而且用的地方也挺多,但是确好多时候被我们忽视,今天我就也简单扫盲一下这个语句的用法. Output子句 返回受 INSERT.UPDATE.DELETE 或 MERGE ...
- 使用国内 maven 镜像 代替国外 mirror
使用maven的都知道国外的maven下载一个是比较慢,一个是因为被墙,一些jar包无法下载,非常老火. 比如出现类似下面的错误: Unknown host repo.maven.apache.org ...