四大内部类简单小结

来源:互联网 发布:用友软件维护合同 编辑:程序博客网 时间:2024/06/04 18:25

1. 实例内部类(类的内部,方法外部,没有static修饰)

实例内部类也叫成员内部类,是最普通的内部类:

   1)实例内部类对象依托于外部类对象。

   2)对象构建方式:先构建外部类对象,再构建内部类对象

   3)可以访问外部类所有成员(静态,非静态), 即使是private的

   例如:

   classOuter

   {

      classInner

      {

        

      }

   }

   Outer.Innero1 = new Outer().new Inner();

注意:

1)虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问。

2)内部类可以拥有 private访问权限、protected访问权限、public访问权限及包访问权限 。如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问; 如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。


2. 静态内部类(类的内部,方法外部,有static修饰)

   1)静态内部类不依赖于外部类对象。

   2)对象构建方式:允许直接内部类对象

   3)静态内部类只能访问外部类所有静态成员

   例如:

   classOuter

   {

      staticclass Inner

      {

  

      }

   }

   Outer.Innero1 = new Outer.Inner();

 

3. 局部内部类(定义在方法内部)

   1)局部内部类的对象只能在定义此类的方法内部构建

   2)局部内部类可以访问类中所有成员,但只能访问本方法内部使用final修饰的常量


例如:

public class OutterClass3 {
      public String name;
      public void run(final int a) {
            final int x = 100; 
            class InnerClass {
                   public int i;
                   public void innerRun() {
                         System.out.println(name);

                         System.out.println(i);

                         System.out.println(x);

                   //x定义如前面没有final,则不能访问x,(a同样)。是由于局部变量生存期的原因,加上final延长生存期就可以了

                   }

            }
      }
}

注意:局部内部类不能使用static修饰

    

4. 匿名内部类

匿名内部类是我们编写代码时,最常用的一种内部类,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。

   1)匿名内部类会有一个父类(可能是具体类,抽象类,接口)

   2)匿名内部类没有名字,但有类体(代码块)

   3)匿名内部类假如写到了方法内部,它就是特殊的局部内部类

 

   classA{public void run(){}}

   interfaceIM{void show();}

   classOuter

   {

      privateA a = new A(){public void run(){}};

      publicvoid display()

      {

         IMm = new IM(){void show(){};};

      }

   }

注意:

1)匿名内部类不能有访问修饰符和static修饰符的 。

0 0
原创粉丝点击