Как виртуальные функции работают на Java?
Кодирующие интервьюеры любят этот вопрос. Да. Хотя Java не имеет виртуального ключевого слова, Java имеет виртуальные функции, и вы можете их написать.
В объектно-ориентированном программировании виртуальная функция или виртуальный метод - это функция или метод, поведение которых может быть переопределено внутри наследующего класса функцией с той же сигнатурой. Эта концепция является очень важной частью части полиморфизма объектно-ориентированного программирования (ООП).
Задавая архитектурный вопрос об определенном языке, подобном этому, требуются большие коммуникативные навыки и глубокое овладение базовыми принципами компилятора Java, в частности интерфейсы, абстрактные классы и то, как наследование работает.
Направляйте интервьюера на конкретный пример виртуальной функции.
Да, вы можете писать виртуальные функции в Java с интерфейсами.
Методы интерфейса Java - все это «чисто виртуальные», потому что они предназначены для переопределения. Например:
interface Bicycle { //the function applyBrakes() is virtual because
void applyBrakes(); //functions in interfaces are designed to be
} //overridden.
class ACMEBicycle implements Bicycle {
public void applyBrakes(){ //Here we implementing applyBrakes()
System.out.println("Brakes applied"); //function, proving it is virtual.
}
}
Да, вы можете писать виртуальные функции в Java с абстрактными классами.
Java Абстрактные классы содержат неявно «виртуальные» методы, реализуемые классами, расширяющими его. Например:
abstract class Dog {
final void bark() { //bark() is not virtual because it is
System.out.println("woof"); //final and if you tried to override it
} //you would get a compile time error.
abstract void jump(); //jump() is a virtual function because it
} //is part of an abstract class and isn't
//final.
class MyDog extends Dog{
void jump(){
System.out.println("boing"); //here jump() is being overridden, a
} //demonstration that it is virtual.
}
public class Runner {
public static void main(String[] args) {
MyDog myDog = new MyDog(); //instantiating myDog
myDog.jump(); //calling the overridden function jump()
}
}
Вы можете заставить функцию НЕ быть виртуальной в родовом классе, сделав ее final
Например:
class myJavaFoobarClass {
final boolean giveMeTrueFunction() //this Java function is NOT virtual
{ //because final keyword prevents this
return true; //function from being modified in a
} //subclass.
boolean isItRainingFunction() //this Java function IS virtual because
{ //without the final keyword, the function
return false; //can be overridden in a subclass.
}
}