Вопрос о полиморфизме и перегрузке - PullRequest
3 голосов
/ 21 октября 2010

Я пытаюсь понять понятия полиморфизма и перегрузки. У меня есть следующий код в качестве эксперимента. Однако я не могу понять, почему эта программа не запускается (происходит сбой из-за того, что mobj.foo(str). mobj определяется с использованием полиморфизма, и из того, что я могу собрать, должно быть типа MyDerivedClass. Если это правда, хотя не будет ли эта строка работать нормально?

Почему эта строка недействительна?

class MyBaseClass {
  protected int val;
  public MyBaseClass() { val = 1; }
  public void foo() { val += 2; }
  public void foo(int i) { val += 3; }
  public int getVal() { return val; }
}

class MyDerivedClass extends MyBaseClass {
  public MyDerivedClass () { val = 4; }
  public void foo() { val += 5; }
  public void foo(String str) { val += 6; }
}

class Test {
  public static void main(String[] args)
  {
    MyBaseClass mobj = new MyDerivedClass();
    String str = new String("hello");
    mobj.foo();
    mobj.foo(str);
    mobj.foo(4);
    System.out.println("val = " + mobj.getVal());
  }
}

Ответы [ 3 ]

7 голосов
/ 21 октября 2010

сбой из-за

 MyBaseClass mobj = new MyDerivedClass();

Вы сказали компилятору, что mobj - это MyBaseClass, поэтому он не знает, что существует метод foo (String).

Подобные вещи решаются во время выполнения.

3 голосов
/ 21 октября 2010

Полиморфизм работает только тогда, когда вы переопределяете метод, который родительский объект уже определил, что не имеет место с mobj.foo(str). MyBaseClass не реализует класс с подписью foo(String). Таким образом, foo(String), реализованный в MyDerivedClass, ничего не отменяет. Помните, что Java различает методы по имени и параметрам.

2 голосов
/ 21 октября 2010

mobj - это экземпляр MyDerivedClass, но типа MyBaseClass.Таким образом, вы можете вызывать только методы, определенные для MyBaseClass на mobj.Вот почему mobj.foo(str) терпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...