内部类(Inner class).
- 成员内部类
- 静态成员内部类
- 非静态成员内部类
- 局部内部类
- 方法内
- 代码块内
- 构造器内
成员内部类.
一方面,作为外部类的成员
- 调用外部类的结构
外部类.this.结构名
或结构名
(在不重名的情况下) - 可以被
static
修饰 - 可以被
public
、protected
、缺省
、private
修饰
另一方面,作为一个类
- 类内部可以定义属性、方法、构造器、代码块、内部类
- 可以被
final
修饰(不能被继承) - 可以被
abstract
,则是一个抽象内部类,不能实例化
成员内部类几乎可以被所有修饰符修饰
public class OuterClass {
//成员内部类
//1.静态成员内部类
static class StaticInnerClass{
}
//2.非静态成员内部类
class InnerClass{
}
public OuterClass() {
// 构造器内 内部类
class ConstructorInnerClass{
}
}
void run() {
//方法内 内部类
class MethodInnerClass{
}
}
}
如何实例化成员内部类对象.
创建静态内部类对象
outerClass.innerClass inner = new outerClass().innerClass();
创建非静态内部内对象
//1 outerClass outer = new outerClass(); outerClass.innerClass inner = outer.new innerClass(); //2 outerClass.innerClass inner = new outerClass().new innerClass();
局部内部类.
以方法内举例
例子:获取接口实现类
// 获取 Comparable接口的实现类
public Comparable getComparable(){
//创建一个实现了Comparable接口的类: 局部内部类
//方式一:
/*
class MyComparable implements Comparable{
@Override
public int compareTo(Object o){
return 0;
}
}
return new MyComparable();
*/
//方式二: 匿名内部类
return new Comparable(){
@Override
public int compareTo(Object o){
return 0;
}
};
}
匿名内部类.
没有名字的内部类
匿名子类的匿名对象(继承了父类(也包含抽象类))
new 父类名(){ //可以写类的结构 }
–> 这是一个对象如果是抽象类的话,必须重写所有抽象方法,因为只有重写了抽象方法,才能实例化
匿名实现类的匿名对象(实现了接口)
new 接口名(){ //实现接口的方法 }
–> 这是一个对象