博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内部类的访问特点
阅读量:6322 次
发布时间:2019-06-22

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

今天刷题的时候遇到了一题关于内部类的访问的问题,发现自己忘了许多,现在来复习一下。

首先,内部类的类字节码文件名字为Outer$Inner.class。

记住一下访问原则:

1.内部类相当于外部类的一个成员变量,因此内部类可以直接访问外部类的成员。但是注意内部类静态方法不能访问外部类非静态成员
2.但是外部类如果要访问内部类中的成员,要么内部类是静态的,跟着外部类一起被加载;要么创建内部类的对象,通过对象访问(想让外部类进内部类里面,总得有内部类的“实体”吧,这个“实体”要么是跟外部类一起加载的静态内部类,要么是新建的内部类的对象,无论是哪种,都会在堆中为内部类开辟空间,然后才可以访问到)
例子:

a.外部类访问静态内部类的静态成员(一路畅通无阻)Outer.Inner.func();b.外部类访问静态内部类的非静态成员(一路畅通到内部类门口,发现里面还没东西,怎么办?创建对象!)//一般方式Outer.Inner in = new Outer.Inner();in.func();//匿名方式new Outer.Inner().func();//new Outer.Inner()创建出对象,然后调用对象的funcc.外部类访问非静态内部类的非静态成员(没对象,内部类的门都找不到!乖乖一步步创建对象吧)//一般方式Outer.Inner in = new Outer().new Inner();in.func();//匿名方式new Outer().new Inner().func();

3.内部类如果有静态成员,则内部类也必须是静态的(否则内部类成员要随着外部类加载,发现内部类自己都还没加载,那这个成员是哪儿跑出来的呢?)

4.内部类访问局部变量时,局部变量必须加final修饰符。(随着方法运行完毕,局部变量会被释放,如果此时一个内部类还引用该变量则会报错。说到底就是变量的生命周期比内部类实例要短。而final保证这个变量始终指向一个对象,内部类就可以放心大胆地引用了。其实犯了和C++一样的毛病:返回了局部变量的引用)
注意:在JDK8版本之中,方法内部类中调用方法中的局部变量,可以不需要修饰为 final,匿名内部类也是一样的,主要是JDK8之后增加了 Effectively final 功能

class Outer{                                                                           public static void main(String[] args){            Object obj = new Outer().method();    }       Object method(){            int locvar = 1;            class Inner{                    void displayLocvar(){                            System.out.println("locvar = " + locvar);                    }            }            Object in = new Inner();            return in;//返回了内部类对象,但是该对象依然引用着局部变量     }

}

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

你可能感兴趣的文章
嵌入式开发的学习步骤及入门
查看>>
决心书
查看>>
Oracle 基础篇 --- B树索引内部结构
查看>>
centos7 Tab键之后yum不自动补全解决
查看>>
RTB价格加解密
查看>>
day13-LNMP、FASTCGI
查看>>
容器操作使迭代器失效
查看>>
成为专业程序员路上用到的各种优秀资料、神器及框架
查看>>
将input或textarea设置为disabled的样式问题
查看>>
HDU 2017 多校联合Contest 3
查看>>
Mysqlreport总结
查看>>
Ubuntu14.04忘记root密码的解决方法
查看>>
JS中解决中文乱码的2种方法
查看>>
C语言学习大纲
查看>>
spring boot 官方文档笔记
查看>>
JVM 运行时数据区
查看>>
谈STL的重要应用与实现
查看>>
Android中的关于MDM中的几个方法举例
查看>>
optimize table tablename
查看>>
树五:二叉搜索树的后序遍历序列
查看>>