静态内部类的特点:
1 静态内部类的实例不会自动持有外部类的特定实例的引用。在创建内部类的实例时,不必创建外部类的实例。
class A {
public static class B {
int v;
}
}
public class TestStaticInner {
public static void main(String[] args) {
A.B b = new A.B();
System.out.println(b.v);
}
}
2 静态内部类可以直接访问外部类的静态成员,若访问实例成员,就必须通过外部类的实例去访问。
3 在静态内部类中可以定义静态成员和实例成员。
class A {
private int a1=12;
private static int a2=2;
public void test(){}
public static class B {
//int b1=a1;//不能直接访问外部类的成员变量
int b2=a2;
int v;
int b3=new A().a1;//实例去访问
static String name="test";
public void test(){}
static void methodB()
{
System.out.println(new A().a1);
}
public void methodC()
{
this.test();
new A().test();
}
}
}
4 客户类可以通过完整的类名直接访问静态内部类的静态成员。但是不能通过完整类名访问静态方法,因为静态方法可能访问外部类的实例实例变量和方法。
System.out.println("直接通过完整类名访问静态成员变量:"+A.B.name);
//System.out.println("直接通过完整类名访问静态成员:"+A.B.methodB());
局部内部类:
局部内部类是在一个方法中定义的,和局部变量一样,局部内部类不能用控制修饰符public private protected 及static修饰符来修饰。特点
1 局部内部类只能在当前方法中使用。
2 局部内部类和实例内部类一样,不能包含静态成员。
3 在局部内部类中定义的类不能加访问修饰符。如public private
class A {
// B b =new B();不能访问局部内部类只能在当前方法中使用。
public void mathod() {
class B {
// static String name; 不能包含静态成员变量 ,再次强调可以包含静态常量
// static class D{}//编译错误 static不能修饰内部类,可以用 abstract 和final修饰
// 但是不能同时使用,局部类也不能加访问修饰符
int v1, v2;
class C {
int v3;
}
}
B b = new B();// ok
System.out.println(b.v1);
B.C c = b.new C();// ok
}
final int localA = 32;// 定义常量
int a;
public void m2(final int p1, int p2) {
int localV1 = 21;
final int localB = 23;// 定义常量
class B {
final static int V = 3;
// int localV= localV1;
int b1 = a;
int b2 = p1;
// int b3=p2;//不能访问非常量
int b5 = localB;
}
}
}