User라는 클래스를 만든 다음 Employee
라는 User를 확장하는 하위 클래스를 만드는 시나리오를 생각해 보세요.
일반적으로 다음을 사용하여 사용자 인스턴스를 만듭니다.
User user = new User();
여기서 User는 변수 user의 유형이고, user는 클래스의 인스턴스를 보유하는 변수이며, new User()는 User의 새 인스턴스를 생성합니다.
간단히 말해서 사용자는 User의 인스턴스입니다.
그러나 슈퍼클래스 User가 하위 클래스 Employee에 정의된 메서드를 사용해야 한다면 어떻게 될까요? 이런 일이 일어날 수 있나요?
짧은 대답은 예이지만 재정의된 메서드(수퍼클래스와 하위 클래스 모두에 존재하는 메서드)에만 해당됩니다. 이것이 다형성을 가능하게 하는 것입니다.
상속 관계는 "is-a" 관계이므로 직원은 사용자입니다. 따라서 호환되는 유형인 한 User가 하위 클래스 Employee의 인스턴스에 대한 참조를 보유하는 것을 방해하는 것은 없습니다.
이 작업은 다음과 같이 수행됩니다.
User user = new Employee();
이제 User 클래스에
라는 두 가지 메서드가 있다고 가정해 보겠습니다.Employee 클래스에는 getEmployeeInformation()이라는 추가 메서드가 있고 getUserSalary() 메서드를 재정의합니다.
사용자 user = new Employee();:
user.getUserName()은 User 클래스에 정의된 대로 작동합니다.
user.getUserSalary()도 작동하지만 출력은 User 클래스가 아닌 Employee 클래스의 재정의된 getUserSalary() 메서드에서 출력됩니다. . 이것이 다형성의 본질입니다.
user.getEmployeeInformation()이 작동하지 않습니다. Employee 클래스에만 해당되므로 컴파일 오류가 발생합니다.
컴파일러가 구문 오류, 유형 불일치 또는 성공적인 코드 컴파일을 방해하는 기타 위반과 같은 문제를 발견하면 컴파일 오류가 발생합니다.
역방향을 수행하고 하위 클래스 객체 Employee를 슈퍼클래스 참조 User로 참조하려고 하면 수동 캐스팅 없이는 작동하지 않습니다! User가 반드시 Employee일 필요는 없으므로 명시적인 캐스팅이 필요합니다.
간단한 예를 들어 간단하게 설명한 후 용어에 집중해 보겠습니다.
"하위 클래스 객체에 대한 슈퍼클래스 참조"는 일반적으로 업캐스팅이라고 합니다. 간단히 말해서 업캐스팅은 하위 개체를 상위 개체로 타입 캐스팅하는 것이며 암시적으로 발생합니다(컴파일러가 자동으로 처리하므로 특정 캐스팅 구문이 필요하지 않습니다). User user = new Employee();
를 했던 것과 같습니다.다운캐스팅은 어떻습니까?
다운캐스팅은 업캐스팅과 정반대입니다.
사용자 인스턴스에서 Employee 참조를 생성하는 것이 유효하지 않다고 말했던 것을 기억하시나요? 이를 다운캐스팅이라고 하며 캐스팅 구문을 사용하여 명시적으로 수행해야 합니다. 업캐스팅은 매우 안전하지만 다운캐스팅은 위험을 초래합니다. 이는 유용하지 않다는 의미는 아니지만 주의해서 사용해야 합니다.
이 기사는 업캐스팅에 중점을 두고 있기 때문에 다운캐스팅에 대해 너무 자세히 설명하지는 않겠습니다. 그러나 핵심은 다운캐스팅과 업캐스팅의 주요 차이점을 보여주는 것입니다.
이제 끝났습니다! :)
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3