java 内部类、嵌套类

  C++有多重继承的功能,虽很强大,但难于应用,复杂度非常大,过度使用会使代码庞大拥挤,类功能不单一等缺点。java实行单一继承多接口原则,大大简化了复杂度,用多接口在某一方面代替了多继承,但如果要在本类具体实现多继承,接口是不能做到的。这时,内部类能够实现这一功能。

  java内部的类有内部类和嵌套类两种。

  一、内部类:

  内部类是定义在一个类里面的类,可以说是类中类,而该类又称为外围类。如下:

  class Outer {

    class Inner {

    }

  }

  Outer是外围类,Inner是Outer类的内部类,内部类有权访问外围类所有成员和方法(包括静态和非静态),而外围类不能访问内部类的成员,只能通过new实例进行调用。内部类还可添加访问权限修饰符,如private,public,protected,其权限跟外围类相同。

  在客户端创建使用new.,如 Outer.Inner inner = new Outer.new Inner(); 注:如果声明private则外部无权限创建。在new Inner的同时,JVM会隐式向Inner实例传入Outer的实例,如果要在Inner里访问外围类实例,则用Outer.this即可。

 

  用内部类实现C++多重继承:

  Class Outer {

    class Inner1 expands 父类1 {

    }

    class Inner2 expands 父类2 {

    }

    ...

  }

  要继承多少就有多少,然后根据Outer里实现多继承逻辑,对外界来说就相当于继承多类的功能一样。

  继承内部类,必须在类里构造方法传入外转类的参数实例,并且在方法里显式调用外围类的super(); 如:

  class SubInner expands Outer.Inner {

    public SubInner(Outer outer) {

      outer.super();

    }

  }    

  

  内部类优点:

  1.变相实现多重继承功能,使类变的更强大。

  2.每个内部类可实现不同接口,来完成一小部分功能;且每个内部类可以有不同的状态。

  3.内部类可访问外转类所有成员和方法,又不会过份干扰外围类,内部类之间更不会互相干扰。

  缺点:

  增加了外围类的代码层级,不好维护。

  相比之下,还是优点多过缺点。

 

  二、嵌套类:

  嵌套类是定义在类内部的静态类,是用static修饰,嵌套类也可继承类和实现接口。嵌套类只能访问外围类的静态成员。定义如下:

  Class Outer {

    static StaticInner {

    }

  }

  在客户端调用:

  Outer.StaticInner staticInner = new Outer.StaticInner(); // 这时不需要传入外围类的实例。注:嵌套类也可用访问修饰符。

  

  无论是内部类还是嵌套类,编译器都会为每个类编译一个对应的.class文件,内部类或嵌套类用$分隔,如Outer$Inner.class和Outer$StaticInner.class。

 

  三、局部内部类:

  上面两种都是定义在类里中的域里,除此之外,内部类还可定义在方法体里,这种叫局部内部类。形式如下:

  Class Outer {

    private void run(final int temp) { // 在局部内部类里要访问temp变量,必须声明final,但java8已经做了优化,不用final,但在代码体内不能修改temp值

      class FunInner {

        void exec() {

          System.out.println(temp);

        }

      }

      FunInner funInner = new FunInner();

    }

  }

  java可支持无限方法嵌套内部类。如果要访问外围类实例,则一样用"外围类.this"。注:局部内部类不能加任意修饰符,如private,static等,final除外。

 

 

  另:

  接口也可声明嵌套类,如果未指定static,默认隐式编译为static

posted @ 2016-04-26 18:15  司马逍遥  阅读(187)  评论(0)    收藏  举报