zoukankan      html  css  js  c++  java
  • Java之内部类(1)

    为什么需要内部类

          一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。

          内部类必须要回答的一个问题是:如果只是需要一个对接口的引用,为什么不通过外围类实现那个接口呢?答案是:“如果这样能满足需求,那么就应该这样做。” 那么内部类实现一个接口与外围类实现这个接口有什么区别呢?

    答案是:后者不是在那个能享用到接口带来的方便,有时需要用到接口的实现。所以,使用内部类最吸引人的原因是:

          每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类没有影响。

          如果没有内部类提供的、可继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。也就是说,

    内部类允许继承多个非接口类型(类或抽象类)。

    情景1:必须在一个类中以某种方式实现两个接口。由于接口的灵活性,可以有2种方式实现:使用单一类,或者使用内部类

     1 package tools;
     2 
     3 import tools.InnerClass.A;
     4 import tools.InnerClass.B;
     5 
     6 public class InnerClass {
     7     
     8     interface A {}
     9     interface B {}
    10     
    11     static void takesA(A a){}
    12     static void takesB(B b){}
    13 
    14     public static void main(String[] args) {
    15         
    16         X x = new X();
    17         Y y = new Y();
    18          //1
    19         takesA(x);
    20         takesA(y);
    21         //2
    22         takesB(x);
    23         takesB(y.makeB());
    24     }
    25 
    26 }
    27 
    28 class X implements A, B {}
    29 class Y implements A {
    30     B makeB() {
    31         return new B(){};
    32     }
    33 }
    View Code

    情景2:如果拥有的是抽象类或具体类,而不是接口,那就只能使用内部类才能实现多重继承了。

     1 package tools;
     2 
     3 class D {}
     4 abstract class E {}
     5 class Z extends D {
     6     E makeE(){return new E(){};}
     7 }
     8 
     9 
    10 public class InnerClass {
    11     static void takesD(D d){}
    12     static void takesE(E d){}
    13     public static void main(String[] args) {
    14         Z z = new Z();
    15         takesD(z);
    16         takesE(z.makeE());
    17     }
    18 
    19 }
    View Code

    内部类还有一些其他特性:

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

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

    3.创建内部类对象的时刻并依赖于外围类对象的创建

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

     
     
  • 相关阅读:
    Js特效总结
    asp.net中的绝对路径和相对路径
    GrideView合并列合并序号,隐藏某列按钮
    WebConfig 配置文件详解
    ASP.NET打印EXCEl报表技术总结
    ADO.NET DataSet、DataTable、DataRow、DataView的学习
    asp.netGridView使用技巧
    .net Remoting
    C# webservice开发
    js实现网页打印分页打印
  • 原文地址:https://www.cnblogs.com/royi123/p/3965144.html
Copyright © 2011-2022 走看看