• 内部类


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

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

    如果需要生成对外部对象的引用,可以使用外部类的名字后面紧跟原点和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对象信息。外围类的名字,加上$,再加上内部类的名字。

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

  • 相关阅读:
    如何理解C语言的左结合 和右结合性
    Egg项目使用vscode的debug模式跑单元测试
    为什么要用MongoDB副本集
    理解JS原型和原型链
    防止重复请求攻击
    引擎、编译器和作用域
    闭包原理解析及其应用场景
    树形结构数据完美解决方案
    Excel文件导入导出(基于Nodejs、exceljs)
    架构层面高并发解决方案选择----项目架构模式选择
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/6112116.html
Copyright © 2020-2023  润新知