객체 지향의 세 가지 특성 중 하나 인 상속

1. 상속의 개념

우리는 이전에 객체 지향의 세 가지 특성 인 캡슐화, 상속 및 다형성을 배웠습니다.

상속은 다형성의 전제이며 상속이 없으면 다형성이 없습니다.

상속으로 해결되는 주요 문제 는 공통성 추출입니다 .

일부 클래스를 작성할 때 동일한 변수 나 메서드가 많이 있습니다. 이런 식으로 작성하면 코드가 매우 중복됩니다. 따라서 이러한 공통 변수와 메서드를 추출하여 클래스에 넣은 다음 이러한 클래스가 상속하도록 할 수 있습니다. , 따라서 이러한 상속 된 클래스는 더 이상 이러한 변수 및 메서드를 작성할 필요가 없으며 직접 사용할 수 있으며 이러한 상속 된 클래스는 고유 한 변수 및 메서드를 가질 수도 있습니다.

상속 된 클래스를 부모 클래스라고하며 기본 클래스 및 수퍼 클래스라고도합니다.

상속 된 클래스를 하위 클래스라고하며 파생 클래스라고도합니다.

상속 관계의 특징 :

1. 하위 클래스는 부모 클래스의 상속 가능한 내용을 가질 수 있습니다.

2. 하위 범주는 자체적으로 새 콘텐츠를 전송할 수도 있습니다.

참고 : 상속 관계에서 "하위 클래스는 상위 클래스"입니다. 즉, 하위 클래스는 상위 클래스로 취급 될 수 있습니다.

예를 들어 상위 범주는 직원이고 하위 범주는 강사 및 감독입니다. 그러면 "강사는 직원이다"는 "아이가 부모 다"라는 말과 같다. 실제로 개념과 충돌하지 마십시오. 정의 측면에서 모든 하위 클래스는 상위 클래스에 속하고 콘텐츠 측면에서 하위 클래스에는 상위 클래스가 포함됩니다.

상위 클래스의 형식 정의 : (공통 클래스 정의)

서브 클래스의 형식을 정의하십시오.

공용 클래스 하위 클래스 이름이 부모 클래스 이름 {}을 확장합니다.

예 : 상위 클래스 :

public class Employee {
        public void method(){
            System.out.println("方法执行!");
        }
}

아강:

public class Teacher extends Employee{

}

클래스의 하위 클래스를 호출합니다.

public class Demo04Extends {
    public static void main(String[] args) {
        // 没写构造方法的话,编译器送一个
        Teacher teacher = new Teacher();
        teacher.method();
    }
}

결과 :

즉, Teacher 클래스의 객체를 직접 인스턴스화하여 부모 클래스의 메서드를 호출 할 수 있습니다.

 

2. 상위 및 하위 클래스의 상속 관계에서 멤버 변수의 이름이 같으면 하위 클래스 개체를 만들 때 액세스하는 두 가지 방법이 있습니다.

1. 서브 클래스 객체를 통해 직접 멤버 변수에 액세스합니다.

    등호 왼쪽에있는 사람은 사용되는 사람에게 우선권을 부여하고, 아무도 없으면을 찾습니다 .

public class Fu {
    int num = 10;
}
public class Zi extends Fu{
    int num = 20;
}
Fu fu = new Fu();
Zi zi = new Zi();

System.out.println(fu.num); // 10
System.out.println(zi.num); // 20

 

2. 멤버 메서드를 통해 멤버 변수에 간접적으로 액세스합니다.

    메서드에 속한 사람은 사용되는 사람에게 우선 순위를 부여하고 그렇지 않은 경우 검색합니다.

public class Fu {
    int num = 10;
    public void methodFu(){
        // 使用的是本类的,不会向下找
        System.out.println(num);
    }
}
public class Zi extends Fu{
     int num = 20;
    public void methodZi(){
        // 记住,优先用自己的,如果本类没有该变量,才往父类找
        // 即即使注释掉定义num那一行,下面这个输出也不会报错
        // 会去父类找到同名的
        System.out.println(num);
    }
}
public static void main(String[] args) {
    Fu fu = new Fu();
    Zi zi = new Zi();

    System.out.println(fu.num); // 10
    System.out.println(zi.num); // 20

    zi.methodZi(); // 20
    // 这个方法是在父类里定义的,所以这个num是父类的,不会向下找
    zi.methodFu(); // 10
}

 

3. 분자 법에서 이름이 같은 변수 3 개

