作用:
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,成员变量由于使用的是外部成员的引用,就没有一致性问题
- 外部类的成员变量
- 外部方法或作用域内的局部变量
- 外部方法的参数
后面两种需要加final
- 编译的时候由系统自动起名为Outter$1.class。
4,静态内部类
- 它的创建是不需要依赖于外围类的。
- 它不能使用任何外围类的非static成员变量和方法。
-
OuterClass.InnerClass innerClass = new OuterClass.InnerClass(); InnerClass innerClass1 = new InnerClass(); //两种方法来创建
资料,https://www.cnblogs.com/chenssy/p/3388487.html