1. 인스턴스 필드의 중복
- 인스턴스 필드는 상속받은 필드와 동일한 이름으로 자식 클래스에서 정의해도 각각의 저장공간에 정의되므로 오버라이딩은 발생하지 않는다.
- 클래스 B는 A를 먼저 상속받은 후 필드를 동일한 이름으로 선언하고, 값을 4로 초기화
class A {
int m =3;
}
class B extends A {
int m = 4;
}
1) A a = new A(); -> a.m =3
- A() 생성자로 선언하고 A타입으로 선언
- 힙 메모리에는 m =3인 필드를 포함하고 있는 객체가 생성
- A 타입으로 선언돼 있으므로 참조변수는 이 A타입의 객체를 가리키고 있음
2) B b = new B(); ->b.m =4
- B()로 B 객체를 생성하는 과정에서 먼저 부모 객체인 A 객체가 먼저 생성
- B 객체 속에는 필드 m의 값 2개 존재
- 부모 클래스에서 만든 필드 m(=3), 자식 클래스에서 만든 필드 m(=4)
- 인스턴스 필드는 이름이 중복되더라도 객체 내의 각각의 공간속에 저장
- 저장 공간이 완벽하게 분리돼 있으므로 오버라이딩 발생X
3) A ab = new B(); -> ab.m=3
- A 타입으로 선언됐기 때문에 A 객체를 가리키고 있음
- A 객체에는 1개의 m값(=3)만 포함하고 있으므로 ab.m =3의 결과가 나타남
2. 정적 필드의 중복
- 정적 필드의 저장 공간은 정적 영역의 클래스 내부에 만들어지고, 모든 객체가 공유
- 정적 필드는 객체를 생성하지 않아도 사용 가능
- 상속할 때 정적 필드명을 중복해 정의해도 저장공간이 분리돼 있으므로 오버라이딩은 발생하지 않음
- 클래스 A는 정적 필드 m=3을 포함하고 있고 ,이를 상속한 클래스 B에서도 동일한 이름의 정적 필드 m=4를 정의
class A {
static int m = 3;
}
class B extends A {
static int m = 4;
}
1) A a = new A(); -> a.m = 3
A.m = 3; //A객체를 생성하지 않고 필드값 지정
A a = new A(); //A 객체를 생성한 후 필드값 지정
a.m=3
- 클래스 영역의 클래스 A 내에 정적필드 m=3의 값이 저장
2) B b = new B(); -> b.m = 4
A.m = 3;
B.m = 4; // A,B 객체를 생성하지 않고 필드값 지정
B b = new B(); //B 객체를 생성한 후 필드값 지정
b.m = 4;
- 클래스 A와 B 내에 포함된 정적 필드의 저장공간은 완벽하게 분리
- 오버라이딩 발생 x
3) A ab = new B(); -> ab.m = 3
A.m = 3; //A,B 객체를 생성하지 않고 필드값 지정
B.m = 4;
A ab = new B(); //B객체를 A타입으로 지정한 후 필드값 지정
ab.m =3;
- A 타입이 가리키는 객체 속의 m값. A.m = 3과 동일한 의미
- 주 클래스의 정적 필드 저장 공간은 완벽히 분리돼 있으므로 오버라이딩 발생 x
3. 정적 메서드의 중복
- 정적 메서드는 각자의 클래스 내부에 존재, 즉 다른 공간에 저장
- 부모 클래스의 정적 메서드는 부모 클래스의 내부, 자식 클래스의 정적 메서드는 자식 클래스의 내부에 저장
- 부모 클래스의 정적 메서드와 동일한 이름으로 자식 클래스에서 정의한다 하더라도 절대 오버라이딩되지 않음
package Overlampmember;
class A {
static void print() {
System.out.println("A 클래스");
}
}
class B extends A {
static void print() {
System.out.println("B클래스");
}
}
public class OVerlapmember1 {
public static void main(String[] args) {
//클래스명으로 바로 접근
A.print();
B.print();
System.out.println();
//객체 생성
A aa = new A();
B bb = new B();
A ab = new B();
//객체를 통한 메서드 호출
aa.print();
bb.print();
ab.print();
}
}
4. 인스턴스 멤버와 정적 멤버의 중복 정리
- 인스턴스 메서드는 객체가 어떤 생성자로 생성됐는지,
- 인스턴스 필드, 정적 필드, 정적 메서드는 어떤 타입으로 선언됐는지가 기준
인스턴스 필드 | 오버라이딩 x |
인스턴스 메서드 | 오버라이딩 o -> 메서드 오버라이딩 |
정적 필드 | 오버라이딩 x |
정적 메서드 | 오버라이딩 x |
'Java > 문법' 카테고리의 다른 글
10 - 6장 최상위 클래스 Object (0) | 2023.06.01 |
---|---|
10 - 5장 super 키워드와 super() 메서드 (0) | 2023.06.01 |
10-3장 메서드 오버라이딩 (0) | 2023.05.04 |
10-2장 객체의 타입 변환 (0) | 2023.05.04 |
10-1장 클래스 상속의 개념과 문법적 특징 (0) | 2023.05.04 |