什么是内部类 ?
将一个类写在一个类的里面,那么写在里面的这个类就叫做内部类。例如:
//Outer是外部类
public class Outer {
//Inner是内部类
class Inner {
}
}
内部类可以分为: 成员内部类 + 局部内部类
在内部类总可以直接访问外部类的所有成员
成员内部类 是定义在类的成员位置,与类中的成员变量是 相似的,
//Outer是外部类
public class Outer {
// name 是一个成员变量
String name;
//Inner是内部类 , Inner也可以认为是一个成员变量,Inner的调用方式 与修饰符 方面与name都是差不多的
class Inner {
public void method1() {
/**
* 内部类可以直接访问外部类的成员
* 为什么可以这样,这个成员变量不是非静态的吗?
* 因为这里定义的内部类是一个非静态的成员变量,当你想要调用这个成员变量的时候
* 必须是使用对象来调用,name必须已经初始化了(就算是null也是已经初始化了)。
* 所以非静态的内部类是可以直接调用外部类的所有成员的
*/
System.out.println(name);
}
}
}
所以成员内部类,也可以使用成员的修饰符 public static 等,因为它一个类,所以也可以实现接口或者是继承类
调用 成员内部类 与 调用成员变量 是相似的
public class Test {
public static void main(String[] args) {
//当你访问非静态的 成员变量的时候是使用 对象.成员 来访问的
String name = new Outer().name; //必须使用 对象.成员来访问
//而成员内部类也是一个内部类,所以也要使用这种方式
Outer.Inner inner = new Outer().new Inner();
//也可以调用内部类的方法
inner.method1();
}
}
其中使用成员内部类 还有一些语法要注意的
public class Outer {
int i = 1;
class Inner {
int i = 2;
public void method1() {
int i = 3;
//就近原则,会打印 3 出来
System.out.println(i);
//打印 2
System.out.println(this.i);
//打印 1
System.out.println(Outer.this.i);
}
}
}
局部内部类 定义在外部类方法中。例如:
public class Outer {
int i = 1;
public void method() {
//局部内部类 定义在方法里面
class Inner {
int i = 2;
public void method1() {
}
}
//只能在该方法中创建对象调用,外部是无法操作,也不知道你这个类的
Inner inner = new Inner();
inner.method1();
}
}
内部类的实际使用: 匿名内部类是实际使用得比较多的
·· 匿名内部类是局部内部类的一种,也就是说,它是定义在某一个方法的里面的
定义匿名是基于下面的情况: 临时定义某一指定类型的子类,定义后便立即创建该子类对象
使用匿名内部类 必然会有 继承 或者 实现的 关系。创建的对象必定是一个子类,它的父类就是new 关键字的后面