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

    内部类:将一个类的定义放在另一个类的定义内部。

    内部类自动拥有对齐外围类所有成员的访问权限。当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。构建内部类的时候需要一个指向外部类对象的引用,如果编译器访问不到这个引用,就会报错。

    如果需要生成对外部对象的引用,可以使用外部类的名字后面紧跟原点和this。

    public class Outter{    
        void print(){
            System.out.print("This is outter's method");
        }
    
        public class Inner(){
            public Outter getOutter(){
                retur Outter.this;
            }
        }    
        
        public Inner inner(){
            return new Inner();
        }
    
        public static void main(String[] args){
            Outter outter = new Outter();
            Outter.Inner inner = outter.inner();
            inner.getOutter().outter.f();
        }
    }                    

    若要创建内部类的对象,则必须在new表达式中提供对外部类对象的引用(.new)。即用外部类的对象来创建内部类的对象。Outter.Inner inner = outter.new Inner();创建嵌套类(静态内部类)则不需要对外部类对象的引用。

    当内部类向上转型为其基类,尤其是转型为一个接口时,所得到的只是指向基类或接口的引用,所以能够很方便得隐藏实现细节。

    private内部类可以完全组织任何依赖于类型的编码,并完全隐藏了实现的细节。

    在一个方法里面或者任意的作用域内定义内部类,有两个理由:实现了某类型的接口并返回其引用;想解决一个复杂的问题,创建一个辅助类来实现你的解决方案,但是不希望这个类被公开。

    局部内部类:在方法的作用域内创建一个完整的类

    匿名类:将返回值的生成与表示这个返回值的类型的定义结合在一起

    如果定义一个匿名内部类,并且希望他使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。匿名类不具有默认构造器,通过实例初始化,可以达到为匿名内部类创建一个构造器的效果。

    匿名内部类可以扩展类也可以实现接口,但不能两者兼备,若要实现接口,也只能实现一个接口。

    嵌套类:不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static。

    嵌套类意味着要创建嵌套类的对象,并不需要其外围类的对象;不能从嵌套类的对象中访问非静态的外围类对象

    嵌套类可以作为接口的一部分,接口中的任何类自动提升为public和static。甚至可以在内部类中实现其外围接口。

    可以使用嵌套类来放置测试代码。嵌套类能访问所有他所嵌入的外围类的所有成员。

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

    每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多重继承的解决方案变得完整。

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

    内部类的特性:

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

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

      创建内部类对象的时候并不依赖与外围类对象的创建

      内部类并没有令人迷惑的is-a关系;它是一个独立的实体

    闭包是一个可调用对象,它记录了一些信息,这些信息来自于常见它的作用域。

    应用程序框架被设计用以解决某类特定问题的一个类或一组类。要运用某个应用程序框架,通常是继承一个类或多个类,并覆盖某些方法。在覆盖后的方法中,编写代码定制应用程序框架提供的解决方案,以解决你的特定问题。

    控制框架用来解决响应事件的需求,主要用来响应事件的系统被称作件事件驱动系统。

    内部类的构造器必须连接到指向其外围类的应用,所以在继承内部类的时候,只想外围对象的引用必须被初始化,而在到处类中不再存在可连接的默认对象。因为在继承内部类时,必须在构造器内使用enclosingReference.super();

    如果创建了一个内部类,然后继承其外围类并重新定义此内部类时,并不会覆盖内部类。因为他们都有自己的命名空间,是两个完全独立的实体。

    局部内部类不能有访问说明符,因为他不是外围类的一部分,但它可以访问当前代码块内的常量以及此外围类的所有成员

    匿名类通常只用于实例初始化。

    当需要多个内部类的对象时,只能使用局部类而不能使用内部类。

    每个类都产长生一个.class文件,其中包含了如何创建该类型的对象的全部信息。内部类也会产生一个.class文件已包含他们的class对象信息。外围类的名字,加上$,再加上内部类的名字。

    如果内部类是匿名的,编译器会简单地产生一个数字作为其标识符,如果内部类是嵌在别的内部类之中,只需直接将它们的名字加在其外围类标识符与$后面。

  • 相关阅读:
    CDH 2、Cloudera Manager的安装
    204 01 Android 零基础入门 03 Java常用工具类 04 Java集合 04 Map集合 01 Map概述
    203 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 07 删除宠物猫信息数据(引入泛型知识点)
    202 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 06 查找宠物猫信息数据
    201 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 05 添加重复的宠物猫信息数据
    200 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 04 添加和显式宠物猫信息
    199 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 03 宠物猫信息管理概述
    198 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 02 案例:在集合中插入字符串
    197 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 01 Set概述
    196 01 Android 零基础入门 03 Java常用工具类 04 Java集合 02 List集合 05 案例:公告的删除和修改
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/6112116.html
Copyright © 2011-2022 走看看