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); }}
