内部类

作用:

  0,使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

      1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。

      2、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。

      3、创建内部类对象的时刻并不依赖于外围类对象的创建。(有疑惑,不是要依赖一个对象来new吗-》可能讲的是静态类

      4、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。

      5、内部类提供了更好的封装,除了该外围类,其他类都不能访问。

  小心new和this的用法,  

  new: OuterClass.InnerClass innerClass = outerClass.new InnerClass();。

  this:return OuterClass.this;

Java中内部类主要分为成员内部类、局部内部类、匿名内部类、静态内部类。

1,成员内部类

  • 成员内部类中不能存在任何static的变量和方法
  • 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

2,局部内部类

  •  有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。

3,匿名内部类(就是swing那种,继承一个抽象类,或者接口,但他是隐式的,所以只能使用一次

  •  匿名内部类是没有访问修饰符的。
  • new 匿名内部类,这个类首先是要存在的。如果我们将那个InnerClass接口注释掉,就会出现编译出错。
  •  注意getInnerClass()方法的形参,第一个形参是用final修饰的,而第二个却没有。同时我们也发现第二个形参在匿名内部类中没有使用过,所以当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final。
  • 匿名内部类是没有构造方法的。因为它连名字都没有何来构造方法。(就是迅速产生的类 
  •  final的问题(内部类会自动拷贝外部变量的引用,为了避免:1. 外部方法修改引用,而导致内部类得到的引用值不一致 2.内部类修改引用,而导致外部方法的参数值在修改前和修改后不一致。于是就用 final 来让该引用不可改变。即内部类其实是使用了一个匿名函数,把他变为自己的对象,如果修改里面内容,不会反映到外部,为了一致性原则,需要加final,成员变量由于使用的是外部成员的引用,就没有一致性问题
  1. 外部类的成员变量
  2. 外部方法或作用域内的局部变量
  3. 外部方法的参数

   后面两种需要加final

  • 编译的时候由系统自动起名为Outter$1.class。

4,静态内部类 

  •  它的创建是不需要依赖于外围类的。
  •  它不能使用任何外围类的非static成员变量和方法。
  • OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
            InnerClass innerClass1 = new InnerClass();                 //两种方法来创建

  

资料,https://www.cnblogs.com/chenssy/p/3388487.html

原文地址:https://www.cnblogs.com/vhyc/p/9491826.html