zoukankan      html  css  js  c++  java
  • thinking in java笔记 10 内部类

    ***访问
        1.从外部类的(非静态方法)之外的地方创建内部类对象时,需要使用Outerclass.innerclass来指明类型
        2.内部类拥有对外部类所有元素的访问权,内部类隐式地保存了一个指向外部类对象的引用。
        3..this .new
          在内部类中,可以使用OuterClass.this获取对外部类对象的引用。
          不能直接生产内部类对象,而是通过外部类对象来创建,如
          OutClass outer= new OutClass();
    OuterClass .InnerClass inner=outer. new InnerClass();
       4.外部类可以访问内部类的private元素。

    ***private内部类
        可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节。除了OuterClass,都无法访问到它。

    ***内部类使用范围
        内部类可在任意地方使用,同变量一样,有其作用区域,在区域外无效。

    ***匿名内部类
        在匿名内部类中使用外部定义的对象时,参数引用必须是final类型的。
         public class Parcel9 {
    public Destination destination( final String dest) {
    return new Destination() {
    private String label = dest;
    public String readLabel() { return label ; }
    };
    }
    public static void main(String[] args) {
    Parcel9 p = new Parcel9();
    Destination d = p.destination( "Tasmania" );
    }
    }


        匿名类内部没有命名构造器,但通过实例初始化,可以模拟构造器的效果:
         abstract class Base {
    public Base( int i) {
    print( "Base constructor, i = " + i);
    }
    public abstract void f();
    }

    public class AnonymousConstructor {
    public static Base getBase( int i) {
    return new Base(i) {
    { print( "Inside instance initializer" ); }
    public void f() {
    print( "In anonymous f()" );
    }
    };
    }
    public static void main(String[] args) {
    Base base = getBase(47);
    base.f();
    }
    }

    ***嵌套类
        内部类为static
        1.要创建嵌套类的对象,不需要其外围类的对象
        2.不能从 嵌套类的对象中访问非静态的外围类对象。
        3.普通的内部类不能包含static数据和字段,也不能包含嵌套类。嵌套类可以包含。

    ***为什么使用内部类
        内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象,所以可以认为内部类提供了某种进入其外部类的窗口。
        当要对类实现多重继承时,需使用内部类来解决,如下:
         class D {}
    abstract class E {}

    class Z extends D {
    E makeE() { return new E() {}; }
    }

    public class MultiImplementation {
    static void takesD(D d) {}
    static void takesE(E e) {}
    public static void main(String[] args) {
    Z z = new Z();
    takesD(z);
    takesE(z.makeE());
    }
    }

        内部类的特性:
        1 内部类可以有多个实例,每个实例有自己的状态信息,并且与其外围类对象的信息相互独立。
        2 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
        3 创建内部类对象时并不依赖于外部类对象的创建
        4 内部类没有令人迷惑的is-a关系,它是一个独立的实体。

        回调可通过内部类实现,在内部类中实现接口,以提供一个hook供外界调用。回调的价值在于其灵活性,可以在运行时动态地决定需要调用什么方法。

    ***内部类的继承
        因为内部类的构造器必须连接到指向其外部类对象的引用,所以继承内部类时需按如下方法:
         class WithInner {
    class Inner {}
    }

    public class InheritInner extends WithInner.Inner {
    InheritInner(WithInner wi) {
    wi. super ();
    }
    public static void main(String[] args) {
    WithInner wi = new WithInner();
    InheritInner ii = new InheritInner(wi);
    }
    }

    ***局部内部类
        可以在代码块中创建内部类,称为局部内部类。其不能有访问说明符,不是外围类的一部分,能访问外围类的所有成员和当前方法内的变量,只在方法范围内有效。
        用它而不是匿名内部类的情况:
          1 需要一个已命名的构造器,或者需要重载构造器,而匿名内部类只能用于实例初始化。
          2 需要不止一个该内部类的对象。

  • 相关阅读:
    快速入门系列--MVC--07与HTML5移动开发的结合
    快速入门系列--WebAPI--01基础
    快速入门系列--CLR--02多线程
    MongoDB快速入门
    ubuntu 12.04 server编译安装nginx
    apache 正反向代理
    c# 继承,多态,new /overrid 区别, 引用父类的方法
    python 异步线程简单实现
    ubuntu上完全卸载package
    apache2:Invalid option to WSGI daemon process definition
  • 原文地址:https://www.cnblogs.com/myparamita/p/2203969.html
Copyright © 2011-2022 走看看