内部类

作者: IT废柴 | 来源:发表于2016-09-08 10:13 被阅读0次

    转载自:http://www.cnblogs.com/chenssy/p/3388487.html

    内部类:在一个类的内部定义了一个类
    内部类的作用:使用内部类的原因是:每个内部类都能独立地继承一个(接口)实现,所以无论是外围类是否已经继承了某个(接口)实现,对于内部类都没有影响。
    使用内部类带来的好处:

    • 内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
    • 在单个外围类中,可以让多个内部类实现同一接口或者继承某一个类(包括抽象类),具体的实现可以不同。
    • 创建内部类对象的时刻并不依赖与外围类对象的创建。
    • 内部类并没有令人迷惑的“is - a ”关系,它是独立的
    • 内部类提供了更好的封装,除了该外围类,其他类都不能访问。

    内部类用法

    成员内部类

    成员内部类也是最普通的内部类,它是外围类的一个成员,所以他是可以无限制的访问外围类的所有成员变量和方法,包括private修饰的。外围类要访问内部列的成员属性和方法时,必须通过内部类的实例俩访问。

    在成员内部类中:

    • 成员内部类中不能存在private
    • 成员内部类只有在创建了外围类才能创建内部类
      OuterClass outer = new OuterClass();
      OuterClass.InnerClass inner = outer.getInnerClass();
      OuterClass 属于外围类,InnerClass属于OuterClass的内部类。
    • 推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时。

    局部内部类

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

    • 定义在方法中

          public class Parcel5 { 
              public Destionation destionation(String str){
                   class PDestionation implements Destionation{ 
                        private String label; 
                        private PDestionation(String whereTo){
                                  label = whereTo;
                         }
                         public String readLabel(){
                                 return label; 
                         }
                 }
                 return new PDestionation(str);
             } 
                public static void main(String[] args) { 
                  Parcel5 parcel5 = new Parcel5();
                  Destionation d = parcel5.destionation("chenssy");
                }
          }
      
    • 定义在作用域中
      public class Parcel6 {
      private void internalTracking(boolean b){
      if(b){
      class TrackingSlip{
      private String id;
      TrackingSlip(String s) {
      id = s;
      }
      String getSlip(){
      return id;
      }
      }
      TrackingSlip ts = new TrackingSlip("chenssy");
      String string = ts.getSlip();
      }
      }
      public void track(){
      internalTracking(true);
      }
      public static void main(String[] args) {
      Parcel6 parcel6 = new Parcel6();
      parcel6.track();
      }
      }

    匿名内部类

          public class OuterClass {
                     public InnerClass getInnerClass(final int num,String str2){
                                return new InnerClass(){
                                           int number = num + 3;
                                           public int getNumber(){
                                                      return number;
                                            }
                                  };        /* 注意:分号不能省 */
                       }
    
                    public static void main(String[] args) {
                                OuterClass out = new OuterClass();
                                InnerClass inner = out.getInnerClass(2, "chenssy");
                                System.out.println(inner.getNumber());
                     }
          }
          interface InnerClass {
                  int getNumber();
           }
    

    注意:

    • 匿名内部类是没有访问修饰符的
    • new 匿名内部类,这个类首先要存在。
    • 注意getInnerClass()方法的形参,第一个形参是用final修饰的,而第二个却没有。同时我们也发现第二个形参在匿名内部类中没有使用过,所以当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final。
    • 匿名内部类是没有构造方法的。因为它连名字都没有何来构造方法。
    • 匿名内部类必须实现一个父类或者一个接口。
    Paste_Image.png
    Paste_Image.png

    静态内部类

    使用static修饰的内部类我们称之为静态内部类。
    静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:

    • 它的创建是不需要依赖于外围类的。
    • 它不能使用任何外围类的非static成员变量和方法。

    相关文章

      网友评论

          本文标题:内部类

          本文链接:https://www.haomeiwen.com/subject/ffjsettx.html