저는 지난 이틀 동안 자연스럽게 메서드를 다시 작성하는 것과 관련된 다형성을 배웠습니다. 작성자가 코드를 만지작거리는 과정에서 "이 정적 메서드는 Fu에서 인스턴스 메서드를 숨길 수 없습니다"(아래 그림 참조)라고 언급된 오류 유형을 발견하여 덮어쓰기(다시 쓰기) 외에도 다양한 정보를 검색한 결과 마침내 더 자세한 기사를 발견하여 많은 의심을 해결했습니다. 전달하고 나중에 다시 와서 읽어보고 싶을 수도 있습니다.
1. 컴파일 타임 유형과 런타임 유형
Java 참조 변수에는 두 가지 유형이 있습니다. 하나는 컴파일 타임 유형이고 다른 하나는 런타임 유형
컴파일 타임입니다. type: 선언된 변수가 사용될 때 사용된 유형이 런타임 유형을 결정합니다
: 변수가 가리키는 객체의 유형에 따라 결정
컴파일 타임 유형과 런타임 유형이 일치하지 않는 경우 - 다형성(Polymorphism)이 발생하게 됩니다. 하위 클래스는 실제로 특별한 상위 클래스이기 때문에 Java에서는 유형 변환 없이 하위 클래스 객체를 상위 클래스 참조 변수에 직접 할당할 수 있도록 허용합니다. 이를 상향 변환이라고 하며 이는 시스템에 의해 자동으로 완료됩니다. 예를 들어, Father f = new Son(); Son은 Father의 하위 클래스입니다변수 f가 참조되면 컴파일 타임 유형과 런타임 유형이 일치하지 않습니다. 타입이고 런타임 타입은 Son 타입When 변수의 컴파일 타임 타입과 런타임 타입이 일치하지 않을 때, 변수를 통해 그것이 참조하는 객체의 인스턴스에 접근할 때, 변수의 값은 인스턴스 변수는 변수가 선언된 유형에 따라 결정됩니다. 참조하는 개체의 메서드가 변수를 통해 액세스될 때 메서드의 동작은 참조되는 개체의 실제 유형에 따라 결정됩니다.2. 숨기기 및 덮기
Overwriting: 하위 클래스는 상위 클래스의 메서드를 재정의하므로 메서드 이름과 매개 변수 유형이 정확히 동일해야 하며(매개 변수는 하위 클래스일 수 없음) 반환 값과 예외는 부모 클래스의 것보다 작거나 같습니다(즉, 부모 클래스의 하위 클래스입니다). 액세스 수정자는 부모 클래스보다 크거나 같습니다.
덮어쓰기는 인스턴스 메서드용입니다메서드를 교차할 수 없습니다: 하위 클래스 인스턴스 메서드는 상위 클래스의 정적 메서드를 재정의할 수 없습니다. )
Hide
: 상위 클래스와 하위 클래스에 동일한 속성이나 메서드가 있는 경우 이름(메소드 숨김 형식은 하나만 있습니다. 즉, 상위 클래스와 하위 클래스가 동일한 정적 메소드를 가짐), 동일한 이름을 가진 상위 클래스의 속성 또는 메소드 형식은 사라졌지만 실제로는 여전히 존재합니다.Hiding은 정적 메소드 및 멤버 변수(정적 변수 및 인스턴스 변수)에 대한 것입니다.
(1) 숨김이 발생하면 선언된 타입이 어떤 클래스인지, 해당 클래스의 속성이나 메소드를 호출하는 대신 Dynamic Binding이 발생합니다.
(2) 속성은 숨길 수만 있고 덮어쓸 수는 없습니다.
(3) 변수는 교차 숨길 수 있습니다. 하위 클래스 인스턴스 변수/정적 변수는 상위 클래스의 인스턴스/정적 변수를 숨길 수 있습니다3의 차이점은 다음과 같습니다. 숨기기 및 덮어쓰기
(1) 숨겨진 속성의 경우 하위 클래스가 상위 클래스로 강제 변환된 후 상위 클래스의 속성에 액세스됩니다.
강제 변환이 없는 경우 하위 클래스는 해당 속성에 액세스해야 합니다. 상위 클래스 슈퍼 키워드 사용 (2) 재정의된 메서드, 하위 클래스가 강제로 상위 클래스로 변환된 후에도 하위 클래스 자체의 메서드는 계속 호출됩니다. 하위 클래스가 상위 클래스의 메서드에 액세스하려는 경우 , 슈퍼 키워드 를 사용할 수 있습니다. 관련 기사:java
의 오버로드 및 재정의 소개
위 내용은 Java의 숨기기 및 재정의 개요와 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!