将一个类定义在另一个给类里面或者方法里面,这样的类就被称为内部类。
内部类可以分为四种:成员内部类、局部内部类、匿名内部类、静态内部类,下面我们逐一介绍这四种内部类。(内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类)我们可以把外边的类称为外部类,在其内部编写的类称为内部类。
——————————————————————————————————————————————————————————————
1)成员内部类(实例内部类、非静态内部类)
public class InstanceOutterClass{
private String name;
private static int age;
public void say(){}
public static void go(){}
public class InstanceInnerClass{}
}
注意:成员内部类中不能写静态属性和方法
——————————————————————————————————————————————————————————————
2)静态内部类
public class StaticOutterClass{
private String name;
private static int num;
public void say(){}
public static void go(){}
public static class StaticInnerClass{}
}
注意:静态内部类中可以写静态属性和方法
——————————————————————————————————————————————————————————————
3)局部内部类
局部内部类是在一个方法内部声明的一个类,局部内部类中可以访问外部类的成员变量及方法,局部内部类中如果要访问该内部类所在方法中的局部变量,那么这个局部变量就必须是final修饰的
public class LocalOutterClass{
private String name;
private static int age;
public void say(){}
public static void go(){}
public void test(final int j){
final int i = 10;
class LocalInnerClass{
private String name;
private int age;
public void say(){
System.out.println(name);
System.out.println(this.name);
System.out.println(LocalInnerClass.this.name);
System.out.println(LocalOutterClass.this.name);
System.out.println(LocalOutterClass.age);
LocalOutterClass.this.say();
LocalOutterClass.go();
System.out.println(i);
System.out.println(j);
}
}
LocalInnerClass lic = new LocalInnerClass();
lic.say();
}
}
——————————————————————————————————————————————————————————————
4)匿名内部类
a)匿名内部类需要依托于其他类或者接口来创建,如果依托的是类,那么创建出来的匿名内部类就默认是这个类的子类如果依托的是接口,那么创建出来的匿名内部类就默认是这个接口的实现类。
b)匿名内部类的声明必须是在使用new关键字的时候,匿名内部类的声明及创建对象必须一气呵成,并且之后能反复使用,因为没有名字。
匿名内部类也是在开发中最常用的
c)匿名内部类除了依托的类或接口之外,不能指定继承或者实现其他类或接口,同时也不能被其他类所继承,因为没有名字。
d)匿名内部中,我们不能写出其构造器,因为没有名字。
e)匿名内部中,除了重写上面的方法外,一般不会再写其他独有的方法,因为从外部不能直接调用到。(间接是调用到的)。
public interface Work{
void doWork();
}
public class AnonymousOutterClass{
private String name;
private static int age;
public void say(){}
public static void go(){}
public void test(){
final int i = 90;
Work w = new Work(){
public void doWork(){
System.out.println(AnonymousOutterClass.this.name);
System.out.println(AnonymousOutterClass.age);
AnonymousOutterClass.this.say();
AnonymousOutterClass.go();
System.out.println(i);
}
};
w.doWork();
}
}
——————————————————————————————————————————————————————————————
总结
1)完善了Java多继承机制,由于每一个内部类都可以独立的继承接口或类,所以无论外部类是否继承或实现了某个类或接口,对于内部类没有影响。
2)方便写事件驱动程序。
——————————————————————————————————————————————————————————————
静态内部类对象的创建一般是外部类:内部类 类名 = new 外部类.内部类();
成员内部类对象的创建一般是外部类:内部类 类名 = 外部类对象名.new 内部类();