如何在对象实例化时调用定义的方法?

时间:2013-06-10 20:56:55

标签: java

想知道如何调用public m方法?

public class Test1 {

    public static void main(String[] args) {
        Test1 test = new Test1() {
            public void m() {
                System.out.println("m");
            }
        };
    }
}

3 个答案:

答案 0 :(得分:2)

我不相信你可以。您必须创建一个接口或子类。 (好吧,好吧,那可能不是真的。你可以用反射来做。)

,就像这样(建造后通过test.m()称呼它):

public class Test1 {

    public static void main(String[] args) {
        SubTest1 test = new SubTest1() {
            public void m() {
                System.out.println("m");
            }
        };
        test.m();
    }

    private static abstract class SubTest1 extends Test1 {
        public abstract void m();
    }
}

或者像这样,在施工过程中发生的地方:

public class Test1 {

    public static void main(String[] args) {
        SubTest1 test = new SubTest1() {
            public void m() {
                System.out.println("m");
            }
        };
    }

    private static abstract class SubTest1 extends Test1 {
        public SubTest1() {
            this.m();
        }

        public abstract void m();
    }
}

can't define an anonymous class constructor,以便最后使用SubTest1类的构造函数和抽象方法。

答案 1 :(得分:1)

您无法直接调用m,因为test的类型为Test1且不包含名为m的方法,但您永远不会发现自己处于这种情况。匿名类的重点是改变基类功能的一些已经存在的方面,因此添加 new 方法毫无意义。请考虑重新考虑您的设计或使用命名类。

当然,如果您将来不关心test,您可以这样做:

new Test1() {
    public void m() {
        System.out.println("m");
    }
}.m();

虽然您很少想要这样做,但如果您使用ThreadRunnable并需要调用run方法,则可能会有用。

答案 2 :(得分:0)

如果Test1有一个名为“m”的方法,你可以在实例化内部类之后调用test.m():

public class Test1 {

    public static void main(String[] args) {
        Test1 test = new Test1() {
            public void m() {
                System.out.println("New Behavior");
            }
        };
        test.m();
    }

    public void m() {
       System.out.println ("Default Behavior");
    }
}

运行它会输出:

New Behavior