1.内部类分类:
/*内部类分类: ①成员内部类:实例内部类和静态内部类 ②局部内部类*/
2.成员内部类(定义在成员位置上)的实例内部类(非静态内部类)
① 在创建实例内部类的实例的时候,外部类的实例必须已经存在 Outer.InnerTools its = new Out().new InnerTools(); 以上代码等价于: Outer out = new Outer(); Outer.InnerTools its = out.new InnerTools(); ② 实例内部类的实例【自动】持有对外部类的实例的引用(Outer.this),所以在实例内部类中 可以直接访问外部类的[所有]成员(这里指的是外部类当中所有的public,protected,private,static的方法和成员变量) (可以理解为就是外部类中的成员与成员之间的访问) 之所以能访问,是因为在实例内部类中需要 先有外部类的实例,才能有内部类的实例. Outer.InnerTools its = new Outer().newInnerTools();
③ 在实例内部类中,外部类的实例与内部类的实例是一对多的关系,一个内部类实例只会引用一个外部类实例,而一个外部类实例对应0个或n个内部类实例(可以有多个内部类),在外部类中【不能】直接访问内部类的成员,必须通过内部类的实例去访问才可以。 class Outer
{
static int a=10;
class Inner
{
int i=3;
void method()
{
a=7;//可以
}
}
}
class Demo
{
public static void main(String[] args)
{
new Outer().new Inner().method();
}
}
④在实例内部类中不能定义静态成员(和静态成员只能访问静态成员一个道理)
3.静态内部类:
(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;//0 int b3 = new A().a1;//0 }}
(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();//内部类B的实例 A.B.C c = new A.B.C();//内部类C的实例 b.v1 = 1;//通过实例访问B中非静态v1 b.v2 = 1;//通过实例访问B中静态v2 //A.B.v1 = 1//error A.B.v2 = 1; A.B.C.v3 = 1; }
|
|