Java允许把一个类定义在另一个类或者方法的内部,我们称为内部类,内部类一般分为四种:类中类,方法内部类,匿名内部类和静态内部类。下面就来了解一下这四种内部类的用法。
类中类
顾名思义,就是在一个类中又定义了一个类,就像这样:
public class OutterClass {
private String name;
public OutterClass(String name) {
super();
this.name = name;
}
class Inner{
private int id;
public void show(){
System.out.println("我是内部类");
}
}
}
其实可以把Inner
理解为Outter
类中的一个成员变量,在Inner
中可以访问Outter
中的任意属性和方法(包括private
和static
)。需要注意的是,当内部类和外部类有一个同名的属性或者方法时,你在内部类中调用的话会优先调用内部类中的属性或方法,如果要访问外部类中的属性,可以用Outter.this.name
来访问,上demo:
public class OutterClass {
private String name = "out";
public OutterClass(String name) {
super();
this.name = name;
}
class Inner{
private String name = "in";
public void show(){
//访问外部类的name
System.out.println(OutterClass.this.name);
}
}
}
内部类可以任意访问外部类,但是外部类要访问内部类就没有那么容易了,必须先创建一个内部类的对象,再通过这个对象来访问内部类中的属性或方法
public class OutterClass {
private String name = "out";
public OutterClass(String name) {
super();
this.name = name;
}
//创建一个内部类的对象来访问内部类的属性
Inner in = new Inner();
String str = in.name;
class Inner{
private String name = "in";
public void show(){
//访问外部类的name
System.out.println(OutterClass.this.name);
}
}
}
同理也不能直接创建一个内部类的对象,必须通过外部类的对象来创建,因为内部类的存在是以外部类为基础的。
public static void main(String[] args) {
//通过外部类的对象来创建内部类的对象
OutterClass out = new OutterClass("hi");
OutterClass.Inner in = out.new Inner();
}
方法内部类
也很好理解,就是在一个方法中定义了一个类:
public class OutterClass {
private String name = "out";
public void test(){
//内部类
class Inner{
String name = "inner";
}
}
}
可以把Inner
理解为方法test
中的一个属性,所以只能在这个方法中访问,不能加访问修饰符
匿名内部类
匿名内部类是没有名字的类,所以没有办法引用它,因此它只能使用一次,匿名内部类通常用接口来实现,在new
了之后就直接跟上类的body{}:
public class OutterClass implements TestInterface {
//匿名内部类
TestInterface ti = new TestInterface() {
public void show(){
System.out.println("我是匿名内部类中的方法");
}
};
}
匿名内部类更好的体现了Java的封装性,同时也使代码变得更加简洁,易读。匿名内部类在Android中使用非常普遍,基本上到处都能用到。
静态内部类
静态内部类跟类中类一样,只不过在前面加了一个static
,所以创建一个静态内部类不需要依赖外部类,也就是说即使没有外部类的对象也可以直接new
一个静态内部类的对象。因为你new
一个静态内部类的时候可能还没有外部类的对象,所以静态内部类是不能访问外部类的非静态的属性和方法
public class OutterClass {
static int id = 1;
static void show(){
System.out.println("外部类的static方法");
}
static class Inner{
//访问外部类的静态属性
int id = OutterClass.id;
//访问外部类的静态方法
void show(){
OutterClass.show();
}
}
}