상속의 특징
단일 상속: 각 하위 클래스에는 최대 하나의 직접 상위 클래스가 있습니다. 간접 상위 클래스의 수는 제한되지 않습니다.
상위 클래스의 개념에 주의하세요: A-->B-->C-->D 여기서 ABC는 D의 상위 클래스이고 C는 D의 직접 상위 클래스이며 AB는 간접 클래스입니다. D의 상위 클래스
상위 클래스와 하위 클래스는 일반적이고 특별한 관계를 가지고 있습니다. 하위 클래스는 상위 클래스를 확장하고 하위 클래스는 특별한 상위 클래스입니다
객체는 모든 클래스의 직접 또는 간접 상위 클래스입니다. ; 클래스를 정의할 때 상위 클래스를 직접 지정하지 않으면 기본적으로 Object 클래스가 상속됩니다.
하위 클래스는 상위 클래스에서 어떤 요소를 상속합니까?
상위 클래스의 생성 메소드를 상속받지 않고 항상 상위 클래스의 생성 메소드를 호출해야 합니다. 메소드
서브클래스는 상위 클래스의 인스턴스 변수와 인스턴스 메소드, 클래스 변수 및 클래스 메소드를 상속합니다. 물론 전제는 private
에 의해 수정되지 않는다는 것입니다. 부모 클래스의 개인적으로 수정된 멤버는 하위 클래스
에 상속되고 부모 클래스에서 final로 수정되는 메서드가 아닙니다. 하위 클래스에 의해 재정의될 수 없습니다.
재정의 메서드
하위 클래스와 부모 클래스는 동일한 메서드 서명을 가지며, 부모 클래스의 메서드를 재정의하는 하위 클래스라고 합니다.
두 개 동일 , 두 개의 작은 것, 하나의 큰 원칙:
두 개 동일: 메소드 이름이 동일, 형식 매개변수 목록이 동일
두 개 작은: 서브클래스 메소드의 반환 값이 동일 하위 클래스 메서드에서 발생한 예외는 상위 클래스에서 발생한 예외와 같거나 작아야 합니다.
한 가지 큰: 하위 클래스 메서드의 액세스 권한은 동일하거나 작아야 합니다. 상위 클래스보다 큼
정적: 하위 클래스 메서드는 상위 클래스 메서드(클래스 메서드 또는 인스턴스 메서드)와 일관성을 유지해야 하며 둘은 불일치할 수 없습니다.
메서드 재작성 후, 하위 클래스 객체는 상위 클래스의 메서드에 액세스할 수 없지만 하위 클래스 메서드에서 상위 클래스의 메서드를 호출할 수 있습니다. super.instance 메서드, 상위 클래스 메서드
클래스 메서드가 비공개로 수정된 경우 하위 클래스는 이 메서드를 재정의할 수 없습니다. 하위 클래스에 상위 클래스의 비공개 메서드와 동일한 서명이 있는 메서드가 있는 경우 이는 하위 클래스에 새로 추가된 메서드가 아니며 추가할 내용이 없습니다.
하위 클래스 메서드는 상위 클래스 메서드로 오버로드될 수 있습니다.
상위 클래스에서 final로 수정된 메서드의 경우 하위 클래스는
super 키워드
를 재정의할 수 없습니다.자식 클래스에서 super 키워드를 사용하여 부모 클래스의 인스턴스 변수나 인스턴스 메서드를 호출합니다.
super와 static은 this와 static처럼 동시에 메서드를 수정하는 데 사용할 수 없습니다. 메소드를 동시에 수정하는 데 사용할 수 없습니다.
sub 클래스는 상위 클래스로부터 변수를 상속받고 동일한 이름을 가진 다른 변수를 정의합니다. 이때 변수 이름은 super를 사용할 수 있습니다. . 상위 클래스의 변수에 접근하기 위한 변수 이름
변수 검색 순서
하위 클래스 메소드는 호출자가 명시적으로 지정되지 않은 경우 다음 순서로 검색을 수행합니다.
현재 메소드에 같은 이름의 로컬 변수가 있는지
현재 클래스에 같은 이름의 멤버 변수가 있는지 >super가 상위 클래스 생성자를 호출합니까
하위 클래스는 상위 클래스의 생성자를 상속하지 않지만 항상 상위 클래스의 생성자를 호출합니다. 동일한 클래스의 생성자를 호출하려면 이를 사용하고, 상위 클래스를 호출하려면 super
를 사용합니다. 명시적 호출: super call 문은 생성자 메서드의 첫 번째 줄에도 작성해야 하므로 작성합니다. 첫 번째 줄에 있으므로 super와 this가 동시에 나타나지 않습니다.
간접 호출: 하위 클래스 메서드의 첫 번째 줄은 this이며, 호출된 생성자는 상위 클래스의 생성자도 호출해야 합니다.
암시적 호출: super 또는 this가 없으면 시스템은 기본적으로 상위 클래스
의 매개변수 없는 생성자를 호출합니다. 하위 클래스는 상위 클래스를 상속하며 Object가 나올 때까지 항상 상위 클래스 생성자를 레벨별로 호출합니다. 호출되고 상위가 발견됩니다. 상위 클래스 생성자 이후 다음 레이어를 하나씩 실행하기 시작합니다.
예를 들어 다음 코드는 상속 관계입니다. A-->B-->C- ->D
출력: 클래스 A 생성자
B 클래스 생성자
C 클래스 생성자public class Test{ public static void main(String[] args) { D d=new D(); } } class D extends C{ D(){ System.out.println("D类构造器"); } }class C extends B{ C(){ System.out.println("C类构造器"); } }class B extends A{ B(){ System.out.println("B类构造器"); } }class A{ A(){ System.out.println("A类构造器"); } }D 클래스 생성자 부모 클래스에는 인수 없는 생성자가 없고, 서브 클래스는 부모 클래스의 매개변수 없는 생성자를 호출해야 하므로
다형성
을 통해 컴파일할 수 없습니다. 간단히 말해서 다형성은 : 피라미드형 상속 시스템에서는 하위 클래스를 생성합니다. 객체를 하위 클래스로 분류할 때 상위 상위 클래스 유형을 사용하여 동일한 유형의 참조 변수를 통해 동일한 메서드를 호출하면 다른 결과가 나타납니다.
다형성은 다음에서 비롯됩니다: 상속 + 부모 유형의 참조는 하위 유형의 객체를 가리키며 + 메서드 재정의
참조 변수에는 두 가지 유형이 있는데, 하나는 컴파일 타임 유형이고 다른 하나는 런타임 유형
Upcast: 상위 유형 참조는 다음을 가리킵니다. 하위 유형 객체의 경우 상향 변환은 시스템에 의해 자동으로 완료됩니다.
상향 변환의 경우: 재정의된 메서드를 호출할 수 있습니다. 그러나 하위 클래스에서 사용할 수 없는 상위 클래스의 메서드에 액세스할 수는 없습니다. 즉, 인스턴스 변수에는 다형성
instanceof이 없습니다. 강제 유형 변환
기본 유형에는 (double)16과 같은 강제 유형 변환이 있습니다. 참조 유형에도 강제 유형 변환이 있습니다.
예를 들어 다음과 같은 상속 체인이 있습니다. A-- >B-->C-->D-->E-->F, B b=new D(), 이 경우 B 유형은 D 객체를 가리킵니다. b 변수는 ACD 유형으로 변환할 수 있지만 EF 유형으로 변환할 수는 없습니다. ClassCastException
예외가 발생합니다.강제 유형 변환을 수행하기 전에 인스턴스of를 사용하여 예외 발생을 방지하기 위해 변환을 수행할 수 있는지 여부를 확인해야 합니다.
X 변수 인스턴스of Y 유형: X 변수를 Y 유형으로 변환할 수 있는지 확인하려면, 세 가지 상황이 발생할 수 있습니다.
true는 변환될 수 있음을 의미하며, 이는 X 변수가 가리키는 객체의 유형이 Y 유형이거나 Y의 하위 유형임을 의미합니다.
false는 이를 의미합니다. 변환할 수 없습니다. 즉, X 변수의 유형은 Y 유형과 동일합니다. 부모-자식 상속 관계가 있으므로 X 변수가 가리키는 개체의 유형이 없습니다. Y 유형의 부모-자식 또는 자식-부모 관계는 둘 다 Pass의 하위 유형으로, X와 Y가 부모-자식 또는 자식-아버지 상속 관계
상속 및 조합
상속은 코드 재사용을 실현할 수 있지만 캡슐화를 파괴합니다. 조합도 코드 재사용을 실현할 수 있습니다.부모 클래스를 설계할 때 따라야 할 원칙: 부모 클래스의 내부 데이터를 숨기려면 private을 사용하세요. 하위 클래스가 상위 클래스의 멤버 변수에 직접 액세스하는 것을 허용하지 않습니다하위 클래스가 원하는 대로 수행하도록 허용하지 마세요. 상위 클래스 메서드에 액세스하고 수정합니다. 상위 클래스의 보조 도구 메서드는 비공개로 장식되고, 하위 클래스에서 다시 작성하지 않으려는 메서드는 최종으로 장식됩니다. 하위 클래스에 의해 다시 작성된 것은 protected로 수정됩니다상위 클래스 생성자에서 하위 클래스에 의해 재정의될 수 있는 메서드를 호출하지 마십시오. 결과는 심각합니다. 디자인 상속 원칙: 하위 클래스는 속성이 아닌 추가 속성을 추가해야 합니다. 변경하위 클래스는 고유한 기능이나 동작을 추가해야 하며, 새 메서드를 추가하거나 상위 클래스 메서드를 다시 작성할 수 있습니다.상속을 설계하지 마세요. 단지 코드 재사용을 목적으로 하지만 실제 상황에 따라 다릅니다. 상위 클래스와 하위 클래스가 "has-a" 관계를 가지고 있는지 여부 클래스가 상속되는 것을 원하지 않음:
final: final을 사용하여 클래스를 최종 클래스로 수정합니다. 상속할 수 없습니다. private: 클래스의 모든 생성 메서드를 private으로 수정하여 하위 클래스가 클래스의 생성자를 호출할 수 없고 상속할 수 없도록 합니다. 또한 클래스의 생성자를 반환하려면 정적 메서드를 제공해야 합니다. 객체 조합도 코드 재사용을 달성할 수 있습니다. 클래스 A는 클래스 B의 메서드를 재사용합니다
클래스 A에서 클래스 B의 객체를 생성하고 이를 private으로 수정
클래스 A의 메소드에서 클래스 B 객체의 메소드 호출
조합 또는 상속:
상속 : 하위 클래스와 상위 클래스는 "is-a" 관계, 구체적 및 추상, 특별함 일반적인 관계와의 결합
: 새 클래스와 이전 클래스는 "has-a" 관계를 가집니다. 전체와 부분의 관계
기타:
부모 클래스의 하위 클래스의 경우 변수를 상속받아 같은 이름의 변수를 정의할 때 하위 클래스 객체를 생성할 때 메모리가 할당됩니다. 두 변수 모두 있지만 상위 클래스 변수는 숨겨져 있습니다.