目录
内部类使用的场合
- 针对接口或抽象类这些不能直接new创建对象的数据类型,使用匿名内部类创建对象
- 完成复杂的功能,设计辅助外部类的类,并不想把类的细节公布出去,可以使用内部类
非静态内部类
- 访问外部类的静态成员和非静态成员,包括 private 修饰的
public class OuterClass {
//静态成员变量
private static double pi = 5.13;
//非静态的成员
private String str = "您好";
class Inner{
public void print(){
System.out.println("静态成员pi="+pi);
System.out.println("非静态成员str="+str);
}
}
}
静态内部类:static修饰的内部类
- 访问外部类的静态成员,包括private修饰的,但不能访问外部类非静态的成员
public class OuterClass {
//静态成员变量
private static double pi = 5.13;
//非静态的成员
private String str = "您好";
static class Static_Inner{
public void print(){
System.out.println("静态成员pi="+pi);
//System.out.println("非静态成员str="+str); //不能访问外部类非静态的成员
}
}
}
局部内部类:定义在方法中的内部类
- 访问外部类中静态成员和非静态成员,包括private修饰的
- 访问局部常量(final修饰的),不能访问局部变量(jdk1.7)
public class OuterClass {
//静态成员变量
private static double pi = 5.13;
//非静态的成员
private String str = "您好";
public void test(){
int i = 5; //局部变量
final int I = 99; //局部常量
class Local{
public void print(){
System.out.println("静态成员pi="+pi);
System.out.println("非静态成员str="+str);
//System.out.println("局部变量i="+i); //不能访问局部变量
System.out.println("局部常量I="+I); //可以访问局部常量
}
}
//在方法中创建局部内部类对象
Local lc = new Local();
lc.print();
}
}
匿名内部类
- 针对接口或抽象类这些不能直接 new 创建对象的数据类型,通过匿名内部类创建对象
- 匿名内部类创建对象只能使用一次
- 主要用于事件监听器的创建
public class OuterClass {
//静态成员变量
private static double pi = 5.13;
//非静态的成员
private String str = "您好";
public void anonymous(){
//定义一个抽象类 Abstract_Class ,不能直接 new 创建对象,通过匿名内部类创建对象
Abstract_Class ac = new Abstract_Class(){
@Override
public void abstract_method() {
System.out.println("abstract_method()");
}
};
ac.abstract_method();
}
}
public abstract class Abstract_Class {
public abstract void abstract_method();
}
运行结果:
public class Test {
public static void main(String[] args) {
//创建外部类对象
OuterClass out = new OuterClass();
System.out.println("*********创建非静态内部类对象,依赖于外部类对象*********");
OuterClass.Inner in = out.new Inner();
in.print();
System.out.println("*********创建静态内部类对象,通过外部类类名*********");
OuterClass.Static_Inner s_in = new OuterClass.Static_Inner();
s_in.print();
System.out.println("*********运行局部内部类中的方法*********");
new OuterClass().part();
System.out.println();
System.out.println("*********运行匿名内部类中的方法*********");
new OuterClass().anonymous();
}
}
输出:
*********创建非静态内部类对象,依赖于外部类对象*********
静态成员pi=5.13
非静态成员str=您好
*********创建静态内部类对象,通过外部类类名*********
静态成员pi=5.13
*********运行局部内部类中的方法*********
局部内部类中访问:
静态成员pi=5.13
非静态成员str=您好
局部常量I=99
*********运行匿名内部类中的方法*********
abstract_method()