博客
关于我
内部类
阅读量: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/

    你可能感兴趣的文章
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>
    MyPython
    查看>>
    MTD技术介绍
    查看>>
    MySQL
    查看>>
    MySQL
    查看>>
    mysql
    查看>>
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>