匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
    匿名内部类实际上都是父类引用指向子类的实现
    匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口。但是不能两者兼备。如果实现接口也只能实现一个接口

    image.png
    —-这两个例子效果一样—-
    image.png
    创建一个继承自Contents的匿名类的对象,通过new表达式返回的引用被自动向上转型为对Contents的引用。

    1. class Wrapping {
    2. private int i =13 ;
    3. public Wrapping(int x){
    4. i = x;
    5. }
    6. public int value(){
    7. return i;
    8. }
    9. }
    10. public class Parcel8 {
    11. public Wrapping wrapping(int x) {
    12. return new Wrapping(x)
    13. {
    14. public int value() {
    15. return super.value() * 10;
    16. }
    17. };
    18. }
    19. public void f(Wrapping wrapping) {
    20. wrapping.value();
    21. }
    22. public static void main(String[] args) {
    23. Parcel8 p8 = new Parcel8();
    24. Wrapping w = p8.wrapping(10);
    25. p8.f(new Wrapping(5)
    26. {
    27. @Override
    28. public int value() {
    29. return super.value();
    30. }
    31. });
    32. }
    33. }
    1. public class Parcel9 {
    2. public Destination destination( final String dest){ //要求参数引用是final的
    3. return new Destination()
    4. {
    5. private String label = dest;
    6. @Override
    7. public String realLabel() {
    8. return label;
    9. }
    10. };
    11. }
    12. public static void main(String[] args) {
    13. Parcel9 p9 = new Parcel9();
    14. Destination d = p9.destination("dsada");
    15. }
    16. }

    匿名类中不可能有命名的构造器(因为它根本没有名字),但是通过实例初始化,就能够达到为匿名内部类创建一个构造器的效果

    1. abstract class Base {
    2. public Base(int i) {
    3. print("Base 构造器, i = " + i);
    4. }
    5. public abstract void f();
    6. }
    7. public class AnonymousConstructor {
    8. public static Base getBase( int i) {
    9. return new Base(i) {
    10. //此处的实例初始化,相当与这个匿名内部类的构造器
    11. //但它其实不需要构造器的
    12. {
    13. print("内部实例初始值设定项");
    14. }
    15. @Override
    16. public void f() {
    17. print("In anonymous f()");
    18. }
    19. };
    20. }
    21. public static void main(String[] args) {
    22. Base base = getBase(47);
    23. base.f();
    24. }
    25. }