一、什么是内部类?
为了理解什么是内部类,我举一个例子:
定义在A类中的B类,此时B类称为内部类,A类称为外部类!
class A{//外部类
public int a;
class B{
//内部类
}
}
内部类细分为四个部分:实例内部类、静态内部类、匿名内部类、局部内部类!
1、实例内部类
实例内部类定义在类的内部,方法的外部!
下面以一个实例内部类为例子:一起来探讨一下实例内部类使用的一些规矩。
如图:我创建了一个OuterClass外部类和一个InnerClass内部类
问题一:如何实例化实例内部类?
通过以上的mian方法里面的正常实例化操作,我发现程序会报语法错误!
其实:正确的操作应该是这样的!
先实例化一个外部类,再写出如下语句!
问题2:可以在内部类访问外部类的成员变量和成员方法吗?
答:可以!
让我们看看实例:
class OuterClass {
public int data1=1;
private int data2=2;
public static int data3=3;
//外部类成员方法
public void testA(){
System.out.println("OuterClass::testA()");
}
//实例内部类:定义在类的内部,方法的外部
class InnerClass{
//内部类的成员变量
public int data4=4;
private int data5=5;
public static int data6=6;
//内部类的成员方法
public void test(){
System.out.println("InnerClass::test()");
//访问外部类成员
System.out.println("data1: "+data1);
System.out.println("data2: "+data2);
System.out.println("data3: "+data3);
}
}
}
public class Test1 {
public static void main(String[] args) {
OuterClass out=new OuterClass();
OuterClass.InnerClass innerClass=out.new InnerClass();
innerClass.test();
}
}
程序运行结果:
可以看到:可以通过内部类访问外部类的成员变量,同理,也可以访问外部类的成员方法!
那么:如果内部类与外部类有同名的成员变量data,那么通过内部类访问的到底是哪一个?
class OuterClass {
public int data1=100;
//实例内部类:定义在类的内部,方法的外部
class InnerClass{
//内部类的成员变量
public int data1=1;
//内部类的成员方法
public void test(){
System.out.println("InnerClass::test()");
System.out.println("data1: "+data1);//打印的是100还是1?
}
}
}
public class Test1 {
public static void main(String[] args) {
OuterClass out=new OuterClass();
OuterClass.InnerClass innerClass=out.new InnerClass();
innerClass.test();
}
}
外部类和内部类同时拥有成员变量data1,那么在内部类访问data1的时候,打印出来的如果是100,就是外部类的,反之,则是内部类的!
程序运行结果:
可以看到,打印出来的是1,说明访问的是内部类的data1。
那么:如果我们坚持要访问外部类,究竟该如何访问?
答:通过外部类名.this.成员变量名
2、静态内部类
静态内部类:就是被static 修饰的内部类。
class OuterClass1{
//外部类非静态成员变量
public int data1=1;
private int data2=2;
//外部类静态成员变量
public static int data3=3;
//静态内部类:被static修饰
static class InnerClass{
//内部类非静态成员变量
public int data4=4;
private int data5=5;
//内部类静态成员变量
public static int data6=6;
//内部类成员方法
public void test(){
System.out.println("InnerClass::test()");
}
}
}
问题1:如何实例化静态内部类?
静态内部类的实例化需要借助外部类名的引用!
使用内部类的方法访问外部类 。
前面学习的实例化内部类可以在内部类的方法中直接访问外部类的成员变量和成员方法,那么:静态内部类访问外部类的成员 和成员方法是否也是一样的?
让我们一起探究一下!
如下两张图:
可以看到:
在使用静态内部类方法的时候,是无法直接访问外部类的非静态成员变量的,但是却可以直接访问外部类的静态成员变量!(成员方法同理)
那么如果我们该如何访问外部类的成员变量呢?
1、先在该内部类方法中实例化一个外部类!
2、使用该外部类的变量名去引用外部类的成员变量!
使用静态外部类访问内部类成员变量同理
1、先在方法中创建一个内部类的对象!
值得注意的是:
在外部类的成员方法中,内部类的实例化可以像正常实例化一样进行!不必使用外部类名的引用!
程序运行结果:
3、局部内部类
局部内部类是定义在外部类的方法内的类。
class OuterClass{
public int data1=1;
//外部类成员方法
public void testA(){
class InnerClass{
public int data2=2;
//只能在方法内使用
InnerClass innerClass=new InnerClass();
}
}
}
注意:局部内部类不能被public 、static 修饰
4、匿名内部类
1、先创建一个接口
2、在main方法中的语句就是一个匿名内部类!
它相当于:一个类实现了这个接口,同时重写了test()方法!
//创建一个接口
interface ITestable{
//接口中的方法
void test();
}
public class Test3 {
public static void main(String[] args) {
//匿名内部类
ITestable it=new ITestable() {
@Override
public void test() {
System.out.println("test......");
}
};
//调用这个匿名内部类中的重写方法(test()方法)
it.test();//打印test......
}
}
程序运行结果: