内部类分为以下两种:
1、成员内部类
成员内部类中包括(实例内部类、静态内部类)
《实例内部类》
实例内部类就是定义在类里的类,而且不是static的,外部类的访问修饰符可以是public 和默认的,而内部类可以是public、private、protected,实例内部类可以访问外部类的任何成员,但外部类如果想要访问内部类必须通过实例的方式进行访问,也就是说要先实例外部类,才能实例内部类。如:
(1) 在创建实例内部类的实例的时候,外部类的实例必须已经存在
Outer.InnerTools its = new Out().new InnerTools();
以上代码等价于:
Outer out = new Outer();
Outer.InnerTools its = out.new InnerTools();
(2) 实例内部类的实例【自动】持有对外部类的实例的引用,所以在实例内部类中,可以直接访问外部类的[所有]成员(这里指的是外部类当中所有的public,protected,private,static的方法和成员变量)之所以能访问,是因为在实例内部类中需要现有外部类的实例,才能有内部类的实例
Outer.InnerTools its = new Outer().newInnerTools();
【注意:】在多重嵌套中,实例内部类可以访问所有外部类的成
Class A{
Private void methodA(){}
Class B{
Private void methodB(){}
Class C{
Private void MethodC(){
methodA();
methodB();
}
}
}
}
(3) 在实例内部类中,外部类的实例与内部类的实例是一对多的关系,一个内部类实例 只会引用一个外部类实例,而一个外部类实例对应0个或n个内部类实例,在外部类 中【不能】直接访问内部类的成员,必须通过内部类的实例去访问才可以。
(4) 在实例内部类中不能定义静态成
《静态内部类》
(1) 静态内部类的实例【不会自动持有】外部类的实例的引用,在创建内部类的实例时,不必创建外部类的实例
Class A{
Public static class B{
Int v;
}
}
Class Test{
Public void test(){
A.B b = new A.B();
b.v = 1;
}
}
(2) 静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,就必须通过外部类的实例去访问
class A {
private int a1;
private static int a2;
public static class B {
int b1 = a1;
int b2 = a2;
int b3 = new A().a1;
}
(3) 在静态内部类中可以定义静态成员和实例成员
class A {
public static class B {
int v1;
static int v2;
public static class C {
static int v3;
}
}
}
(4) 测试类可以通过完整的类名来直接访问静态内部类的静态成员
class A {
public static class B {
int v1;
static int v2;
public static class C {
static int v3;
int v4;
}
}
}
public class Client {
public void test(){
A.B b = new A.B();
A.B.C c = new A.B.C();
b.v1 = 1;
b.v2 = 1;
A.B.v1 = 1//error
A.B.v2 = 1;
A.B.C.v3 = 1;
}
2、局部内部类
局部内部类(在方法中定义的内部类)
局部内部类是在一个方法当中定义的内部类,它的可见范围是当前方法。和局部变量一样,局部内部类不能使用访问修饰符(public , private , protected) 以及 static 来修饰,局部内部类的特点是:
(1) 局部内部类只能在当前方法中使用.
class A {
B b = new B();//error
public void method(){
class B {
int v1;
int v2;
class C {
int v3;
}
}
B b = new B();
B.C c = b.new C();
}
}
(2) 局部内部类和实例内部类一样,不能包含静态成员。
class A {
public void method(){
class B {
static int v1;//error
int v2;
static class C //error {
int v3;
}
}
}
}
(3) 在局部内部类中定义的内部类同样也不能被public protected, private这些访问修饰符修饰(局部内部类不能被public protected private访问修饰符修饰)
(4) 局部内部类和实例内部类一样,可以访问外部类的所有成员,此外,局部内部类还可以访问所在方法中的final类型的参数和变量
class A {
int a;
public void method(final int p1,int p2){
int localV1 = 1;
final int localV2 = 2;
class B {
int b1 = a; int b2 = p1; int b3 = p2;//error int b4 = localV1//error int b5 = localV2;
}
}
}