지역 변수 : 직접 쓰기

이 클래스의 멤버 변수 : this. 멤버 변수 이름

상위 클래스의 멤버 변수 : 수퍼 멤버 변수 이름

 

public class Fu {
    int num = 10;
    public void methodFu(){
        // 使用的是本类的,不会向下找
        System.out.println(num);
    }
}
public class Zi extends Fu{
     int num = 20;
    public void method(){
        // 局部变量重名,直接写,出栈即毁
        int num = 30;
        System.out.println(num);  // 30,局部变量,优先离得近的
        System.out.println(this.num); // 20,成员变量
        System.out.println(super.num);  // 10,父类的成员变量
    }
}
public static void main(String[] args) {

    Zi zi = new Zi();
    zi.method();
}

5. 상속 된 멤버 메소드의 접근 특성 (상위 클래스와 자식 클래스의 멤버 메소드 이름이 같은 것에주의)

상위 및 하위 클래스의 상속 관계에서 하위 클래스 개체를 만들고 멤버 메서드에 액세스하기위한 규칙은 다음과 같습니다.

    물체를 만든 사람은 물에 우선권을 주지만 그렇지 않은 경우 위쪽으로 찾으십시오.

지침:

멤버 변수와 멤버 메서드에 관계없이 아무것도 없으면 부모 클래스가 조회되고 자식 클래스는 결코 조회되지 않습니다 .

public class Fu2 {
    public void methodFu(){
        System.out.println("父类方法执行!");
    }
    public void method(){
        System.out.println("父类重名方法执行!");
    }
}
public class Zi2 extends Fu2{
    public void methodZi(){
        System.out.println("子类方法执行!");
    }
    public void method(){
        System.out.println("父类重名方法执行!");
    }
}
public static void main(String[] args) {
    Zi2 zi = new Zi2();
    zi.methodFu();
    zi.methodZi();
    zi.method();
}

스크린 샷 실행 :

6. 상속에서 메서드 재정의 (Override)

개념 : 상속 관계에서 메서드 이름이 같고 매개 변수 목록이 동일 합니다. 경우 다시 쓰기라고합니다. 메서드 오버로딩과 구별 할 수 있도록주의하세요 .

재정의 : 메서드의 이름이 동일하고 매개 변수 목록이 [동일 함]이며 재정의 및 재정의라고도합니다.

오버로드 : 메서드 이름이 같고 매개 변수 목록이 [같지 않음]

메서드 커버리지 및 재 작성의 특성 : 하위 클래스 개체를 만드는 경우 하위 클래스 메서드가 선호됩니다.

메서드 적용 및 재 작성에 대한주의 사항 :

1. 상위 클래스와 하위 클래스 간의 메서드 이름이 동일하고 매개 변수 목록도 동일한 지 확인해야합니다.

효과적인 재정의를 수행하기 위해 메서드 앞에 작성된 @Override (주석)를 도입하여 덮어 쓰기가 유효하고 올바른지 확인하고, 오류가없는 경우에는 효과적입니다. 덮어 씁니다.

이 코멘트가 작성되지 않더라도 요구 사항을 충족하는 한 효과적으로 덮어 쓰기 및 재 작성되며 안전한 탐지 방법 일뿐입니다.

2. 하위 클래스 메서드 의 반환 값은 부모 메서드의 반환 값 범위 보다 작거나 같아야합니다 .

우리는 작은 전제를 기억합니다. String 클래스에는 모든 클래스의 공통 부모 클래스 (기본 클래스) 인 부모 클래스 Object가 있습니다.

예 : 상위 및 하위 클래스는 동일한 반환 유형과 올바른 형식을 갖습니다.

public class OverrideFu {
    public Object method(){
        Object object = new Object();
        return object;
    }
}
public class OverrideZi extends OverrideFu {
    // 没有报错,即有效重写
    @Override
    public Object method() {
        Object object = new Object();
        return object;
    }
}

상위 및 하위 클래스의 반환 유형이 동일하지 않습니다. 하위 클래스 유형이 상위 클래스보다 작습니다. 올바른 형식입니다. 범위를 판단 할 유형은 상속 관계가있는 참조 유형으로 제한됩니다.

public class OverrideZi extends OverrideFu {
    // 没有报错,即有效重写
    @Override
    public String method() {
        String str = new String();
        return str;
    }
}

3. 하위 클래스 메서드의 권한은 부모 메서드의 권한 수정 자보다 크거나 같아야합니다 .

