"Think in Java"에는 다음과 같은 말이 있습니다. 코드 재사용은 Java의 많은 눈길을 끄는 기능 중 하나입니다. 그러나 언어가 고도로 혁명적이 되려면 코드를 복사하고 변경할 수 있는 것만으로는 충분하지 않고 더 많은 일을 할 수 있어야 합니다. 이 문장에서 가장 눈길을 끄는 것은 '코드 재사용'이다. 코드를 최대한 재사용하는 것은 우리 프로그래머들이 추구해 온 것이다. 이제 자바의 3대 특징 중 하나인 코드 재사용 방법을 소개하겠다. .하나---상속.
상속
설명에 앞서 예시를 먼저 살펴보겠습니다. 이전 블로그 게시물(Java Improvement - Java의 세 가지 주요 기능 캡슐화 이해)에서 가져온 예시입니다.
여기서 우리는 Wife와 Husband 클래스가 각각의 남편과 아내를 제외하고는 모두 동일하다는 것을 알 수 있습니다. 코드 재사용을 극대화하려는 프로그래머로서 우리는 할 수 있습니다. 이렇게 반복되는 코드는 참을 수 없습니다. 다른 여주인, 여주인, 여주인이 있다면 ... (너무 멀리 가고 있습니다) 이렇게 작성해야합니까? 그렇다면 이러한 클래스를 재사용 가능하게 만들려면 어떻게 해야 할까요? 상속을 활용하세요! !
우선, 소프트웨어 프로그래밍의 세계에서 벗어나자 상식적으로 보면 남편, 아내, 애인, 애인... 다 사람이고 공통점이 있다는 걸 알 수 있습니다. 이름, 나이, 성별, 머리 등과 같이 모두 먹고, 걷고, 말하고, 기타 일반적인 행동을 할 수 있으므로 여기에서 우리는 그들이 모두 인간의 속성과 행동을 가지고 있음을 알 수 있으며, 또한 이러한 속성과 인간의 행동.
이상으로 상속의 개념을 기본적으로 이해할 수 있습니다. 상속이란 기존 클래스의 정의를 기반으로 새로운 클래스를 생성하는 기술입니다. 새 함수. 상위 클래스의 기능을 사용할 수도 있지만 상위 클래스를 선택적으로 상속할 수는 없습니다. 상속을 사용하면 이전 코드를 매우 편리하게 재사용할 수 있어 개발 효율성이 크게 향상될 수 있습니다.
아내와 남편에 대한 상속을 사용하면 코드의 양이 줄어들 뿐만 아니라 그들의 관계도 명확하게 알 수 있습니다.
상속은 "is-a" 관계를 설명합니다. 두 개체 A와 B가 있는 경우 "A는 B입니다"라고 설명할 수 있으면 A가 B를 상속한다는 의미일 수 있습니다. 여기서 B는 A를 상속받습니다. 을 부모 클래스 또는 슈퍼 클래스라고 하고, A를 서브 클래스 또는 파생 클래스라고 합니다.
사실 후계자는 상속자의 특성을 갖는 것 외에도 고유한 특성도 가지고 있습니다. 예를 들어, 고양이는 쥐를 잡거나 나무에 오르는 등 다른 동물들에게는 없는 특성을 가지고 있습니다. 동시에 상속 관계에서는 상속인이 상속인을 완전히 대체할 수 있지만 그 반대는 불가능합니다. 예를 들어 고양이는 동물이라고 말할 수 있지만 실제로는 동물이라고 말할 수 없습니다. 우리가 이것을 "상향 변환"이라고 부르는 이유는 아래에 소개되어 있습니다.
상속이 클래스가 서로 어떻게 연관되고 특성을 공유하는지 정의하는 것은 사실입니다. 동일하거나 친숙한 여러 클래스의 경우 공통 동작이나 속성을 추상화하고 이를 부모 클래스 또는 슈퍼 클래스로 정의한 다음 이러한 클래스를 사용하여 부모 클래스의 속성과 메서드를 가질 수 있습니다. 고유한 속성이나 메서드를 정의할 수도 있습니다.
동시에 상속을 사용할 때 다음 세 문장을 기억해야 합니다.
1. 하위 클래스에는 상위 클래스의 비공개 속성과 메서드가 있습니다.
2. 하위 클래스는 고유한 속성과 메서드를 가질 수 있습니다. 즉, 하위 클래스는 상위 클래스를 확장할 수 있습니다.
3. 하위 클래스는 상위 클래스의 메서드를 자신만의 방식으로 구현할 수 있습니다. (나중에 소개).
요약하면 상속을 사용하면 코드 공유를 달성하고 중복을 피하기 위해 모든 하위 클래스의 공통 속성을 상위 클래스에 넣는 것 외에도 상속된 구현을 수정하고 확장할 수 있다는 이점이 있습니다. .
상속에 있어서 생성자, 보호 키워드, 상향 변환 세 가지가 반드시 필요한 것은 사실입니다.
생성자
위에서 우리는 하위 클래스가 상위 클래스의 속성과 메서드를 상속할 수 있다는 것을 알고 있습니다. 이러한 비공개 클래스 외에도 하위 클래스가 상속할 수 없는 또 다른 사항이 있습니다. 바로 생성자입니다. 생성자는 호출만 가능하고 상속은 불가능합니다. 상위 클래스의 생성자를 호출하려면 super()를 사용할 수 있습니다.
하위 클래스의 경우 생성자의 올바른 초기화가 매우 중요하며 이를 보장할 수 있는 메서드가 단 하나인 경우에만 생성자에서 상위 클래스 생성자를 호출하여 초기화를 완료하고 상위 클래스 생성자를 호출하는 경우에만 가능합니다. 클래스 생성자는 부모 클래스의 초기화를 수행하는 데 필요한 모든 지식과 기능을 갖추고 있습니다.
그러나 상위 클래스의 생성자에 대한 기본 호출에는 전제 조건이 있습니다. 즉, 상위 클래스에 기본 생성자가 있어야 합니다. 부모 클래스에 기본 생성자가 없으면 명시적으로 super()를 사용하여 부모 클래스 생성자를 호출해야 합니다. 그렇지 않으면 컴파일러는 다음과 같은 오류를 보고합니다. 부모 클래스의 형식을 따르는 생성자를 찾을 수 없습니다.
public class Person { protected String name; protected int age; protected String sex; Person(){ System.out.println("Person Constrctor..."); } } public class Husband extends Person{ private Wife wife; Husband(){ System.out.println("Husband Constructor..."); } public static void main(String[] args) { Husband husband = new Husband(); } } Output: Person Constrctor... Husband Constructor...
요약하자면 상속의 경우 하위 클래스는 기본적으로 상위 클래스의 생성자를 호출하지만 기본 상위 클래스 생성자가 없는 경우 하위 클래스는 상위 클래스의 생성자를 명시적으로 지정해야 합니다. 하위 클래스 생성자에서 수행되는 첫 번째 작업(코드의 첫 번째 줄)
보호 키워드개인 액세스 수정자는 캡슐화를 위한 최선의 선택이지만 이는 이상적인 세계에만 기반을 두고 있습니다. 특정 항목을 가능한 한 많이 숨기되 하위 클래스 멤버가 해당 항목에 액세스할 수 있도록 허용하세요. 이때 protected를 사용해야 합니다.
protected의 경우 클래스 사용자에 관한 한 비공개임을 나타내지만 이 클래스를 상속하는 하위 클래스나 동일한 패키지에 있는 다른 클래스의 경우 비공개로 액세스할 수 있습니다.
public class Person { protected String name; protected int age; protected String sex; Person(String name){ System.out.println("Person Constrctor-----" + name); } } public class Husband extends Person{ private Wife wife; Husband(){ super("chenssy"); System.out.println("Husband Constructor..."); } public static void main(String[] args) { Husband husband = new Husband(); } } Output: Person Constrctor-----chenssy Husband Constructor...
위의 예에서 하위 클래스 Husband가 상위 클래스 Person의 setName()을 호출할 수 있음을 알 수 있습니다.
protected 액세스 한정자를 사용하여 부모 클래스 속성 및 메서드에 대한 액세스를 제한할 수 있지만 가장 좋은 방법은 속성을 비공개로 유지하고(항상 기본 구현을 계속 변경해야 함) 다음을 사용하는 것입니다. 클래스 상속자의 액세스 권한을 제어하는 보호된 메소드입니다.
상향 변환
위의 상속에서 상속에 대해 is-a, 고양이 상속 및 동물의 상호 관계로 이야기했으므로 고양이라고 할 수 있습니다. 그것은 동물이거나 고양이는 동물의 일종입니다. 이런 식으로 고양이를 동물로 생각하는 것은 위로 변신하는 것입니다. 다음과 같습니다:
public class Person { private String name; private int age; private String sex; protected String getName() { return name; } protected void setName(String name) { this.name = name; } public String toString(){ return "this name is " + name; } /** 省略其他setter、getter方法 **/ } public class Husband extends Person{ private Wife wife; public String toString(){ setName("chenssy"); //调用父类的setName(); return super.toString(); //调用父类的toString()方法 } public static void main(String[] args) { Husband husband = new Husband(); System.out.println(husband.toString()); } } Output: this name is chenssy
여기서는 Person.display(남편)를 전달합니다. 이 문장을 보면 남편이 사람형이라는 것을 알 수 있습니다.
하위 클래스를 상위 클래스로 변환하는 것은 상속 관계에서 위쪽으로 이동하므로 일반적으로 상향 변환이라고 합니다. 업캐스팅은 특수한 유형을 보다 일반적인 유형으로 변환하는 것이므로 발생할 수 있는 유일한 변경 사항은 속성과 메서드의 손실뿐입니다. 이것이 바로 캐스트가 명시적으로 지정되지 않았거나 특수 플래그가 지정되지 않은 경우에도 컴파일러가 상향 캐스트를 허용하는 이유입니다.
상속에 주의하세요
위에서 상속의 많은 이점에 대해 이야기했는데 상속을 자유롭게 사용할 수 있을까요? 여러분을 위한 조언: 상속을 주의해서 사용하세요.
우선 상속에는 다음과 같은 결함이 있다는 점을 분명히 해야 합니다.
1. 상위 클래스가 변경되면 하위 클래스도 변경되어야 합니다.
2. 상속은 캡슐화를 파괴합니다. 상위 클래스의 경우 구현 세부 사항이 하위 클래스에 투명합니다.
3. 상속은 강한 결합 관계입니다.
따라서 상속을 사용할 때는 상속을 사용하는 것이 실제로 효과적이고 실행 가능한 방법인지 확인해야 합니다. 그렇다면 상속을 사용해야 할까요? "Think in Java"는 해결책을 제공합니다. 하위 클래스에서 상위 클래스로 상향 변환이 필요한지 자문해 보세요. 상향변형이 필요하다면 상속도 필요하지만, 그렇지 않다면 상속도 필요한지 신중히 고려해야 한다.
상속을 주의해서 사용하세요! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
위는 Java 개선 장(2)입니다. ----- Java의 세 가지 주요 특성 상속에 대한 이해. 자세한 내용은 PHP 중국어 웹사이트(www.php.php. CN)!