博客
关于我
内部类
阅读量:526 次
发布时间:2019-03-08

本文共 2955 字,大约阅读时间需要 9 分钟。

实例内部类与静态内部类

实例内部类

获取实例内部类对象

要获取实例内部类的对象,通常需要以下步骤:

外部类类名.内部类类名 变量 = 外部类对象的引用.new 内部类()

例如:

OuterClass.InnerClass innerClass = outerClass.new InnerClass();
外部类类名.内部类类名 变量 = 外部类对象的引用.new 内部类()

实例内部类的性质

  • 不能定义非静态属性或方法

    实例内部类的非静态数据成员必须在编译期间就能确定。只能定义 static final 的属性或 static 方法。

  • 内存开销

    实例内部类包含外部类的 this 引用,因此至少占用两个 this,存在内存开销。

  • 代码示例

    public class OuterClass {    public int data1 = 1;    private int data2 = 2;    int data3 = 3;    public static int size = 10;    public OuterClass() {        System.out.println("OuterClass()");    }    class InnerClass {        public int data4 = 4;        public static final int size = 10;        public int data1 = 11;        public InnerClass() {            System.out.println("InnerClass()");        }        public void test() {            System.out.println("data1=" + data1);    // 11            System.out.println("OuterClass的data1=" + OuterClass.this.data1); // 1            System.out.println("InnerClass的test()方法");        }    }}public class TestDemo {    public static void main(String[] args) {        OuterClass outerClass = new OuterClass();        OuterClass.InnerClass innerClass = outerClass.new InnerClass();        System.out.println(innerClass.data4);    // 4        innerClass.test();    }}

    静态内部类

    获取静态内部类对象

    静态内部类的对象获取方式类似于实例内部类:

    静态内部类对象 = new 静态内部类();

    例如:

    OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();

    静态内部类的性质

  • 不能访问外部类的非静态成员

    如果需要访问外部类的非静态成员,需要传入外部类对象引用。

  • 没有外部类的 this 引用

    静态内部类不具备外部类的 this 引用。

  • 代码示例

    public class OuterClass2 {    public int data1 = 1;    private int data2 = 2;    int data3 = 3;    public static int data5 = 10;    public OuterClass2() {        System.out.println("OuterClass2()");    }    static class InnerClass2 {        public int data1 = 4;        public static final int data5 = 5;        OuterClass2 outerClass;        InnerClass2() {            System.out.println("static的InnerClass2()");        }        InnerClass2(OuterClass2 outerClass2) {            this.outerClass = outerClass2;            System.out.println("static的InnerClass2()");        }        public void test() {            System.out.println("data1=" + this.outerClass.data1);    // 1            System.out.println("data1=" + data1);                    // 4            System.out.println("data5=" + data5);                    // 5            System.out.println("data5=" + OuterClass2.data5);             // 10            System.out.println("InnerClass2的test()方法");            System.out.println("InnerClass2的test()方法");        }    }}public class TestDemo1 {    public static void main(String[] args) {        OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();        System.out.println(innerClass2.data1);    // 4        OuterClass2 outerClass2 = new OuterClass2();        OuterClass2.InnerClass2 innerClass21 = new OuterClass2.InnerClass2(outerClass2);        innerClass21.test();    }}

    总结

    实例内部类和静态内部类都是外部类的常见内部类类型。实例内部类包含外部类的 this 引用,而静态内部类不含。理解这两种内部类的性质对于优化内存占用和正确使用内部类有重要意义。

    转载地址:http://xbrnz.baihongyu.com/

    你可能感兴趣的文章
    Mysql中触发器的使用示例
    查看>>
    Mysql中设置只允许指定ip能连接访问(可视化工具的方式)
    查看>>
    mysql中还有窗口函数?这是什么东西?
    查看>>
    mysql中间件
    查看>>
    MYSQL中频繁的乱码问题终极解决
    查看>>
    MySQL为Null会导致5个问题,个个致命!
    查看>>
    MySQL为什么不建议使用delete删除数据?
    查看>>
    MySQL主从、环境搭建、主从配制
    查看>>
    Mysql主从不同步
    查看>>
    mysql主从同步及清除信息
    查看>>
    MySQL主从同步相关-主从多久的延迟?
    查看>>
    mysql主从同步配置方法和原理
    查看>>
    mysql主从复制 master和slave配置的参数大全
    查看>>
    MySQL主从复制几个重要的启动选项
    查看>>
    MySQL主从复制及排错
    查看>>
    mysql主从复制及故障修复
    查看>>
    MySQL主从复制的原理和实践操作
    查看>>
    webpack loader配置全流程详解
    查看>>
    mysql主从复制,读写分离,半同步复制实现
    查看>>
    MySQL主从失败 错误Got fatal error 1236解决方法
    查看>>