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

    初次接触内部类时,由于它特殊的语法规则而产生反感,这玩意怎么不按套路出牌?后来直到学了建造者模式,使用到了静态内部类后,才改变了这种看法,今天恰好在读书的时候读到了内部类的章节,索性总结一下心得体会,以免日后忘记。

    书中对内部类的定义是:定义在另一个类中的类。

    对于内部类存在的意义也给出了三点解释:

    内部类可以访问外部类的变量。

    内部类可以对同包中其他类隐藏。

    匿名内部类可以简化回调函数的代码。

    那么内部类是如何做到引用外部类的成员变量的呢?既没有使用外部类的实例对象,也没有使用外部类的类名调用静态变量,却可以直接使用外部类的成员变量。对于这一点,书中给出的解释是隐式引用,这个隐式引用指向了外部类的对象。编译器修改了所有内部类的构造器,添加了外部类引用参数,当内部类创建的时候,会将外部类的引用传进去,而这一切都是隐式的。

    内部类访问外部类变量以及在外部类之外创建内部类实例:

    public class OutClass {
    
        private Integer id = 2;
    
        public class InnerClass {
            public void write() {
                System.out.println(id);//内部类访问外部类变量写法1
                System.out.println(OutClass.this.id);//内部类访问外部类变量写法2
            }
        }
    }
    
    class Test {
        public static void main(String[] args) {
            OutClass.InnerClass innerClass = new OutClass().new InnerClass();//在外部类之外创建内部类实例对象
            innerClass.write();
        }
    }

    局部内部类

    局部内部类是定义在方法中的内部类,它的作用域被限定在方法内,即便是外部类中其他的位置也无法访问局部内部类。局部内部类不仅可以对外部完全隐藏,还可以访问局部变量,但前提是局部变量必须由final修饰,然后在书中的示例代码中发现原来final关键字还可以用来修饰形参。

    匿名内部类,形式上看上去貌似和匿名类没什么区别,只是将其放入了另一个类中。

    静态内部类,没有对外部类对象的引用。

  • 相关阅读:
    有关.net 框架的学习笔记
    简单定义工程架构
    respondsToSelector的相关使用
    IOS框架和服务
    iOS常用第三方类库
    ios换肤思想,及工具类
    集成激光推送
    远程推送
    ios本地推送
    UIPopoverController 的使用
  • 原文地址:https://www.cnblogs.com/wxdmw/p/13862772.html
Copyright © 2011-2022 走看看