상속과 다형성 - 4. 필드와 static 멤버(필드/메소드)의 중복

Ⅳ. 필드와 static 멤버(필드/메소드)의 중복

1. 인스턴스 필드는 오버라이딩이 되지 않음

    ※ 오버라이딩 : 덮어쓰는 기능

 - 서로 다른 메모리를 가지므로 불가능

// Example 인스턴스 필드의 중복
package sample;

class A {
	int m = 3;
}

class B extends A {
	int m = 4;
}

public class Main {	
	public static void main(String[] args) {
		// 1. 객체생성
		A aa = new A();
		B bb = new B();
		A ab = new B();			// 참조 변수에 따라서 결정됨 (A)
		
		// 2. 인스턴스 필드
		System.out.println(aa.m);	// 3		
		System.out.println(bb.m);	// 4
		System.out.println(ab.m);	// 3
	}
}

 

2. static 필드는 오버라이딩이 되지 않음

// Example1 정적(static) 필드의 중복
package sample;

class A {
	static int m = 3;
}

class B {
	static int m = 4;
}

public static void main(String[] ar) {
	// 1. 클래스 이름으로 바로 접근
	System.out.println(A.m);	// 3
	System.out.println(B.m);	// 4
    
	// 2. 객체 생성
	A aa = new A();
	B bb = new B();
	A ab = new B();
    
	// 3. 객체 생성을 통한 static 필드
	System.out.println(aa.m);	// 3
	System.out.println(bb.m);	// 4
	System.out.println(ab.m);	// 3
}

 

// Example2 정적 메소드의 중복
package sample;

class A {
	static void print() {
		System.out.println("A 클래스");
	}
}

class B extends A{
	static void print() {
		System.out.println("B 클래스");
	}
}

public class Main {
	public static void main(String[] args) {
		// 1. 클래스 이름으로 바로 접근
		A.print();		// A 클래스 
		B.print();		// B 클래스
		System.out.println();
		
		// 2. 객체 생성
		A aa = new A();
		B bb = new B();
		A ab = new B();
		
		// 3. 객체를 통한 메소드 호출
		aa.print();		// A 클래스 
		bb.print();		// B 클래스
		ab.print();		// A 클래스 		
	}
}

 

3. 인스턴스 멤버 / static 멤버 오버라이딩 여부 정리