在 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() 来创建匿名类,并且不允许进一步执行相同的行为(链接 {} 块以允许创建更多子类)

enter image description here

解决方法

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

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

你不能这样做,因为未命名匿名类不能被识别为基类。但是,您可以使用本地类来实现,这些类就像命名的匿名类,听起来很矛盾:

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 也可以使用匿名类语法而不是本地类语法来完成。

,

我觉得应该是这样

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