프로그래밍/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 메소드 또한 오버라이딩이 안되기에 레퍼런스의 종류에 따라 실행할 메소드가 결정된다.