内部类
总结一下内部类的相关知识点 来自java编程思想 第四版
内部类是什么
把一个类的定义放在另一个类的定义内部,这就是内部类
内部类有什么用处
- 把逻辑相关的类组织在一起
- 控制位于内部的类的可见性
- 内部类可以很方便的与外部类通信,内部类可以使用外部类的所有成员,不需要任何特殊条件,外部类对象创建内部类对象时,内部类对象会获得指向外部类对象的引用,可以认为内部类提供了某种进入外围类的窗口.
- 每个内部类都可以独立地继承一个实现,不管外部类是否已经继承,对内部类都没有影响,可以说是使多重继承的方案变得完整.接口解决了部分问题,而内部类则有效地实现了多重继承.
- 内部类可以有多个实例,每个实例都有自己的状态信息,与外围类状态信息独立.
- 单个外围类可以有多个内部类以不同的方式实现同一接口.
如何使用内部类
内部类有哪些分类
普通内部类
普通内部类里面不能有static数据和static字段,也不能包含静态内部类.
public class A{
public class B{
}
}
静态内部类
创建静态内部类不需要外部类对象,不能从静态内部类中访问其外部对象.静态内部类内可以包含static数据和static字段,静态内部类.
静态内部类可以放在接口中,如果想要创建某些公共代码,使得它们可以被某个接口的所有不同实现所共用,那么使用接口内部的静态内部类会很方便.
public class A{
public static class B{}
}
局部内部类 定义在局部作用域的类,比如方法内部或者if内部
匿名内部类
public class A{
public B getB(){
return new B(){
private int i=1;
public value(){
return i;
}
};
}
}
getB方法将返回值的生成与这个返回值的类的定义结合在一起.这个类是匿名的,没有名字.通过new表达式返回的引用还可以自动向上转型为对基类的引用.书中还介绍了如何在匿名内部类中传入参数,如何传入对象等等.
如何创建内部类对象
创建普通内部类对象
public class A{
public class B{
}
public B to(){
return new B();
}
public static void main(){
A a = new A();
A.B b= A.to();
}
}
不通过方法返回,直接创建时,使用.new()语法
public class A{
public class B{}
public static void main(){
A a = new A();
A.B b = a.new B();
}
}
哪里用到了内部类,如何使用
LinkedList中用到了内部类
- LinkedList的结点Node,迭代器就是用内部类实现
public class LinkedList<E> extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
private class DescendingIterator implements Iterator<E> {
private final ListItr itr = new ListItr(size());
public boolean hasNext() {
return itr.hasPrevious();
}
public E next() {
return itr.previous();
}
public void remove() {
itr.remove();
}
}
}
特殊用法
在内部类内获取外部类的引用
public Class A{
public Class B{
public A returnA(){
return A.this;
//直接外部类名.this
}
}
}