一、概述
1、内部类:在一个类里面再定义一个类。内部类相当于类的一个属性。
2、分类:分为成员内部类、静态成员内部类、局部内部类、匿名内部类
在静态方法中,创建内部类对象。
如果是成员内部类需要使用外部类对象来创建成员内部类。
例如x.new A() x是外部类对象,A是成员内部类
如果是静态成员内部类,可以直接new 类名()来创建。
public class OuterClass {
private void outerMethod() {
System.out.println("It's Method of OuterClass");
}
---------------main方法-----------------
public static void main(String[] args) {
OuterClass t = new OuterClass();
//成员内部类在静态方法中创建,需要通过一个外部类对象来创建
OuterClass.Innerclass in = t.new Innerclass();
//静态成员内部类创建
StaticInner staticIn=new StaticInner ();
in.innerMethod();
//局部内部类
class Boy implements Person {
public void say() {// 匿名内部类自定义的方法say
System.out.println("say方法调用");
}
@Override
public void speak() {// 实现接口的的方法speak
System.out.println("speak方法调用");
}
}
//向上类型转换
Person per = new Boy();
per.speak();// 可调用
per.say();// 不能调用
//匿名内部类
new Service() {
public void method() {
for (int j = 0; j < i; j++) {
System.out.println("匿名内部类" );
}
}
}.method();//执行匿名内部类的方法
}
-----------------------main方法--------------
//成员内部类
class Innerclass {
public void innerMethod() {
// 内部类成员方法与外部类成员方法同名时,使用this调用外部类的方法
OuterClass.this.outerMethod();
outerMethod();// 内部类没有同名方法时执行外部类的方法
}
private void outerMethod() {
System.out.println("It's Method of Innerclass");
}
//静态成员内部类
static class StaticInner {
public void visit() {
System.out.println("visit outer static variable:" + radius);
}
}
}
3、局部内部类和匿名内部类
- 局部内部类:创建在方法中的类。
- 匿名内部类:创建在方法中且没有类名的内部类。所以只能使用一次。
- 匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。
- 匿名内部类不定义构造器(无类名)。
3、内部类访问外部类的变量需声明为final
理由:内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。
4、内部类作用:
- Java中类是单继承、多接口的。内部类有效实现了“多重继承”。每个内部类都能独立地继承自一个(接口的)实现,所以无论外层类是否已经继承了某个(接口的)实现,对于内部类
- 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据!
- 内部类不为同一包的其他类所见,具有很好的封装性;
- 内部类有效实现了“多重继承”,优化 java 单继承的缺陷。
- 匿名内部类可以很方便的定义回调。