답변:
에서 자바 , 모든 비 정적 방법이 기본적으로 있습니다 " 가상 함수. "는 표시 만 방법 final 키워드 와 함께 무시 될 수없는, 개인 방법 상속되지이다 비가 상 .
예. 실제로 Java의 모든 인스턴스 메소드는 기본적으로 가상입니다. 특정 방법 만 가상이 아닙니다.
여기 몇 가지 예가 있어요.
"정상"가상 기능
다음 예제는 다른 답변에서 언급 된 wikipedia 페이지 의 이전 버전 에서 가져온 것입니다.
import java.util.*;
public class Animal
{
public void eat()
{
System.out.println("I eat like a generic Animal.");
}
public static void main(String[] args)
{
List<Animal> animals = new LinkedList<Animal>();
animals.add(new Animal());
animals.add(new Fish());
animals.add(new Goldfish());
animals.add(new OtherAnimal());
for (Animal currentAnimal : animals)
{
currentAnimal.eat();
}
}
}
class Fish extends Animal
{
@Override
public void eat()
{
System.out.println("I eat like a fish!");
}
}
class Goldfish extends Fish
{
@Override
public void eat()
{
System.out.println("I eat like a goldfish!");
}
}
class OtherAnimal extends Animal {}
산출:
나는 일반적인 동물처럼 먹는다. 나는 물고기처럼 먹는다! 나는 금붕어처럼 먹는다! 나는 일반적인 동물처럼 먹는다.
인터페이스가있는 가상 함수의 예
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 implement applyBrakes()
System.out.println("Brakes applied"); //function
}
}
추상 클래스가있는 가상 함수의 예.
인터페이스와 유사 추상 클래스 는 확장 클래스의 구현에 의존하기 때문에 가상 메소드 를 포함 해야 합니다. 예를 들어 :
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 "pure" virtual function
}
class MyDog extends Dog{
void jump(){
System.out.println("boing"); //here jump() is being overridden
}
}
public class Runner {
public static void main(String[] args) {
Dog dog = new MyDog(); // Create a MyDog and assign to plain Dog variable
dog.jump(); // calling the virtual function.
// MyDog.jump() will be executed
// although the variable is just a plain Dog.
}
}
Java의 모든 기능은 기본적으로 가상입니다.
"final"키워드를 추가하여 비가 상 함수를 작성하는 길을 벗어나야합니다.
이것은 C ++ / C # 기본값과 반대입니다. 클래스 함수는 기본적으로 비 가상적입니다. "가상"수정자를 추가하면됩니다.
개인이 아닌 모든 인스턴스 메소드는 기본적으로 Java에서 가상입니다.
C ++에서 개인용 메소드는 가상 일 수 있습니다. 이것은 비가 상 인터페이스 (NVI) 관용구에 악용 될 수 있습니다. Java에서는 NVI 재정의 가능한 메소드를 보호해야합니다.
Java 언어 사양 v3에서 :
8.4.8.1 인스턴스 메서드로 재정의 클래스 C에서 선언 된 인스턴스 메서드 m1은 클래스 A에서 선언 된 다른 인스턴스 메서드 m2를 재정의합니다.
- C는 A의 서브 클래스입니다.
- m1의 서명은 m2 서명의 하위 서명 (§8.4.2)입니다.
- * m2는 C와 동일한 패키지에서 기본 액세스로 공개, 보호 또는 선언되어 있거나 * m1은 m3, m3과 m1, m3과 m2와 구별되는 m3 메소드를 대체하여 m3이 m2보다 우선합니다.