what?
在内部定义类
分类:
成员内部类
如何定义:在类里声明类
public class InnerClassTest { public class InnerClassA { } }
特点:
1. 可以访问外部类的所有成员
2. 外部类同样可以访问内部类所有成员
创建内部类对象:
外部类名.内部类名.变量名=new 外部类名().new 内部类名();
这里的内部类就像外部类声明的一个属性字段一样,因此其的对象时依附于外部类对象而存在的
静态内部类
如何定义:在类里声明静态类
public class InnerClassTest { static class InnerClassA { } }
特点:
1. 无法访问外部类的非静态成员
2. 外部类依然可以访问静态内部类的所有访问权限的成员
创建内部类对象:
// 无需依赖外部类对象,直接创建内部类对象 InnerClassTest.InnerClassA innerClassA = new InnerClassTest.InnerClassA();
静态内部类也是作为一个外部类的静态成员而存在,创建一个类的静态内部类对象不需要依赖其外部类对象
匿名内部类
如何定义:
匿名内部类有多种形式,其中最常见的一种形式莫过于在方法参数中新建一个接口对象 / 类对象,并且实现这个接口声明 / 类中原有的方法
// 自定义接口 interface OnClickListener { void onClick(Object obj); } //方法里新建接口对象,实现并重写接口唯一方法 private void anonymousClassTest() { // 在这个过程中会新建一个匿名内部类对象, // 这个匿名内部类实现了 OnClickListener 接口并重写 onClick 方法 OnClickListener clickListener = new OnClickListener() { @Override public void onClick(Object obj) { System.out.println("我被重写了"); } }; // new Object() 过程会新建一个匿名内部类,继承于 Object 类, // 并重写了 toString() 方法 clickListener.onClick(new Object() { @Override public String toString () { return "我也被重写了"; } }); }
特点:
1. 可以在内部类中定义属性,但是只能在当前内部类中使用
2. 无法在外部类中使用,因为外部类无法获取当前匿名内部类的类名
3. 无法创建匿名内部类的对象
4. 内部类中可以使用外部类的属性
5. 外部类却不能使用匿名内部类中定义的属性,因为是匿名内部类,因此在外部类中无法获取这个类的类名
创建内部类对象:
外部类名.内部类名.变量名=new 外部类名().new 内部类名();
局部内部类
如何定义:声明在一个方法体 / 一段代码块的内部,而且不在定义类的定义域之内便无法使用
public class InnerClassTest { private void localInnerClassTest() { // 局部内部类 A,只能在当前方法中使用 class A { // static int field = 1; // 编译错误!局部内部类中不能定义 static 字段 public A() { System.out.println("创建 " + A.class.getSimpleName() + " 对象"); } } A a = new A(); if (true) { // 局部内部类 B,只能在当前代码块中使用 class B { public B() { System.out.println("创建 " + B.class.getSimpleName() + " 对象"); } } B b = new B(); } // B b1 = new B(); // 编译错误!不在类 B 的定义域内,找不到类 B, } public static void main(String[] args) { InnerClassTest outObj = new InnerClassTest(); outObj.localInnerClassTest(); } }
特点:
1. 局部内部类里面可以访问外部类对象的所有访问权限的成员
2. 外部类不能访问局部内部类中定义的成员
创建内部类对象:只能在局部内部类的代码块中使用