自己将Java内部类的理解贴出来,自己日后忘记了,再翻出来看看。
Java内部类分为静态内部类、成员内部类、局部内部类、匿名内部类
public class OuterClass {
//私有静态变量
private static int radius = 1;
private static String out_b = "outer private static String";
//静态变量
public static int count = 2;
//私有变量
private int number = 2;
private String out_a = "outer private String";
public static void main(String[] args) {
//调用静态内部类方法:外部类.内部类 (命名) = new 外部类.内部类()
OuterClass.Inner inner1 = new OuterClass.Inner();
inner1.visitOuter();
System.out.println("*****************");
//调用成员内部类方法:外部类实例.new 内部类()
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner2 = outer.new InnerClass();
inner2.visit();
System.out.println("*****************");
//调用局部内部类
outer.testLocalInnerClass();
System.out.println("*****************");
//调用匿名内部类
outer.testPrivateMethod(3);
System.out.println("*****************");
//调用静态方法直接用外部类.方法名称
OuterClass.testStaticLocalInnerClass();
}
//构造器
public OuterClass() {
}
//静态内部类
static class Inner {
public void visitOuter() {//静态内部类可以访问所有外部类的静态变量,而不能访问非静态变量
System.out.println("radius = " + radius);
System.out.println("count = " + count);
}
}
//成员内部类,非静态类
class InnerClass {
public void visit() {
System.out.println("Outer static variable: " + radius);
System.out.println("visit outer variable:" + number);
}
}
//匿名内部类
// 1、必须继承或实现一个已有的接口,由于匿名内部类不是抽象的,所以必须要实现继承接口或类中的抽象方法
// 2、不能定义任何静态成员或静态方法
// 3、所在的方法的形参需要匿名内部类使用时,必须声明为final
interface Service{
static int i = 0;
void method();
}
//私有方法
private void testPrivateMethod(final int i){
new Service(){
public void method(){
for(int j = 0; j < i; j++){
System.out.println("Anonymous Class");
}
}
}.method();
}
//局部内部类:定义在方法中的内部类
public void testLocalInnerClass(){
String inner_a = "Local inner variable";
class InnerClass {
private void fun(){
System.out.println(out_a);
System.out.println(out_b);
System.out.println(inner_a);
}
}
InnerClass innerClass = new InnerClass();
innerClass.fun();
}
public static void testStaticLocalInnerClass(){
int d = 4;
//静态方法中的内部类只能访问外部类的静态变量与方法
class Inner {
private void fun(){
//System.out.println(out_a); //编译错误,定义在静态方法中的局部类不可以访问外部类的实例变量
System.out.println(out_b);
System.out.println(d);
//OuterClass.testStaticLocalInnerClass();//访问外部类的静态方法
}
}
Inner inner = new Inner();
inner.fun();
}
}