博客
关于我
内部类
阅读量: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更新锁(for update)摘要
    查看>>
    mysql更新频率_MySQL优化之如何了解SQL的执行频率
    查看>>
    mysql替换表的字段里面内容
    查看>>
    MySQL最大建议行数 2000w,靠谱吗?
    查看>>
    MySQL有哪些锁
    查看>>
    MySQL服务器安装(Linux)
    查看>>
    mysql服务器查询慢原因分析方法
    查看>>
    mysql服务无法启动的问题
    查看>>
    MySQL杂谈
    查看>>
    mysql权限
    查看>>
    mysql条件查询
    查看>>
    MySQL条件查询
    查看>>
    MySQL架构与SQL的执行流程_1
    查看>>
    MySQL架构与SQL的执行流程_2
    查看>>
    MySQL架构介绍
    查看>>
    MySQL架构优化
    查看>>
    mysql架构简介、及linux版的安装
    查看>>
    MySQL查看数据库相关信息
    查看>>
    MySQL查看表结构和表中数据
    查看>>