匿名类不允许在java中使用额外的方法(未在超类中实现)

pin*_*iny 0 java

在 java 教程 ( https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html ) 中,我读到在匿名类中您可以创建未在超类中实现的方法。但我尝试了以下方法,但不起作用:

class Superclass {
}

class Anonymous {
    public void start() {
        Superclass obj = new Superclass() {
            public void myMethod() {
                System.out.println("hello world");
            }
        };

        obj.myMethod();
    }
}

class Main {
    public static void main(String[] args) {
        Anonymous obj = new Anonymous();
        obj.start();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果可能,任何人都可以解释我做错了什么,感谢您的时间。

And*_*eas 5

您可以在匿名类中创建一个新方法,但由于匿名类之外的代码甚至无法知道该方法,因此您无法从外部调用它。

但是,您可以从内部调用它。

abstract class Superclass {
    public abstract void doStuff();
}

class Anonymous {
    public void start() {
        Superclass obj = new Superclass() {
            @Override
            public void doStuff() {
                myMethod();
            }
            public void myMethod() {
                System.out.println("hello world");
            }
        };

        obj.doStuff(); // prints: hello world
    }
}
Run Code Online (Sandbox Code Playgroud)

进一步解释一下,匿名类就像一个未命名的本地类。

public void start() {
    class $1 extends Superclass {
        @Override
        public void doStuff() {
            myMethod();
        }
        public void myMethod() {
            System.out.println("hello world");
        }
    };
    Superclass obj = new $1();

    obj.doStuff(); // prints: hello world
}
Run Code Online (Sandbox Code Playgroud)

如您所见,由于obj是 a Superclass,而不是 a $1,您不能调用myMethod(),也不能声明obj$1类,因为当它是匿名的时,它没有名称1

1) 在内部,匿名类具有名称,例如类似Anonymous$1的名称,即外部类的名称、美元符号和数字。您可以在编译器生成的.class文件中看到这些名称。但是你不能用这些名字写代码。