1.内部类分为4种:
- 成员内部类(定义在类里面的类),又称普通内部类
- 局部内部类(定义在方法体或者代码块里面的类)
- 静态内部类(static关键字修饰的内部类)
- 匿名内部类
2.内部类的特点:
- 可以使用外部类的属性,即使这个属性是private的也可以使用
- 可以调用外部类的方法
- 在多线程时常用内部类-->后来进化到了lambeda表达式
3.1 成员内部类
public class OuterClass { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }
//这里在外部类里面定义了一个成员内部类(普通内部类) class InnerClass { public InnerClass() { name = "Jacike CHAN";//内部类可以使用外部类的属性和方法 age = 66; } public void display() { System.out.println("姓名:" + getName());//调用外部类的getName()方法 System.out.println("年龄:" + getAge());//调用外部类的getAge()方法 } } public static void main(String[] args) { OuterClass outer = new OuterClass(); InnerClass inner = outer.new InnerClass();//创建内部类对象 inner.display(); } }
创建成员内部类对象的注意点:
不能直接new一个成员内部类对象,需要先常见外部类对象,再用外部对对象.new InnerClass()的方式去创建普通内部类对象
OuterClass outer = new OuterClass(); InnerClass inner = outer.new InnerClass();
3.2 局部内部类:
import com.sun.org.apache.bcel.internal.classfile.InnerClass; import javafx.scene.effect.InnerShadow; public class OuterClass { public int ofield1 = 1; protected int ofield2 = 2; int ofield3 = 3; private int ofield4 = 4; public OuterClass() { System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象."); } private void outerTest() { class A { public A() { System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象."); System.out.println("其外部类的fied1字段值为:" + ofield1); System.out.println("其外部类的fied2字段值为:" + ofield2); System.out.println("其外部类的fied3字段值为:" + ofield3); System.out.println("其外部类的fied4字段值为:" + ofield4); } } A a = new A(); { class B { public B() { System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象."); System.out.println("其外部类的fied1字段值为:" + ofield1); System.out.println("其外部类的fied2字段值为:" + ofield2); System.out.println("其外部类的fied3字段值为:" + ofield3); System.out.println("其外部类的fied4字段值为:" + ofield4); } } B b = new B(); } } public static void main(String[] args) { OuterClass outer = new OuterClass(); outer.outerTest(); } }
结果:
在外部类里面创建OuterClass类对象. 在外部类里面创建A类对象. 其外部类的fied1字段值为:1 其外部类的fied2字段值为:2 其外部类的fied3字段值为:3 其外部类的fied4字段值为:4 在外部类里面创建B类对象. 其外部类的fied1字段值为:1 其外部类的fied2字段值为:2 其外部类的fied3字段值为:3 其外部类的fied4字段值为:4
3.3静态内部类:
public class OuterClass { public int field10 = 10; public OuterClass() { System.out.println("在外部类里面创建" + this.getClass().getSimpleName() + "类对象."); InnerClass inner = new InnerClass(); System.out.println("静态内部类fied1字段值为:" + inner.field1); System.out.println("静态内部类fied2字段值为:" + inner.field2); System.out.println("静态内部类fied3字段值为:" + inner.field3); System.out.println("静态内部类fied4字段值为:" + inner.field4); System.out.println("静态内部类fied5字段值为:" + InnerClass.filed5); } static class InnerClass { public int field1 = 1; protected int field2 = 2; int field3 = 3; private int field4 = 4; static int filed5 = 5; public InnerClass() { System.out.println("在静态内部类里面创建" + this.getClass().getSimpleName() + "类对象."); // System.out.println("在静态内部类调用外部类的fied10字段值为:" + field10); } } public static void main(String[] args) { //可以通过外部类.内部类的方式创建静态内部类对象 OuterClass.InnerClass in = new OuterClass.InnerClass(); //也可以直接创建静态内部类对象 InnerClass inner = new InnerClass(); OuterClass out = new OuterClass(); } }
结果:
在静态内部类里面创建InnerClass类对象. 在静态内部类里面创建InnerClass类对象. 在外部类里面创建OuterClass类对象. 在静态内部类里面创建InnerClass类对象. 静态内部类fied1字段值为:1 静态内部类fied2字段值为:2 静态内部类fied3字段值为:3 静态内部类fied4字段值为:4 静态内部类fied5字段值为:5
3.4匿名内部类:
匿名内部类在多线程和java图形化界面编程时用的比较多。
它后来进化成了lambeda表达式
public class OuterClass { public int field1 = 1; protected int field2 = 2; int field3 = 3; private int field4 = 4; static int filed5 = 5; public OuterClass() { System.out.println("这是外部内的构造方法--创建对象:" + this.getClass().getSimpleName()); } interface ITest { void test(); } public void anonymousTest() { ITest it = new ITest() { @Override public void test() { System.out.println("我在匿名内部类里面"); System.out.println("这是匿名内部类的对象:" + this.getClass()); System.out.println("其外部类的 field1 字段的值为: " + field1); System.out.println("其外部类的 field2 字段的值为: " + field2); System.out.println("其外部类的 field3 字段的值为: " + field3); System.out.println("其外部类的 field4 字段的值为: " + field4); System.out.println("其外部类的 field5 字段的值为: " + filed5); } }; it.test(); } public static void main(String[] args) { OuterClass out = new OuterClass(); out.anonymousTest(); } }
结果:
这是外部内的构造方法--创建对象:OuterClass 我在匿名内部类里面 这是匿名内部类的对象:class OuterClass$1 其外部类的 field1 字段的值为: 1 其外部类的 field2 字段的值为: 2 其外部类的 field3 字段的值为: 3 其外部类的 field4 字段的值为: 4 其外部类的 field5 字段的值为: 5
参考资料:
Oracle官方文档--匿名内部的语法结构
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
其它很有用的参考:
这个例子容易理解
https://blog.csdn.net/hacker_zhidian/article/details/82193100
详细的帖子
https://www.cnblogs.com/chenssy/p/3388487.html
后记:
2020年3月8日 星期日 上海 晴转多云 气温 13度,比较冷。