标签:
可以将一个类的定义放在另一个类的定义内部,这就是内部类。如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须像在
main()
方法中那样,具体的指明这个对象的类型:OuterClassName.InnerClassName
return OuterClassNeme.this;
OuterClass oc = new OuterClass();
OuterClass.InnerClass ic = oc.new InnerClass();
从类的设计角度看,private内部类给类的设计者提供了一种途径,通过这样的方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了实现的细节。因为打当内部类向上转型成其基类,尤其是转型成一个接口的时候,内部类阻止了了客户端在使用过程中将对象向下转型,因为不知道其名字。
public class Parcel7b{
class MyContents implements Contents{
private int i = 11;
public int value() {return i;}
}
public Contents contents(){return new MyContents;}
public static void main(String[] args){
Parcel7b p = new Parcel7();
Contents c = p.Contents();
}
}
上述内部类的声明方式如果转化成匿名内部类就是下面这个样子.
public class Parcel7{
public Contests contents(){
return new Contents(){
private int i = 11;
public int value(){return i;}
};
}
public static void main(String[] args){
Parcel7 p = new Parcel7();
Contents c = p.Contents();
}
}
看起来就是这个样子的:在你想创建一个对象的时候,插入了这个对象对应的类定义方式。
Thread t = new Thread() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
t.start();
这种属性对于多重继承来说,无疑是一种神器。
不只对于接口,假设你想继承两个或者三个类,外部类只能继承一个,剩下的而就可以交给内部类来实现,因为内部类可以持有外部类的引用,所以可以使用继承到的方法来操作外部类的数据,也就是说实现了多重继承。在《Thinking in Java》中举了一个通过内部类实现继承迭代器的方式。见P192
最后放一个简单的例子:
abstract class InnerAny{
abstract void out();
}
public class Outer{
private int i = 0;
class Inner{
int i = 8;
public void out(){
System.out.println(this.i);
System.out.println(Outer.this.i);
}
}
static class InnerStaic{
static int i = 1;
public InnerStaic(Outer p){
i = p.i;
}
}
public InnerAny ia(){
return new InnerAny(){
public void out(){
Outer.this.i++;
System.out.println(Outer.this.i);
}
};
}
public static void main(String[] args){
Outer p = new Outer();
System.out.println(p.i);
//普通内部类
Outer.Inner in = p.new Inner();
in.out();
p.i++;
//静态内部类
InnerStaic is = new InnerStaic(p);
System.out.println(is.i);
p.i++;
System.out.println(Outer.InnerStaic.i);
in.out();
//匿名内部类
InnerAny ia = p.ia();
ia.out();
}
}
输出是:0 8 0 1 1 8 2 3
标签:
原文地址:http://www.cnblogs.com/yueyanglou/p/5489951.html