실행 시간에 메소드 호출이 발생할 때, 실제 객체의 타입에 따라 해당 메소드가 결정되는 것을 말한다.
Animal a = new Dog();
Dog d = new Dog();
Animal ani;
ani = d;
ani.eat(); // "개처럼 먹다"
// ani.bark(); error
Java에서는
컴파일 시간에는 변수의 타입에 따라 컴파일러가 어떤 멤버에 접근할 수 있는지 결정한다.a는 컴파일 시간에 Animal 클래스의 변수이므로 bark() 메소드에 접근할 수 없다.실행 시간에는 실제 객체의 타입에 따라 해당 멤버에 접근한다. ---> 동적 바인딩과 관련이 있다.a는 실행 시간에서 실제 객체가 Dog임이 파악되었으므로 eat() 메소드는 "개처럼 먹다"를 출력한다.자식 클래스에서 부모 클래스의 정적 멤버에 접근할 수 있으며, 이는 부모 클래스명을 사용하여 접근할 수도 있고, 더 간단하게 자식 클래스명을 사용하여 접근할 수도 있다.
하지만 정적(static) 멤버는 상속될 수 있지만 오버라이딩될 수는 없으므로 동적 바인딩과 관련이 없다. 자식 클래스에서 동일한 이름의 정적 멤버를 선언하더라도 부모 클래스의 정적 멤버를 오버라이딩하는 것이 아니라, 완전히 새로운 정적 멤버가 생성되는 것이다.
정적(static) 멤버들은 클래스가 로드될 때 메모리에 할당되어야 하므로, 정적(static) 로딩에 의해 메모리에 올려진다. 따라서 자식 클래스를 통해 부모의 정적(static) 멤버들을 접근하게 되면, 자식 클래스의 정적 멤버들과 부모 클래스의 정적 멤버들이 모두 메모리에 로딩되며 멤버들은 모두 Method Area(메서드 영역)에 올라가게 된다.
