博客
关于我
内部类
阅读量: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内置函数详解——总结篇
    查看>>
    Python.对象集合中的标识.和散列
    查看>>
    Python.硒.拖放错误“AttributeError:move_to 需要 WebElement“
    查看>>
    Python内置函数详解
    查看>>
    Python/Kivy:从一个类调用函数到另一个类并在 Python 中显示小部件
    查看>>
    Python/Kivy:我可以在双击标签时调用函数吗
    查看>>
    python内置函数5-frozenset()
    查看>>
    Python/Plotly:如何使用要显示的信息自定义悬停模板?
    查看>>
    Python/Selenium - 无法单击 www.instagram.com 上的“接受 cookie“按钮
    查看>>
    Python内置函数(35)——next
    查看>>
    python写入mysql
    查看>>
    python写入csv老是乱码或者各种不好
    查看>>
    Python内置函数
    查看>>
    Python2 安装MySQLdb库
    查看>>
    Python2 已终结,入手Python 3,你需要这30个技巧
    查看>>
    python写下拉列表在excel,无法使用python获取Excel下拉列表(组合框)值
    查看>>
    python2.7安装
    查看>>
    Python2.7安装ncmbot时提示:Microsoft Visual C++9.0 is required
    查看>>
    PYTHON2.Git.1
    查看>>
    python20181211
    查看>>