Вызов метода унаследованного класса из Java - PullRequest
1 голос
/ 28 января 2010

В Python методы класса могут наследоваться. например,

>>> class A:
...  @classmethod
...  def main(cls):
...   return cls()
...
>>> class B(A): pass
...
>>> b=B.main()
>>> b
<__main__.B instance at 0x00A6FA58>

Как бы вы сделали эквивалент в Java? В настоящее время у меня есть:

public class A{
    public void show(){
        System.out.println("A");
    }
    public void run(){
        show();
    }
    public static void main( String[] arg ) {
        new A().run();
    }
}
public class B extends A{
    @Override
    public void show(){
        System.out.println("B");
    }
}

Я бы хотел вызвать B.main () и напечатать «B», но, очевидно, вместо этого он напечатает «A», поскольку «new A ()» жестко закодирован.

Как бы вы изменили «new A ()», чтобы он был параметризован для использования класса, в котором он вызывается, а не для жестко закодированного класса A?

Ответы [ 5 ]

1 голос
/ 28 января 2010

Статические методы в java - это не classmethod s, а staticmethod s. В общем случае невозможно узнать, из какой ссылки на класс был вызван статический метод.

1 голос
/ 28 января 2010

Единственный способ увидеть, как это происходит, - найти то, что вызывает A.main( String[] arg ), и вместо этого изменить на B.main.

B.main:

   public static void main( String[] arg ) {
        new B().run();
    }

Как запускается ваша программа? Есть ли командный файл, ярлык и т. Д.? Что-то, что вы можете изменить? Куда звонят A.main?

1 голос
/ 28 января 2010

В вашем классе B нет метода main, а статические методы не унаследованы.

0 голосов
/ 28 января 2010

В вашем примере я бы не поместил ваш основной метод внутри A. Это настройка как точка входа в систему (вы не можете быть в B, если вы конкретно входите в A).

В приведенном ниже примере я создал класс A, B и C. Класс C создает экземпляры A и B и запускает их. Обратите внимание, что в C я создал A, B и другой A, который я создаю как B. Мой вывод: В B

Надеюсь, это имеет смысл.

public class A { 
public void show(){ 
    System.out.println("A"); 
  } 

public void run(){ 
    show(); 
  }  
} 

public class B extends A { 
 @Override 
 public void show(){ 
    System.out.println("B"); 
    } 
 } 

public class C {
public static void main(String[] args) {
    A a = new A();
    B b = new B();
    A anothera = new B();

    a.show();
    b.show();
    anothera.show();
   }
}
0 голосов
/ 28 января 2010

Я думаю, что это невозможно. И вот почему:

В Java реализация метода определяется типом времени выполнения экземпляра. Итак, чтобы выполнить B.show(), вам нужно иметь экземпляр B. Единственный способ сделать это, если предполагается, что метод, который создает экземпляр, должен наследоваться, - это использовать Class.newInstance() для создания экземпляра типа, который не известен во время выполнения.

Проблема в том, что внутри статического метода у вас нет ссылки на содержащий класс, поэтому вы не знаете, чей newInstance метод вызывать.

Почему вы хотите это сделать? Может быть, есть лучший способ добиться того, чего вы хотите достичь.

...