1、通过查阅http://flowercat.javaeye.com/blog/33371 的内部类blog,匿名类之前的片段,总结内部类的作用
一、隐藏你不想让别人知道的操作,也即封装性。可以在public 类里直接对内部类的创建
二、非静态内部类对象有着指向其外部类对象的引用
意思是非静态内部类直接可以访问内部类的对象、方法、变量
2、匿名内部类
简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
一、内部类的父类构造方法不需要传参
1、父接口
public interface InterfaceClass {
public int getValue();
}
2、子类实现
public class AnonimityClass {
private int value = 1;
public InterfaceClass getInterface(){
return new InterfaceClass(){
private int i = 2;
public int getValue(){
return i*value;
}
};
}
public static void main(String[] arg){
AnonimityClass anonimity = new AnonimityClass();
InterfaceClass interfaceClass = anonimity.getInterface();
System.out.println(interfaceClass.getValue());
}
}
上边的匿名片段就等于
class MyInterfaceClass implements InterfaceClass{
private int i = 2;
public int getValue(){
return i*value;
}
return new MyInterface();
}
二、匿名子类的父类构造方法带参数的例子
1、父类
public class SuperClass {
public SuperClass(int x){
}
public void pint(int i){
System.out.println("superclass" + i);
}
}
2、内部类
public class AnonimitySubClass{
public SuperClass getSuperClass(int x){
return new SuperClass(x){
public void pint(int i){
System.out.print("subClass "+i);
}
};
}
public static void main(String[] arg){
AnonimitySubClass anonimitySubClass = new AnonimitySubClass();
SuperClass sup = anonimitySubClass.getSuperClass(1);
sup.pint(10);
}
}
父类的构造方法有参数int x ,内部匿名类可以在外部类的方法中传参进去并在new SuperClass(x)
传进。
注意:如果匿名内部类用到外部方法传进的参数。外部方法参数就要加final ,如不加编译会暴错
1、父类
public class SuperClass {
public SuperClass(int x){
}
public void pint(int i){
System.out.println("superclass" + i);
}
}
2、实现内部类
public class AnonimitySubClass{
public SuperClass getSuperClass(final int x){
return new SuperClass(x){
public void pint(int i){
System.out.print("subClass "+x);
}
};
}
public static void main(String[] arg){
AnonimitySubClass anonimitySubClass = new AnonimitySubClass();
SuperClass sup = anonimitySubClass.getSuperClass(1);
sup.pint(10);
}
}