상속
이전 학습에서 상속이 여러 번 언급 된 것을 보았습니다. Java 언어에서 클래스는 다른 클래스에서 파생 될 수 있으므로 해당 클래스의 필드와 메서드를 상속 할 수 있습니다.
슈퍼 클래스가없는
Object
를 제외하고 모든 클래스에는 단 하나의 직접 수퍼 클래스 (단일 상속). 다른 명시 적 슈퍼 클래스가없는 경우 모든 클래스는 암시 적으로 Object
의 하위 클래스입니다. 클래스는 클래스에서 파생 된 클래스에서 파생 된 클래스에서 파생 될 수 있습니다. 그리고 궁극적으로 최상위 클래스 인
Object
에서 파생됩니다. 이러한 클래스는 Object
까지 확장되는 상속 체인의 모든 클래스의 후손이라고합니다. 상속의 개념은 간단하지만 강력합니다. 새 클래스를 만들고 싶고 원하는 코드가 이미 포함 된 클래스가있는 경우 기존 클래스에서 새 클래스를 파생 할 수 있습니다. . 이렇게하면 기존 클래스의 필드와 메서드를 직접 작성 (및 디버그!)하지 않고도 재사용 할 수 있습니다.
하위 클래스는 다음에서 모든 멤버 (필드, 메서드 및 중첩 클래스)를 상속합니다. 그 수퍼 클래스. 생성자는 멤버가 아니므로 하위 클래스에서 상속되지 않지만 수퍼 클래스의 생성자는 하위 클래스에서 호출 할 수 있습니다.
Java 플랫폼 클래스 계층
iv id = java.lang
패키지에 정의 된 “e946c849b8″>
클래스는 작성한 클래스를 포함하여 모든 클래스에 공통적 인 동작을 정의하고 구현합니다. Java 플랫폼에서 많은 클래스는 Object
에서 직접 파생되고 다른 클래스는 이러한 클래스 중 일부에서 파생되는 식으로 클래스 계층을 형성합니다.
Java 플랫폼의 모든 클래스는 객체의 자손입니다.
계층 구조의 맨 위에있는 Object
는 모든 클래스 중에서 가장 일반적입니다. 계층 구조의 맨 아래에있는 클래스는보다 특수한 동작을 제공합니다.
상속의 예
다음은 Bicycle
클래스 :
iv id = “5010a393ca의 하위 클래스 인 MountainBike
클래스에 대한 클래스 선언 “>
는 다음과 같습니다.
public class MountainBike extends Bicycle { // the MountainBike subclass adds one field public int seatHeight; // the MountainBike subclass has one constructor public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) { super(startCadence, startSpeed, startGear); seatHeight = startHeight; } // the MountainBike subclass adds one method public void setHeight(int newValue) { seatHeight = newValue; } }
MountainBike
상속 Bicycle
의 모든 필드와 메서드를 추가하고 seatHeight
필드와이를 설정하는 메서드를 추가합니다. 생성자를 제외하고는 4 개의 필드와 5 개의 메서드를 사용하여 완전히 처음부터 새로운 MountainBike
클래스를 작성한 것과 같습니다. 그러나 모든 작업을 수행 할 필요는 없습니다. Bicycle
클래스의 메서드가 복잡하고 디버깅하는 데 상당한 시간이 걸린 경우 특히 유용합니다.
하위 클래스에서 수행 할 수있는 작업
하위 클래스는 하위 클래스가 어떤 패키지에 있든 상관없이 부모의 모든 공용 및 보호 멤버를 상속합니다. 하위 클래스가 해당 하위 클래스와 동일한 패키지에있는 경우 또한 부모의 패키지-비공개 구성원을 상속합니다. 상속 된 구성원을 그대로 사용하거나, 바꾸거나, 숨기거나, 새 구성원으로 보완 할 수 있습니다.
- 상속 된 필드는 다른 필드와 마찬가지로 직접 사용할 수 있습니다.
- 수퍼 클래스의 필드와 동일한 이름을 사용하여 하위 클래스의 필드를 선언하여 숨길 수 있습니다 (권장하지 않음).
- 수퍼 클래스에없는 하위 클래스의 새 필드를 선언 할 수 있습니다.
- 상속 된 메서드는 그대로 직접 사용할 수 있습니다.
- 그 하위 클래스 슈퍼 클래스와 동일한 시그니처가 있으므로이를 재정의합니다.
- 슈퍼 클래스에있는 것과 동일한 시그니처를 가진 새 정적 메서드를 하위 클래스에 작성하여 숨길 수 있습니다.
- li>
- 수퍼 클래스에없는 하위 클래스에서 새 메서드를 선언 할 수 있습니다.
- 암시 적으로 또는
super
.
이 강의의 다음 섹션에서는 이러한 주제에 대해 확장합니다.
슈퍼 클래스의 비공개 회원
하위 클래스는 부모 클래스의 private
멤버를 상속하지 않습니다. 그러나 슈퍼 클래스에 private 필드에 액세스하기위한 public 또는 protected 메서드가있는 경우 하위 클래스에서도 사용할 수 있습니다.
중첩 된 클래스는 필드와 메서드 모두 포함하는 클래스의 모든 private 멤버에 액세스 할 수 있습니다. 따라서 하위 클래스에 의해 상속 된 공용 또는 보호 중첩 클래스는 슈퍼 클래스의 모든 개인 멤버에 간접적으로 액세스 할 수 있습니다.
캐스팅 객체
우리는 개체가 인스턴스화 된 클래스의 데이터 유형입니다. 예를 들어
public MountainBike myBike = new MountainBike();
다음 myBike
는 MountainBike
.
MountainBike
는 Bicycle
및 Object
. 따라서 MountainBike
는 Bicycle
이고 또한 Object
이며 Bicycle
또는 Object
개체가 호출 될 때마다 사용됩니다.
반대가 반드시 사실은 아닙니다. Bicycle
는 MountainBike
일 수 있지만 반드시 그런 것은 아닙니다. 마찬가지로 Object
는 Bicycle
또는 MountainBike
이지만 반드시 그런 것은 아닙니다.
전송은 하나의 개체를 사용하는 것을 보여줍니다. 상속 및 구현에서 허용되는 개체 중에서 다른 유형 대신 유형을 입력합니다. 예를 들어
Object obj = new MountainBike();
그러면 obj
는 둘 다 Object
및 MountainBike
(obj
와 같은 시간에 MountainBike
). 이를 암시 적 캐스팅이라고합니다.
반면에
MountainBike myBike = obj;
obj
가 컴파일러에서 MountainBike
로 알려지지 않았기 때문에 컴파일 타임 오류가 발생합니다. 그러나 명시 적 캐스팅을 통해 MountainBike
를 obj
에 할당하겠다고 컴파일러에 알릴 수 있습니다.
MountainBike myBike = (MountainBike)obj;
이 캐스트는 obj
에 MountainBike
이 할당되었는지 확인하는 런타임 검사를 삽입합니다. 컴파일러가 obj
가 MountainBike
라고 안전하게 가정 할 수 있도록합니다. 런타임시 obj
가 MountainBike
가 아니면 예외가 발생합니다.
instanceof
연산자를 사용하여 특정 개체의 유형에 대한 논리적 테스트. 이것은 부적절한 캐스트로 인한 런타임 오류로부터 당신을 구할 수 있습니다. 예 :
if (obj instanceof MountainBike) { MountainBike myBike = (MountainBike)obj;}
여기에서 instanceof
연산자가 obj
는 MountainBike
를 참조하므로 런타임 예외가 발생하지 않는다는 사실을 알고 캐스트를 만들 수 있습니다.