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

    你可能感兴趣的文章
    python+locust电商全流程性能测试
    查看>>
    Python函数运行的可执行文件的终端输出如何以一般方式静音?
    查看>>
    Python+Pytest+Allure+Git+Jenkins接口自动化框架
    查看>>
    python+pytest接口自动化 —— 参数关联
    查看>>
    python+pytest接口自动化 —— 参数关联
    查看>>
    Python+pytest接口自动化 —— 接口测试基础
    查看>>
    python+pytest接口自动化 —— 自动化用例编写思路 (使用pytest编写一个测试脚本)
    查看>>
    Python+pytest接口自动化之cookie绕过登录(保持登录状态)
    查看>>
    python+pytest接口自动化:接口测试
    查看>>
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    python+requests+unittest执行自动化接口测试!
    查看>>
    Python+Requests编码识别Bug
    查看>>
    python函数编写_[零基础学python]传说中的函数编写条规
    查看>>
    Python+selenium —— UI自动化之鼠标操作
    查看>>
    python函数注释,参数后面加冒号:,函数后面的箭头→是什么?
    查看>>
    Python+Selenium+Threading进行兼容性测试
    查看>>
    Python+selenium+unittest的GUI自动化框架实现
    查看>>
    python函数拟合不规则曲线_Python计算&绘图——曲线拟合问题(转)
    查看>>
    python函数定义的基本格式_零基础学python-2.19 定义函数、调用函数与默认参数
    查看>>