вызов метода в суперклассе с использованием объекта подкласса, как это работает?

class SuperClass{  
  public void print(){
    System.out.println("I'm super class...");
  }  
  public void someMethod(){
    System.out.println("any thing");
  }
}  

class SubClass extends SuperClass{ 
  @Override
  public void print(){
    System.out.println("I'm sub class...");
  }  

  public static void main(String args[]){  
    SuperClass a=new SubClass(); 
    a.print();  
    a.someMethod();
  }  
}  

a.print() известный как динамическое связывание, и он знает, какой метод вызывать во время выполнения и выбирать метод подкласса, потому что объект является подклассом, это правда?

a.someMethod() как JVM справляется с этим методом, он не в подклассе, а объект из подкласса?


person Android AL-Khatib    schedule 15.10.2016    source источник


Ответы (3)


a.print() является примером переопределения метода, который является полиморфизм времени выполнения. То есть во время выполнения он решает, вызывать ли метод подкласса или метод суперкласса (здесь ваш метод SubClass вызывается, поскольку он переопределен и соответствует сигнатуре параметра).

В случае вызова someMethod() вы не определили его в своем подклассе. Это означает, что ваш SubClass автоматически получил someMethod(), когда вы унаследовали его от Superclass, поскольку он public. Говоря простыми словами, SubClass также имеет определение someMethod(). Вот как JVM узнала, какой метод вызывать.

Также в SuperClass a переменная 'a' будет храниться в стеке, тогда как ссылка будет храниться в куче. Вы построили ссылку, используя конструктор SubClass. Это означает, что переменная «a» в стеке относится к объекту «SubClass» в куче. Вот почему «а» может вызывать someMethod

person Rishabh Kumar    schedule 15.10.2016
comment
почему мы не можем вызвать метод из подкласса, хотя мы создаем объект из подкласса и храним его адрес в переменной суперкласса?? - person Android AL-Khatib; 16.10.2016

Когда вы делаете:

SuperClass a = new SubClass();

Вы говорите, что хотите создать экземпляр SubClass, где вы хотите, чтобы были видны только методы, объявленные в SuperClass. Если бы вы объявили какие-либо новые методы в SubClass, они не были бы видны.

Объект по-прежнему будет использовать реализации SubClass, когда это возможно (т. е. когда вы их переопределяете). Методы, которые не были переопределены, будут использовать унаследованную реализацию.

person 4castle    schedule 15.10.2016

"вызов метода в суперклассе с использованием объекта подкласса" является одним из сценариев полиморфизма на Java.

Если подкласс реализует метод с тем же определением, что и у суперкласса, вызов метода с объектом подкласса переопределит метод суперкласса методом подкласса.

Следовательно, если вы хотите вызвать метод суперкласса с объектом подкласса, не переопределяйте метод.

SuperClass a=new SubClass();

Это определение делает "a" способным ссылаться на тип SuperClass или любой подкласс, который расширяет SuperClass. Поскольку объект «а» создается из подкласса, по определению объект может обращаться к методам подкласса и суперкласса. Это объяснение должно ответить на оба ваших вопроса.

См. документацию по Java здесь.

person Mallikarjun M    schedule 04.04.2017