작은 확장 팁 : public> protected> (기본값)> private

참고 : (기본값)은 키워드 기본값이 아니지만 아무것도 쓰지 않고 비워 둡니다.

 

7. 상속 방법의 적용 및 재 작성의 적용 시나리오.

디자인 원칙 : 사용 된 클래스를 수정하지 마십시오. 공통 콘텐츠를 다시 읽고 사용하고 새로운 콘텐츠를 추가하려면 새 클래스를 정의하는 것이 좋습니다.

 

8. 상속시 구축 방법의 접근 특성

1. 서브 클래스 생성 메서드에는 기본적으로 암시적인 "super ()"호출이 있습니다 (작성하지 않으면 컴파일러가이를 전송합니다). 따라서 먼저 호출되는 슈퍼 클래스 생성과 서브 클래스 생성이어야합니다. 나중에 실행됩니다.

public class Fu3 {
    public Fu3() {
        System.out.println("父类构造方法");
    }
}
public class Zi3 extends Fu3{
    public Zi3() {
        // Super(); //调用父类无参构造方法
        System.out.println("子类构造方法");
    }
}
public class Demo04Constructor {
    public static void main(String[] args) {
        // 不仅会用到子类的构造方法,也会用到父类的构造方法
        // 且父类的构造方法先调用。
        Zi3 zi = new Zi3();
    }
}

스크린 샷 실행 :

2. 서브 클래스 구조 는 키워드를 사용하여 슈퍼 클래스 오버로드 구조 를 호출합니다 .

참고 : 어떤 클래스가 매개 변수없는 생성 방법을 작성하지 않고 매개 변수화 된 생성 방법을 오버로드하는 경우 컴파일러는 매개 변수없는 생성 방법을 제공하지 않습니다 !

따라서 매개 변수를 갖도록 상위 클래스의 생성 방법을 변경하면 하위 클래스는 super ()를 작성하지 않습니다. 그러면 호출 할 상위 클래스의 매개 변수없는 생성 방법이 없기 때문에 오류가보고됩니다.

이 시점에서, 우리는 슈퍼를 사용할 수 있습니다. () 메소드를 부르는하기 에 부모 클래스의 오버로드의 매개 변수 구성 방법 에 따라 매개 변수가 건설 방법과 형식부모 클래스 과부하 . (이 문장을 색깔별로 이해하는 것은 낙관적입니다)

예를 들면 다음과 같습니다.

public class Fu3 {
    public Fu3(int num) {
        System.out.println("父类构造方法");
    }
}
public class Zi3 extends Fu3{
    public Zi3() {
        super(3); // 按照格式,写上int参数
        // super(); //调用父类无参构造方法
        System.out.println("子类构造方法");
    }
}

3. [요점] super ()의 부모 클래스 생성 호출은 서브 클래스 생성 메소드의 첫 번째 문장이어야하며, 슈퍼 생성은 하나의 서브 클래스 생성에 대해 여러 번 호출 될 수 없습니다! ! !

이 문장은 두 가지 점에주의를 기울입니다. super ()는 서브 클래스 생성 방법으로 작성되어야하며, 첫 번째 문장이어야합니다.

 

요약하자면 :

서브 클래스는 부모 클래스의 생성 메서드를 호출해야합니다. 작성되지 않은 경우 super ()가 제공되고, 작성되면 지정된 super가 작성된 상태로 호출됩니다. super는 하나만있을 수 있으며 첫 번째 여야합니다. 하나.

 

보충:

1. Java 언어는 단일 상속입니다.

단일 상속 : 클래스의 직계 부모는 하나만있을 수 있으며 아버지는 유일한 상속입니다.

두 개의 상위 클래스가 상속되고 두 개의 상위 클래스에 동일한 이름의 메서드가있는 경우 하위 클래스 개체는이 메서드를 호출하고 컴파일러는 선택할 수있는 메서드를 결정할 수 없습니다. 즉, 컴파일 오류가 발생합니다.

2. Java 언어는 여러 수준에서 상속 될 수 있습니다.

자식 클래스 (하위)에는 부모 클래스 (부모)가 있고 부모 클래스에는 부모 클래스 (아버지) 등이 있습니다.

3. 하위 클래스의 직계 상위는 고유하지만 상위는 많은 하위 클래스를 가질 수 있습니다.

 

추천

출처blog.csdn.net/wardo_l/article/details/113827856