Java内部类

作者: 芒果味的你呀 | 来源:发表于2017-07-27 15:08 被阅读86次

    Java内部类


    大纲:

    java内部类有什么特点?为什么需要内部类?

    非静态内部类持有外部类的引用

    内部类的分类。


    1.java内部类有什么特点?为什么需要内部类?

    java通过内部类加上接口,可以很好的实现多继承的效果。(比如当自己的类中的某个方法和接口中的方法重复,此时可以新建一个内部类去实现这个接口,由于内部类对外部类的所有内容都是可访问的,所以这样做可以直接实现这个接口的所有功能。)

    一个内部类对象可以访问创建它的外部类对象的所有内容。

    内部类体现封装性,可以隐藏不想让别人知道的操作。


    2. 非静态内部类持有外部类的引用

    Java编译器在创建非静态内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得非静态内部类对象始终可以访问其外部类对象。也是为什么在外部类作用范围之外向要创建成员内部类对象必须先创建其外部类对象的原因。

    3. 内部类的分类:


    成员内部类(非静态内部类)

    a.在外部类里面创建成员内部类的实例:this.new Innerclass();

    b.在外部类之外创建内部类的实例:(new Outerclass()).new Innerclass();即创建成员内部类的对象, 需要先创建外部类的实例。

    c.在内部类里访问外部类的成员:Outerclass.this.member

    d.非静态内部类为什么不能有静态static修饰的成员:java类的加载顺序,先加载类的字节码(编译期),再执行static变量初始化,然后对象的创建。内部类的初始化必须要在外部类对象创建之后,但是静态变量需要在对象创建之前完成,(内部类的加载在外部类实例化之前,此时static)因此产生了矛盾。

    e.但是为什么非静态内部类不能有static但是可以有static final修饰的基本数据类型和String类型的常量数据

    非静态内部类 依赖于一个外部类对象,而静态域/方法是不依赖与对象——仅与类相关,因此,非静态内部类中不能定义静态域/方法,编译过不了。

    final关键字的字面语义就是指明不可变,用在属性上,表示属性一旦赋值后即不可改变。与static关键字合用即表示定义一个常量,而常量之所以可以(不论有无static),因为java在编译期就确定所有常量,放到所谓的常量池当中。常量的机制和普通变量不一样。java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的。所以可以通过编译。


    静态内部类

    a.和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。

    b.在任何非静态内部类中,都不能有静态数据,静态方法。

    c.静态内部类只能访问外部类的静态属性与方法。


    局部内部类

    a.在方法中定义的内部类,范围为定义它的代码块。比方法的范围还要小。

    b.像局部变量一样,不能被public, protected, private和static修饰。

    c.只能访问方法中定义的final类型的局部变量。不可以访问非final的局部变量。


    匿名内部类

    a.就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。

    b.匿名内部类隐式地继承了一个父类或者实现了一个接口。如果继承的一个父类,参数必须按父类的构造函数的参数传递。如果是实现接口,则必须实现指定接口的方法。

    c.通常作为一个方法的参数使用,比如runnable接口实现。


    相关文章

      网友评论

        本文标题:Java内部类

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