2013-06-10 2 views
1

интересно, как можно вызвать общедоступный метод m?Как вызвать метод, определенный при создании объекта?

public class Test1 { 

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

Это звучит как вы злоупотребляете анонимными классами. – SLaks

+0

@DanW: 'test.m()' не будет работать. –

+1

'Test1 test = new Test1() { public Test1 m() { System.out.println (" m "); return new Test1(); } } .m(); ' – Lion

ответ

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

You can't define an anonymous class constructor, так что последний использует конструктор SubTest1 класса и абстрактного метода.

1

Вы не можете непосредственно вызывать m поскольку test имеет тип Test1, который не содержит метод, называемый m, но вы никогда не должны найти себя в такой ситуации, как это. Весь смысл анонимных классов заключается в изменении некоторого уже существующего аспекта функциональности базового класса, поэтому добавление новых методов не имеет смысла. Подумайте о переосмыслении вашего дизайна или использовании именованного класса.

Конечно, если вы не будете заботиться о test в будущем вы могли бы сделать это:

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

Хотя вы редко хотите сделать что-то подобное, то это может быть полезно, если вы работаете с Thread или Runnable и необходимо вызвать метод run.

0

Если Test1 был метод, называемый «м» вы можете просто позвонить 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 
Смежные вопросы