类A的内部定义类B,类B就是内部类
==============================================
内部类的访问特点:
===================================================
内部类的位置
成员位置定义的类,称为成员内部类
局部位置定义的类,称为局部内部类
--------------------------------------------------------------------------------------------------
======================================================
访问成员内部类
外部类名.内部类名 对象名 = 外部类对象.内部类对象
================================================
================================================
成员内部类的常见修饰符
1) private
2) static
为了方便访问数据。
静态就是为了外部通过类名使用的,不会搭配 private 而是 public
静态只能访问静态
还有一个方式访问 show2()
静态方法可以用类名调用:Outer.Inner.show2()
==================================================
面试题:
内部类和外部类,没有继承关系!不能用super
更高级的做法:Outer.this
=====================================================
局部内部类
1. 可以直接访问外部类成员,
2. 在局部位置创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
面试题:
局部内部类,访问局部变量 必须用final修饰,
为什么呢?
因为局部变量会随着方法的调用完毕而消失,而局部对象并没从堆中消失,还要使用
那个变量。为了让数据还能被继续使用,就用final修饰。这样在堆内存中存储的其实
是一个常量值。num2消失了,但是数据20还在内存,还是可以被使用。
反编译一下,发现num2已消失,但是 20还在
=====================================================
存在一个类或者接口
格式:
new 类名/接口名(){
重写所有的抽象方法;
}
本质是:一个类的子类,或抽象类的具体类,或者接口的实现类的对象
一个继承了类或者实现了接口的子类匿名对象。
===============================
匿名内部类的方法调用
在子类对象后,加上“.show();”就行了。编译看左边,接口Inter中有show(),编译
不报错,但是运行看右边,方法被重写了,因此调用子类中的show()
=====================================================
接口内有两个方法时:
上述方法太麻烦,重复
多态改进:
====================================================
形参为接口时:
接口做形式参数时,其实时想引用接口实现类的对象
既然是对象,那么匿名内部类就是接口的子类匿名对象
改进:(直接用匿名内部类,调用次数多的话,不建议使用该方法)
================================================
面试题:
补齐下面代码:
答案:
分析
1. 根据 Outer.method(),能够看出,method应该是Outer类的静态方法
class Outer { public static Inter method(){ } }
2. 后接".show()"说明方法mehtod返回的是一个对象。而show()方法是接口Inter的,因此利用Inter的匿名内部类。
return new Inter{ public void show(){system.out.println("HelloWorld")}};
所以需要补齐的代码是:
=========================================================