java 内部类
Posted wbyixx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 内部类相关的知识,希望对你有一定的参考价值。
内部类
顾名思义,内部类就是在内部定义的类
内部类将类置于其他类的内部。看起来像一种代码隐藏机制。
内部类了解外围类,并能与之通信。
用内部类写出的代码更加优雅而清晰。
创建内部类
直接在类里面写类的定义即可
内部类的访问特点
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
外部类名.内部类名 对象名 = 外部类对象.内部类对象
链接到外部对象
当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,
所以它能访问其外围对象的所有成员,而不需要任何特殊条件。
此外,内部类还拥有其外围类的所有元素的访问权。
当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。
然后,在访问外围类成员时,就是用那个引用来选择外围类的成员。
内部类的对象只能在与其外围类的对象相关联的情况下才能被创建。
构建内部类对象时,需要一个指向外围类对象的引用。
.this与.new
如果需要生成对外部类对象的引用,可以使用外部类名字后面紧跟圆点和this。
如果想告知某些其它对象,去创建其某个内部类的对象。可以使用其他外部类对的引用根圆点和new
在拥有外部类对象之前是不可能创建内部类对象的。
因为内部类对象会暗暗地连接到它的外部类对象上。
但是如果全是嵌套类(静态内部类),那就不需要对外部类对象的引用。
内部类与向上转型
当将内部类向上转型为其基类,尤其是转型为一个接口的时候,内部类很有用。
从实现了某个接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。
这是因为此内部类---某个接口的实现---能够完全不可见,并且不可用。
所得到的只是指向基类或接口的引用,所以能够很方便地隐藏实现细节。
当取得了一个指向基类或接口的引用时,甚至可能无法找出它的确切的类型。
private内部类可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节。
从客户端程序员的角度来看,由于不能访问任何新增加的、原本不属于公共接口的方法,
所以扩展接口是没有价值的。这也给java编译器提供了生成更搞笑代码的机会。
在方法和作用域内的内部类
如果实现了某类型的接口,于是可以创建并返回对其的引用
要解决一个复杂的问题,想创建一个类来辅助解决,但又不希望这个类是可共用的。
一个定义在方法中的类
一个定义在作用域中的类,此作用域在方法的内部
一个实现了接口的匿名类
一个匿名类,它扩展了有非默认构造器的类
一个匿名类,它执行字段初始化
一个匿名类,它通过实例初始化实现构造(匿名类不可能有构造器)
匿名内部类
匿名内部类是局部内部类的一种,是一种简化的写法。
前提是存在一个类或者接口。这里的类可以是具体类也可以是抽象类
本质是一个继承了该类或实现了该接口的子类匿名对象
嵌套类
如果不需要内部类对象与其外围类对象之间有联系,可以将内部类声明为static。
这样的内部类称为嵌套类。
当内部类是static时:
要创建嵌套类的对象,并不需要外围类的对象
不能从嵌套类对象中访问非静态的外围类对象
普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类,
但是嵌套类可以包含以上的东西。
嵌套类不保留外部类的this引用,类似一个static方法
嵌套类可以作为接口的一部分。
内部类的继承
内部类可以被覆盖吗
局部内部类
内部类标识符
以上是关于java 内部类的主要内容,如果未能解决你的问题,请参考以下文章