переопределение метода в Java - PullRequest
4 голосов
/ 09 октября 2009

Как переопределение метода реализовано в Java? В C ++ у нас есть концепция vtable .. как это реализовано внутри Java?

Ответы [ 6 ]

14 голосов
/ 09 октября 2009

Чтобы ответить на вопрос, а именно, как именно переопределение реализовано на виртуальной машине, в доступно программирование для виртуальной машины Java (ссылка на Google Книги).

ВМ будет искать подходящее определение метода в указанном классе, а затем пробираться через стек наследования. Очевидно, что на каком-то этапе будут применены различные оптимизации.

См. здесь для описания соответствующей инструкции байт-кода invokevirtual:

invokevirtual смотрит на дескриптор дано, и определяет сколько аргументов принимает метод (это может быть ноль). Это выскакивает аргументы из стека операндов. следующий он выталкивает objectref из стека. objectref - ссылка на объект чей метод вызывается. invokevirtual извлекает класс Java для objectref, и ищет в списке методов, определенных этим классом и затем его суперклассы, ища метод с именем methodname, чей дескриптор есть дескриптор.

Как gustafc подчеркнул ниже, могут применяться различные оптимизации, и, без сомнения, JIT будет внедряться дальше.

0 голосов
/ 05 августа 2018
--Defining the same method with the same method signature(i.e. same number/type of arguments and same return type/s.)in base and derived class.
--Which method is to be called is decided  at runtime so, it is also called runtime polymorphism/late binding. 
--we should override the method defined in the superclass.
--when the method is called the method defined in the subclass is called and executed instead of the one in superclass.
--we overcome this by use of 'super' keyword.
//program
class A
{
void disp(){
System.out.println("class A");
}

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

}
}
public class ExampleIdea{
public static void main(String[] args){
A a  = new B(); //Parent reference but B class object (we can achieve polymorphism when parent class reference is used to refer a child class object) 
B b = new B();    //B class reference and B class object
A c = new A();
a.disp(); //runs the method in B class 
b.disp();  //runs the method in B class
c.disp();  //runs then method in A class
}
}//end of program

when we run this output will be class B.

In order to access the function of class A we have to use super keyword
as:

 class B extends A
{
public void disp(){
System.out.println("class B");
super.disp();
}
0 голосов
/ 16 декабря 2015

Переопределение метода в Java - это концепция, основанная на полиморфизме OOPS концепция, которая позволяет программисту создавать два метода с одинаковым именем и сигнатура метода на интерфейсе и его различные реализации и фактический метод вызывается во время выполнения в зависимости от типа объекта в во время выполнения. Переопределение метода позволяет писать гибкий и расширяемый код на Java, потому что вы можете ввести новую функциональность с минимальным изменение кода.

Существует несколько правил, которым необходимо следовать при переопределении любого метода в Java, несоблюдение этих правил приводит к ошибке времени компиляции в Java.

  1. Первое и самое важное правило, касающееся переопределения методов в Java, заключается в том, что вы можете переопределять метод только в подклассе. Вы не можете переопределить метод в том же классе.
  2. Второе важное правило переопределения методов в Java: имя и подпись метода должны быть одинаковыми в суперклассе и подклассе или в интерфейсе и его реализации.
  3. Третье правило для метода переопределения в Java заключается в том, что метод переопределения не может уменьшить доступность метода переопределения в Java. Например, если переопределенный метод является общедоступным, переопределенный метод не может быть защищен, частный или частный для пакета; Но верно и то, что переопределенный метод может увеличить доступность метода в Java, т. Е. Если переопределенный метод защищен, то переопределенный метод может быть защищен или общедоступен.
  4. Еще одно заслуживающее внимания правило правила переопределения методов в Java заключается в том, что метод переопределения не может генерировать проверенное исключение, которое выше в иерархии, чем переопределенный метод. Это означает, что если переопределенный метод генерирует IOException, то переопределенный метод не может выбросить java.lang.Exception в своем предложении throws, потому что java.lang.Exception выше, чем IOException в иерархии Exception. Это правило не применяется к RuntimeException в Java, которое даже не нужно объявлять в предложении throws в Java.
  5. Вы не можете переопределить закрытый, статический и финальный метод в Java. Закрытый и статический метод связаны во время компиляции с использованием статического связывания в Java и не разрешаются во время выполнения. Завершающий метод в Java - ошибка времени компиляции. Хотя закрытый и статический метод может быть скрыт, если вы объявите другой метод с таким же и сигнатурой в подклассе.
  6. Переопределенный метод вызывается с использованием динамического связывания в Java во время выполнения в зависимости от типа объекта.
  7. Если вы расширяете абстрактный класс или реализуете интерфейс, вам нужно переопределить весь абстрактный метод, если ваш класс не является абстрактным. абстрактный метод может использоваться только с помощью переопределения метода.
  8. Всегда используйте аннотацию @Override при переопределении метода в Java. Хотя это не правило, а одна из лучших практик Java-программирования. В Java 6 вы также можете использовать аннотацию @Override для метода, унаследованного от интерфейса.
0 голосов
/ 24 января 2015

Переопределение метода Это означает, что в классе supper доступен один метод, который отображает некоторую строку, но вы хотите расширить этот класс, а также вы хотите напечатать свой собственный метод, тогда вам нужно переопределить этот метод в своем локальном классе.
это базовое введение переопределения.

eg.
class Animal
{
  public void displayMessage()
  {
    System.out.println("Animal is eating");
  }

}
class Dog extends Animal
{
  public void displayMessage()
  {
    System.out.println("Dog is eating");
  }
  public static void main(String arg[])
  {
    Dog d=new Dpg();
    d.displayMessage();
  }
}

ВЫХОД:

Собака ушастая

Преимущества переопределения метода в том, что класс ca дает свою собственную конкретную реализацию унаследованному методу без какой-либо модификации метода родительского класса.

Правила переопределения Правил есть.

Список аргументов : список аргументов должен быть таким же.
Модификатор доступа : если вы переопределяете метод, вы должны задать тот же модификатор метода суперкласса, если суперкласс имеет метод public, который вы не можете предоставить защищенному или приватному .... и т. Д.

0 голосов
/ 09 октября 2009

Может быть, это сравнение таблиц C ++ Vtables и Java для вызова методов представляет интерес.

0 голосов
/ 09 октября 2009

Пока функция (метод), которую вы хотите переопределить, не помечена как final, вы просто переопределяете метод, расширяя класс, содержащий этот метод, и затем предоставляете метод с той же сигнатурой, но другим телом. *

...