Java嵌套类
来源:互联网 发布:淘宝网皮书包 编辑:程序博客网 时间:2024/05/16 14:35
本文来自于Java深入解析——透析Java本质的36个话题
Java的嵌套类分为 静态成员类(静态嵌套类)、内部类(非静态嵌套类)、嵌套接口。内部类还可以分为内部成员类、本地内部类、匿名内部类。
一、静态成员类
习惯上将它成为静态嵌套类。标记为在类中使用 static 声明的类。静态成员类可以访问外围类的任何成员,包括声明为private的成员。但是非静态的外围成员,则需要经过恰当的对象引用才能访问。因为是静态成员类,所以可以不依赖于外围类而独立存在并访问。在继承方面,静态成员类与外围类也没有什么区别,在访问权限允许的情况下,任何类都可以继承静态成员类,静态成员类也可以继承任何(允许继承的)类或者接口。
二、内部类
内部类与静态成员类不同之处在于,内部类与外围类紧密关联。从结构上说,内部类类似于类的实例变量,必须存在对象,才能够访问。所以,如果没有外围类对象存在,则不可能有内部类。而静态成员又是不需要对象就可以直接访问的,由于这种依赖与矛盾关系,内部类不可以申明为静态成员(包括静态成员变量、静态方法、静态成员类或嵌套接口)或静态初始化块。
不过内部类可以声明为编译时常量的final静态变量,因为编译器对final类型的变量进行了特殊处理,是将值直接写入字节码中,而不会生成变量的符号引用。
内部类绑定到外围对象
内部类必须要存在对象时才能访问。示例
package test;public class Out{ public static class Static{ } public class Inner{ } public void go(){ Out mout = new Out(); Out.Inner inner = mout.new Inner(); }}
此处的内部类Inner虽然构造函数没有接收参数,但是编译器会将Out对象 mout 作为参数传递进去。所以Inner其实是这样的
public class Inner{ final Out this$0; public Inner(Out t){ this$0 = t; super(); }}
此处的 this$0 是编译器自动生成。
内部类继承
public class InnerInheritance extends Outer.Inner{ public InnerInheritance(Outer outer){ outer.super(); }}calss Outer{ class Inner{ }}
本地内部类
public class LocalClass{ private int a = 1; { class Local1{}; } static { Class Local2{}; } public LocalClass(){ int x = 2; final int y = 3; class Local3{ int w = y; int q = a; //int z = x; 不能访问非final 的局部变量 } } public TV method(){ //使用本地类实现某个接口,然后以接口形式返回 class Local4 implements TV{ @override public void turnOn(){ System.out.println("Turn on the TV."); } @override public void turnOff(){ System.out.println("Turn off the TV."); } } return new Local4(); }}interface TV{ void turnOn(); void turnOff();}
匿名类
待续。。。
0 0
- Java嵌套类
- Java 嵌套类
- JAVA嵌套类用法
- Java 嵌套类
- Java嵌套类
- java 嵌套类
- Java中的嵌套类
- Java嵌套类
- Java嵌套类
- java中的嵌套类
- java-嵌套类
- java基础-嵌套类
- Java中的嵌套类
- Java进阶---嵌套类
- java中的嵌套类
- java嵌套类
- Java支持哪些嵌套类?
- java 嵌套类 访问方法
- 更改归档日志路径
- glibc-2.15 : fopen 源码
- 目标检测“DPMs are CNNs”
- PASSION之Linux命令详解
- 小巧而又强大的翻译神器--QTranslate
- Java嵌套类
- 基于HashHeap的LFU实现
- js typeof
- swift 初级 断言
- Ubuntu 安装mysql和简单操作
- 【L“”】无法将参数从“const char”转换为“LPCWSTR”
- 删除链表中倒数第n个节点(LintCode)
- 常用的排序算法的时间复杂度和空间复杂度
- 仿微博个人主页效果