内部类:成员内部类、静态内部类、局部内部类和匿名内部类。
- 成员内部类
package com.jiaoyinbrother.test;
/*
* 成员内部类可以调用外部类的所有成员,但只有在创建了外部类的对象后,才能调用外部的成员。
*/
public class OuterClass {
private static String charSet = "UTF-8";
private String name = "zhangsan";
public InnerClass innerClass = new InnerClass();
public void show() {
innerClass.print();
}
public void display() {// 非静态方法可以直接创建内部类对象
InnerClass innerClass = new InnerClass();
innerClass.print();
}
public static void display1() {// 静态方法必须先创建外部类,然后才能创建内部类
InnerClass innerClass = new OuterClass().new InnerClass();
innerClass.print();
}
// 成员内部类
public class InnerClass {
public void print() {
System.out.println("-----------inner class----------");
System.out.println(name);
System.out.println(charSet);
}
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.show();
outerClass.display();
outerClass.innerClass.print();
}
}
- 静态内部类
package com.jiaoyinbrother.test;
/*
* 静态内部类虽然是外部类的成员,但是在未创建外部类的对象的情况下,可以直接创建静态内部类的对象。
* 静态内部类可以引用外部类的静态成员变量和静态方法,但不能引用外部类的普通成员。
*/
public class OuterClass1 {
private static String charSet = "UTF-8";
private String name = "zhangsan";
public InnerClass innerClass = new InnerClass();
public void show() {
innerClass.print();
}
public void display() {
InnerClass innerClass = new InnerClass();
innerClass.print();
}
// 无需外部类对象,直接创建静态内部类对象
public static void display1() {
InnerClass innerClass = new InnerClass();
innerClass.print();
}
// 静态内部类
public static class InnerClass {
public void print() {
System.out.println("-----------static inner class----------");
System.out.println(charSet);
// System.out.println(name);//编译失败,不能引用非静态成员变量
}
}
public static void main(String[] args) {
OuterClass1 outerClass = new OuterClass1();
outerClass.show();
outerClass.display();
outerClass.innerClass.print();
InnerClass innerClass = new InnerClass();
innerClass.print();
}
}
- 局部内部类
package com.jiaoyinbrother.test;
/*
* 局部内部类只能在方法内部中使用,一旦方法执行完毕,局部内部类就会从内存中删除。
* 必须注意:如果局部内部类中要使用他所在方法中的局部变量,那么就需要将这个局部变量定义为final的。
*/
public class OuterClass2 {
private static String charSet = "UTF-8";
private String name = "zhangsan";
public void show() {
final int i = 1;
class InnerClass {// 修饰符只能为final或者abstract
public void print() {
System.out.println(charSet);
System.out.println(name);
System.out.println(i);// 局部变量必须为final
}
}
InnerClass innerClass = new InnerClass();// 只能在声明后创建对象
innerClass.print();
}
public static void main(String[] args) {
OuterClass2 outerClass = new OuterClass2();
outerClass.show();
}
}
- 匿名内部类
package com.jiaoyinbrother.test;
/*
* 匿名内部类的主体,大括号中是匿名内部类的主体,这个主体就是类或者接口的实现,
* 如果是类,那么匿名内部类是该类的子类,如果是接口,匿名内部类需要完成接口的实现。
*/
public class OuterClass3 {
public void show(InnerClass innerClass) {
innerClass.print();
}
public static void main(String[] args) {
OuterClass3 outerClass = new OuterClass3();
outerClass.show(new InnerClass() {
@Override
public void print() {
System.out.println("匿名内部类");
}
});
}
}
abstract class InnerClass {
public abstract void print();
}