黑马程序员技术交流社区

标题: 神奇的内部类 [打印本页]

作者: 梦想家宇仔    时间: 2016-1-4 23:04
标题: 神奇的内部类
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;    }



作者: 孤独成瘾    时间: 2016-1-4 23:12

作者: 小布丁当    时间: 2016-1-5 08:47
赞一个~~~~~~~~~~~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2