mert inan
mert inan

Reputation: 1597

How to call a method defined while object instantiation?

wondering how it is possible to call public m method?

public class Test1 {

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

Upvotes: 1

Views: 2472

Answers (3)

arshajii
arshajii

Reputation: 129507

You cannot directly invoke m since test is of type Test1 which does not contain a method called m, but you should never find yourself in a situation like this. The whole point of anonymous classes is to alter some already-existent aspect of the base class's functionality, so adding new methods makes no sense. Consider rethinking your design or using a named class instead.

Of course, if you won't care about test in the future you could do this:

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

Although you would rarely want to do something like this, it could be useful if you're working with Thread or Runnable and need to invoke the run method.

Upvotes: 1

bobwienholt
bobwienholt

Reputation: 17610

If Test1 had a method called "m" you could just call test.m() after you instantiated the inner class:

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");
    }
}

Running this would output:

New Behavior

Upvotes: 0

T.J. Crowder
T.J. Crowder

Reputation: 1074305

I don't believe you can. You'd have to create an interface or subclass. (Well, okay, that's probably not true. You could probably do it with reflection.)

E.g., like this (where you call it via test.m() after construction):

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();
    }
}

Or like this, where it happens during construction:

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();
    }
}

You can't define an anonymous class constructor, so that last uses the constructor of the SubTest1 class and the abstract method.

Upvotes: 2

Related Questions