创建普通内部类对象与创建嵌套类对象的不同
2015-12-09 16:05
204 查看
为什么需要使用内部类?
使用内部类的原因:每个内部类都能独立的继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)的实现,对内部类都没有影响。实际上内部类有效的实现了“多重继承”,就是说,内部类允许继承多个非接口类型。
我们知道内部类自动拥有对外部类所有成员的访问权,那么这是如何做到的吗?当某个外部类对象创建了一个内部类对象时,此内部类对象必定会秘密的捕获一个指向那个外部类对象的引用。然后,在你访问外部类的成员时,就是用那个引用来选择外部类的成员。当然这些细节是编译器处理,并且这里的内部类是非static的。
要创建内部类的对象,不是按照本来想的方式,去引用外部类的名字DotNew,而是必须使用外部类的对象来创建内部类的对象。如下面的例子:
public class DotNew{
public class Inner{
}
public static void main(String[] args){
DotNew dn =new DotNew();
DotNew.Inner dni=dn.new Inner();
}
}
但是,如果你创建的是嵌套类(静态内部类),那么就不需要外部类对象引用,如下面的例子:
package innerclassdotnew;
public class InnerDotNew {
}
/*output/
InnerDotNew
normal Inner class
static inner class
使用内部类的原因:每个内部类都能独立的继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)的实现,对内部类都没有影响。实际上内部类有效的实现了“多重继承”,就是说,内部类允许继承多个非接口类型。
我们知道内部类自动拥有对外部类所有成员的访问权,那么这是如何做到的吗?当某个外部类对象创建了一个内部类对象时,此内部类对象必定会秘密的捕获一个指向那个外部类对象的引用。然后,在你访问外部类的成员时,就是用那个引用来选择外部类的成员。当然这些细节是编译器处理,并且这里的内部类是非static的。
要创建内部类的对象,不是按照本来想的方式,去引用外部类的名字DotNew,而是必须使用外部类的对象来创建内部类的对象。如下面的例子:
public class DotNew{
public class Inner{
}
public static void main(String[] args){
DotNew dn =new DotNew();
DotNew.Inner dni=dn.new Inner();
}
}
但是,如果你创建的是嵌套类(静态内部类),那么就不需要外部类对象引用,如下面的例子:
package innerclassdotnew;
public class InnerDotNew {
InnerDotNew(){ System.out.println("InnerDotNew"); } static class StaticInner{ StaticInner(){ System.out.println("static inner class"); } } class Inner{ Inner(){ System.out.println("normal Inner class"); } } public static void main(String[] args){ InnerDotNew idn=new InnerDotNew(); InnerDotNew.Inner dnInner=idn.new Inner(); /*compile error: No enclosing instance of type InnerDotNew is accessible. Must qualify the allocation with an enclosing instance of type InnerDotNew (e.g. x.new A() where x is an instance of InnerDotNew).*/ //InnerDotNew.Inner dnInner=new Inner(); InnerDotNew.StaticInner staticInner =new StaticInner(); }
}
/*output/
InnerDotNew
normal Inner class
static inner class
相关文章推荐
- 上传一张或多张图片(使用volley框架)
- 把逗号分隔的列拆成多行 cross APPLY
- java byte 字节负数
- Win+R命令大全
- socket编程报异常java.io.EOFException
- Esper系列(十二)Variables and Constants
- 页面缓存
- android 进程自杀再重启的方法
- NodeJS使用Express框架处理客户端POST请求
- iOS系列UI篇——UIImageView
- 深入浅出 RPC - 浅出篇
- 深入浅出 RPC - 浅出篇
- 深入浅出 RPC - 浅出篇
- 深入浅出 RPC - 浅出篇
- 深入浅出 RPC - 浅出篇
- Android应用Design Support Library完全使用实例
- 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。
- 关于webdriver上传文件功能的一些补充
- 静态表查找--顺序表的查找(有序)--折半查找
- Java单例设计模式