asp网站密码,从零开始做一个网站需要多少钱,seolxw,虚拟主机网站建设实训总结Java中实现内部类 内部类相信大家都用过很多次了#xff0c;就不说它是怎么用的了。
内部类
1.成员内部类 需要注意的是#xff0c; 当成员内部类拥有和外部类同名的成员变量或这方法时#xff0c; 默认情况下访问的是内部类的成员#xff0c; 如要访问外部类的同名成员就不说它是怎么用的了。
内部类
1.成员内部类 需要注意的是 当成员内部类拥有和外部类同名的成员变量或这方法时 默认情况下访问的是内部类的成员 如要访问外部类的同名成员 需要使用以下形式
外部类.this.成员变量
外部类.this.成员方法
内部类是依附外部类而存在的 也就是说要创建成员内部类的对象前提是创建一个外部类的对象创建成员内部类的方式如下
new Main().new Inner();
成员内部类可以拥有private访问权限、protected访问权限、public访问权限、默认访问权限。如用private修饰则只能在外部类的内部访问。
2.局部内部类
局部内部类是定义在一个方法或作用域中的类它的访问权限仅限于方法内或作用域内。 局部内部类也可以返回像这样 3.匿名内部类
匿名内部类应该是我们平常使用最多的了如下面创建线程 匿名内部类在编译的时候有系统自动起名Main$1
匿名内部类是没有构造器的类大部分用于继承其他类或实现接口并不需要增加额外的方法只是对继承方法的实现或是重写
4.静态内部类
静态内部类也是定义在另一个类里面的类只不过在类前加上了static。静态内部类是不需要依赖于外部类的与静态成员变量类似。 外部创建该静态类时可以如下创建
Main.Inner mi new Main Inner();
内部类实现原理
内部类为什么能够访问外部类的成员
定义内部类如下 使用javap命令进行反编译。
编译后得到Main.class Main$Inner.class两个文件反编译Main$Inner.class文件如下 可以看到内部类其实拥有外部类的一个引用在构造函数中将外部类的引用传递进来。
匿名内部类为什么只能访问局部的final变量
其实可以这样想当方法执行完毕后局部变量的生命周期就结束了而局部内部类对象的生命周期可能还没有结束那么在局部内部类中访问局部变量就不可能了所以将局部变量改为final改变其生命周期。
编写代码如下 这段代码编译为Main.class Main$1.class两个文件反编译Main$1.class文件如下 可以看到java将编译时已经确定的值直接复制进行替换将无法确定的值放到了内部类的常量池中并在构造函数中将其从常量池取出到字段中。
可以看出java将局部变量m直接进行复制所以其并不是原来的值若在内部类中将m更改局部变量的m值不会变就会出现数据不一致所以java就将其限制为final使其不能进行更改这样数据不一致的问题就解决了。
匿名内部类为什么访问外部类成员字段不用final
上面说了final关键字是为了解决数据不一致的问题因为内部类中存有外部类的引用所有对外部类中字段的修改都会真实的反映到外部类实例本身所以不需要用final来修饰。