프로그래밍/java

[JAVA] 오버라이딩 출력 테스트 ( +캐스팅 )

승민아 2022. 6. 18. 17:38

업 케스팅 후 오버라이딩 메소드 실행 테스트

클래스 구조

class Person{
	
	void print()
	{
		System.out.println("PERSON");
	}
}

class Student extends Person{
	
	void print()
	{
		System.out.println("STUDENT");
	}
}

 

실행 코드

Student s = new Student();
s.print();
		
Person p = s;
p.print();

 

실행 결과

-> 메소드가 오버라이딩 되어 있다면, 레퍼런스가 무엇이든지 오버라이딩된 메소드를 실행한다. 

 

업 캐스팅 후, 같은 이름의 변수 출력 테스트

구조

class Person{
	
	String name = "PERSON";
	
}

class Student extends Person{
	
	String name = "STUDENT";
	
}

 

실행 코드

Student s = new Student();
System.out.println(s.name);
		
Person p = s;
System.out.println(p.name);

 

실행 결과

-> 객체의 필드는 오버라이딩이 안된다.  그러므로 레퍼런스의 종류에 따라 출력할 변수가 결정된다.

 

(+ 슈퍼 클래스의 레퍼런스로는 서브 클래스의 필드에 접근을 못함.)

s.grade='S';
//p.grade='Z';

 

 

static 필드/메소드는 오버라이딩이 안된다.

 

static 필드 테스트

class Person{
	
	static String name = "PERSON";
	
}

class Student extends Person{
	
	static String name = "STUDENT";
}

public class Test{
	

	public static void main(String[] args) {
	
		Person p = new Student();
		System.out.println(p.name);
		
		Student s = (Student)p;
		System.out.println(s.name);
	}
}

 

실행 결과

-> static 필드 또한 오버라이딩이 안되기에 레퍼런스에 따라 출력할 필드가 결정된다.

 

static 메소드 테스트

class Person{
	
	static void say()
	{
		System.out.println("PERSON");
	}
}

class Student extends Person{
	
	static void say()
	{
		System.out.println("STUDENT");
	}
}

public class Test{
	

	public static void main(String[] args) {
	
		Person p = new Student();
		p.say();
		
		Student s = (Student)p;
		s.say();
	}
}

 

실행 결과

-> static 메소드 또한 오버라이딩이 안되기에 레퍼런스의 종류에 따라 실행할 메소드가 결정된다.