zoukankan      html  css  js  c++  java
  • 内部类

    作用:

      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

  • 相关阅读:
    IO库 8.5
    IO库 8.4
    标准模板库——IO库
    IO库 8.3
    IO库 8.2
    IO库 8.1
    CF 599D Spongebob and Squares(数学)
    Django入门学习(一)
    hdu 5733
    uva 11210
  • 原文地址:https://www.cnblogs.com/vhyc/p/9491826.html
Copyright © 2011-2022 走看看