首页 > 解决方案 > 在 Java 中覆盖匿名类的方法

问题描述

在下面的示例中(在注释块中),我试图覆盖jump()匿名类的方法,但是出现编译错误。有人可以帮我理解这里有什么问题吗?

class Animal {
    public void bark() {
        System.out.println("Inside bark");
    }

    public void jump() {
        System.out.println("Inside jump");
    }
}

public class AnonymousClassExample001 {
    public static void main(String[] args) {
        Animal animal = new Animal() {
            public void bark() {
                System.out.println("Subclass bark");
            }
        }; /* {
            public void jump() {
                System.out.println("Subclass jump");
            }
        };*/

        /**
        * Question is: Why can't we override by extending an anonymous class
        * as attempted (and commented) above?
        * */
        animal.bark(); // Subclass bark
        animal.jump(); // Trying to print "Subclass jump", by overriding (the subclass of Animal) above
    }
}

编辑: 这是我在 IDE 中遇到的编译错误 - ';' expected.

从评论来看,似乎有些人没有得到我的问题。通过上面的例子,我想了解我们是否可以覆盖匿名类的方法?.

{}再一次,主要动机是了解(并理解)为什么 Java 编译器允许通过开始一个后跟 的块来创建匿名类new Animal(),并且不允许进一步的相同行为(链接{}块以允许创建更多子类)

在此处输入图像描述

标签: javaanonymous-class

解决方案


不要结束并重新启动块,在一个块中覆盖这两种方法,就像在常规子类中一样:

class AnonymousClassExample001 {
    public static void main(String[] args) {
        Animal animal = new Animal() {
            @Override
            public void bark() {
                System.out.println("Subclass bark");
            }
            @Override
            public void jump() {
                System.out.println("Subclass jump");
            }
        };

        animal.bark(); // Subclass bark
        animal.jump(); // Subclass jump
    }
}

更新

对问题的更新说您正在尝试对匿名类进行子类化,例如您正在尝试这样做:

class AnonymousClassExample001 {
    public static void main(String[] args) {
        Animal barkingAnimal = new Animal() {
            @Override
            public void bark() {
                System.out.println("Subclass bark");
            }
        };
        Animal jumpingAnimal = <subclass barkingAnimal> { // Can't be done
            @Override
            public void jump() {
                System.out.println("Subclass jump");
            }
        };

        barkingAnimal.bark(); // Subclass bark
        barkingAnimal.jump(); // Inside jump

        jumpingAnimal.bark(); // Subclass bark
        jumpingAnimal.jump(); // Subclass jump
    }
}

您不能这样做,因为无法将未命名的匿名类标识为基类。但是,您可以使用local classes来做到这一点,就像命名的匿名类一样,这听起来很矛盾:

class AnonymousClassExample001 {
    public static void main(String[] args) {
        class BarkingAnimal extends Animal {
            @Override
            public void bark() {
                System.out.println("Subclass bark");
            }
        };
        class JumpingAnimal extends BarkingAnimal {
            @Override
            public void jump() {
                System.out.println("Subclass jump");
            }
        };
        Animal barkingAnimal = new BarkingAnimal();
        Animal jumpingAnimal = new JumpingAnimal();

        barkingAnimal.bark(); // Subclass bark
        barkingAnimal.jump(); // Inside jump

        jumpingAnimal.bark(); // Subclass bark
        jumpingAnimal.jump(); // Subclass jump
    }
}

或者,jumpingAnimal也可以使用匿名类语法而不是本地类语法来完成。


推荐阅读