为什么需要内部类?
java内部类有什么好处?为什么需要内部类?
真正的原因是这样的,java中的内部类和接口加在一起,可以解决常被C++程序员抱怨java中存在的一个问题 没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。
(1) 内部成员类(非static内部类)
外部类必须先于内部类实例创建!在外部类的非Static成员函数中可以像普通类一样使用内部成员类,这是因为如果调用了这个成员函数说明外部类一定已经存在实例了。
但是在外部类中的static成员函数中,外部类实例不一定建立了,所以要先建立外部类,然后再建立内部类。对于其他类要访问某个类中的内部类一样,也要先建立外部类
package com.zgd;
public class OutClass {
class InnerClass{
private int x = 0;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
@Override
public String toString() {
return "InnerClass [x=" + x + "]";
}
public InnerClass(int x) {
super();
this.x = x;
}
}
//在外部类的非Static方法中,可以像使用普通类一样使用内部类
public InnerClass getInnerClass(){
InnerClass inner = new InnerClass(2);
return inner;
}
public static void main(String[] args) {
// InnerClass inner3 = new InnerClass(2);
// this is wrong!? 因为要新建内部类实例必须要先建立外部类实例
// 在外部类的static函数中必须使用“外部类.内部类”的形式访问
// 而新建内部类必须通过 "外部类实例.new 内部类()" 方法来实现
OutClass out = new OutClass();
OutClass.InnerClass inner = out.new InnerClass(1);
System.out.println(inner);
// 但是在外部类的非static函数中可以像使用普通类一样使用内部类,因为如果调用了非static成员函数
// 说明外部类肯定已经新建了实例,否则是不可能调用非static成员函数的
OutClass.InnerClass inner2 = out.getInnerClass();
System.out.println(inner2);
}
}
以上内部类的作用仅仅是名字隐藏和组织代码的一种结构和功能,但是内部类还有其他更重要的功能,内部类有外围类所有元素的访问权限,通过指向外部类的指针实现:“外部类名.this”(这一点C++没有)。在新建内部类时,内部类会秘密地获取一个指向外部类的引用,后期可以通过这个引用去访问外围类。
外部类名.this 外部类对象的引用!
System.out.println("Print in inner Outer.index=" + pouter.this.index);
System.out.println("Print in inner Inner.index=" + this.index);
(2)匿名内部类:特别是返回一个接口interface的实例对象时特别有用
Comparator接口便是一个很好的例子,在Collections需要得到最大值时依赖于接口中的compare方法,这样一个临时类的需要产生,用匿名类再方便不过了!
Map.Entry<PhoneNum, String> temp = Collections.max(list, new Comparator<Map.Entry<PhoneNum, String>>() {
@Override
public int compare(Entry<PhoneNum, String> o1,
Entry<PhoneNum, String> o2) {
// TODO Auto-generated method stub
return o1.getKey().getAreaNum() - o2.getKey().getAreaNum();
//return 0;
}
});
(3)嵌套类:如果成员内部类不需要和外部类有联系,可以声明为static,这样的内部类成为嵌套类。
因为嵌套类是static的,所以创建嵌套类时不需要创建外部类;由于是static,可能未创建外部类所以不能引用外部类的非static成员;另外嵌套类中可以包含static数据,而普通内部类由于不是static所以不能包含。而且嵌套类也不再具有指向外围类的指针.this了!
(4)为什么需要内部类???
内部类实现接口和外部类实现接口之间的差别