자바 의 계승 을 얕 게 이해 하 다

44220 단어 Java
콘 셉 트
계승 은 자바 에서 프로 그래 밍 에 대한 두 번 째 중요 한 특성 입 니 다. 주로 공통성 추출 문 제 를 해결 하 는 동시에 계승 이 냐 다 중 전제 입 니까?그렇다면 공통성 추출 문 제 는 무엇 일 까?우 리 는 생활 속 의 예 로 감성 적 으로 이해 해 보 자. 학교 안의 모든 직원 들 이 하나의 Employee 류 가 될 수 있다. 그들 은 노동자 번호 (ID), 이름 (name) 이 있 고 해당 하 는 구성원 방법 은 업무 (work) 가 있다.직원 중 에 선생님, 조교 도 있 습 니 다...............................................................................
class Teacher extends Employee{
     
    int ID;
    String name;
	//       
    
    public void work(){
     
        System.out.println("teacher...");
    }
    
    //      

}
class Assistant {
     
    int ID;
    String name;
    //       

    public void work(){
     
        System.out.println("assistant...");
    }
     //      
   
}

//      

우 리 는 서로 다른 직원 류 의 구성원 변수 와 구성원 방법 이 비슷 한 것 이 많다 는 것 을 알 수 있다. 만약 에 쓰 려 는 유형 이 많 을 때 코드 는 약간 지루 해 보인다.따라서 우 리 는 그 중의 공통성 을 추출 하여 하나의 부 류 를 구축 하고 모든 직원 류 를 자 류 로 볼 수 있다. 자 류 는 아버지 류 의 일부 구성원 변수 와 구성원 방법 을 계승 할 수 있 고 그들 은 자신 만 의 독특한 내용 도 가진다.
class Employee {
     
    String name;
    int ID;

    public void showInfo(){
     
        System.out.println("ID is: " + this.ID + " and name is: " + this.name);
    }

    public void work(){
     
        System.out.println("employee...");
    }
}

class Teacher extends Employee{
     
    @Override
    public void work() {
     
        System.out.println("teacher...");
    }
}

class Assistant extends Employee{
     
    @Override
    public void work() {
     
        System.out.println("assistant...");
    }
}


public class ExtendsTest {
     
    public static void main(String[] args) {
     
        Teacher t = new Teacher();
        t.ID = 001;
        t.name = "Forlogen";
        t.work();  // teacher...
        t.showInfo(); // ID is: 1 and name is: Forlogen

        Assistant assistant = new Assistant();
        assistant.ID = 110;
        assistant.name = "kobe";
        assistant.work();  // assistant...
        assistant.showInfo();  // ID is: 110 and name is: kobe
    }
}

그 중에서 계승 에는 몇 가지 중요 한 개념 이 포함 되 어 있다.
  • 부모 클래스, 기본 클래스, 초 클래스, 예 를 들 어 위의 Employee 류, 코드 실현 에 있어 서 일반적인 클래스
  • 입 니 다.
  • 자 류, 파생 류, 예 를 들 어 위의 Teacher 류, Assistant 류 등 상속 관 계 는 extends 키 워드 를 통 해 이 루어 진다
  • .
    public class      extends     {
         }
    

    동시에 계승 관계 에는 다음 과 같은 특징 이 있다.
  • 하위 클래스 는 상위 ID, name, work (), showInfo ()
  • 와 같은 부모 클래스 의 '내용' 을 가 질 수 있 습 니 다.
  • 자 류 는 자신 만 의 내용 도 가 질 수 있다. 즉, 자 류 는 자신 만 의 논 리 를 실현 할 수 있다
  • .
    구성원 변수의 접근
    부자 류 의 계승 관계 에서 구성원 변수 가 이름 을 바 꾸 면 하위 클래스 대상 을 만 들 때 두 가지 방식 으로 접근 합 니 다.
  • 하위 대상 을 통 해 구성원 변 수 를 직접 방문 합 니 다. 등호 왼쪽 에 있 는 사람 이 먼저 사용 하고 없 으 면 위로 찾 아 위의 두 마디 를 어떻게 이해 합 니까?우 리 는 예 를 들 어 현재 Employee 류 가 다음 과 같다 고 가정 합 니 다. 그 중에서 한 구성원 변수 school 이 어느 대학 이 라 고 표시 합 니까?
    class Employee {
           
        String name;
        int ID = 111;
        String school = "STU";
    
        public void showInfo(){
           
            System.out.println("ID is: " + this.ID + " and name is: " + this.name);
        }
    
        public void work(){
           
            System.out.println("employee...");
        }
    }
    
    Teacher 류 는 다음 과 같 습 니 다. 자신의 ID 만 있 고 school:
    class Teacher extends Employee{
           
        int ID = 100;
    
        @Override
        public void work() {
           
            System.out.println("teacher...");
        }
    }
    
    이 없 으 면 우 리 는 Teacher 류 의 대상 을 예화 하고 그 중의 구성원 변 수 를 방문 합 니 다.
    public class ExtendsTest1 {
           
        public static void main(String[] args) {
           
            Teacher t = new Teacher();
            System.out.println(t.ID);  // 100
            System.out.println(t.school); // STU
        }
    }
    
    현재 등호 왼쪽 에 있 을 때 Teacher 이기 때문에 Teacher 의 구성원 변 수 를 우선 사용 하기 때문에 ID 는 100 입 니 다.스 쿨 은 Teacher 에 없 기 때문에 부모 클래스 에서 계속 찾 아 STU 로 출력 해 야 합 니 다.
  • 멤버 방법 을 통 해 멤버 변 수 를 간접 적 으로 방문 합 니 다. 이 방법 은 멤버 에 속 하 는 사람 이 먼저 사용 하고 없 으 면 위로 찾 습 니 다
    class Employee {
           
        String name;
        int ID = 111;
        String school = "STU";
        
    	//   ID
        public void getID(){
           
            System.out.println(ID);
        }
    }
    
    class Teacher extends Employee{
           
        int ID = 100;
    
        public void getTeacherID(){
           
            System.out.println(ID);
        }
    }
    
    public class ExtendsTest1 {
           
        public static void main(String[] args) {
           
            Teacher t = new Teacher();
    
            t.getTeacherID(); // 100
            t.getID();  // 111
        }
    }
    
    . 위 에서 보 듯 이 Employee 류 에 멤버 방법 getID 가 멤버 변수 ID 에 접근 합 니 다. Teacher 에 도 getTeacherID 가 있 습 니 다.우리 가 Teacher 의 대상 이 ID 에 접근 할 때 사용 하 는 방법 은 해당 하 는 사람 이 먼저 사용 하 는 것 이다.getTeacherID 는 Teacher 에 속 하기 때문에 우선 사용 합 니 다. 해당 출력 은 100 이 고 getID 는 Teacher 에 없 으 며 부모 클래스 에 존재 하기 때문에 여기 서 방문 하 는 ID 는 Employee 의 ID 이 고 출력 은 111 입 니 다.

  • 이름 변경 변수의 사용
    하위 클래스 의 실현 에 있어 서 계승 하 는 부모 클래스 의 구성원 변수, 자신의 구성원 변수 와 자신의 구성원 방법 중의 부분 변수 가 이름 을 바 꾸 는 상황 이 발생 할 수 있 습 니 다. 그러면 이름 을 바 꾸 는 변 수 를 사용 할 때 어떻게 구분 합 니까?서로 다른 변 수 를 대상 으로 다음 과 같이 구분 할 수 있 습 니 다.
  • 부분 변수: 직접 쓰기
  • 본 변수: this 키워드 사용
  • 부모 클래스 변수: 슈퍼 키 워드 를 사용 합 니 다
  • 부자 류 의 상속 관계 에서 하위 대상 을 만 들 고 구성원 방법 에 접근 하 는 규칙: 만 든 대상 이 누구 인지 우선 사용 하고 없 으 면 위로 찾 습 니 다.
    class Employee {
         
        int ID = 111;
    }
    
    
    class Teacher extends Employee{
         
        int ID = 100;
    
        public void showID(){
         
            int ID = 222;
            System.out.println(ID);
            System.out.println(this.ID);
            System.out.println(super.ID);
        }
    }
    
    public class ExtendsTest1 {
         
        public static void main(String[] args) {
         
            Teacher t = new Teacher();
            t.showID(); // 222  100  111
        }
    }
    

    멤버 방법의 사용
    계승 관계 에서 구성원 방법의 사용 은 구성원 변수의 사용 과 유사 하 다. 만 든 대상 이 누구 인지 우선 사용 하고 없 으 면 위로 찾는다.
    class Employee {
         
        String name;
        int ID = 111;
        
        public void showInfo(){
         
            System.out.println("ID is: " + this.ID + " and name is: " + this.name);  
        }
    }
    
    class Teacher extends Employee{
         
    	int ID = 100;
    }
    
    public class ExtendsTest2 {
         
        public static void main(String[] args) {
         
            Teacher t = new Teacher();
            t.showInfo();  // ID is: 111 and name is: null
        }
    }
    
    

    위 에서 보 듯 이 Teacher 대상 의 showInfo () 를 사용 할 때 있 으 면 직접 호출 합 니 다. 없 기 때문에 아버지 클래스 의 방법 을 위로 찾 습 니 다.
    다시 쓰기 (오 버 라 이 드)
    재 작성 이란 계승 관계 에서 방법의 이름 이 같 고 매개 변수의 목록 도 같다 는 것 을 말한다.
    다시 쓰기 (Override) 와 다시 불 러 오기 (Overload) 의 차이 점:
  • Override: 방법의 이름 이 같 고 매개 변수 목록 도 같 으 며 덮어 쓰기, 덮어 쓰기
  • 라 고도 합 니 다.
  • Overload: 방법의 이름 이 같 고 매개 변수 목록 이 다 릅 니 다
  • 방법 덮어 쓰기 주의사항:
  • 부자 류 간 의 방법 명칭 이 같 고 매개 변수 목록 도 같 아야 한다
  • @ Override 는 방법 앞 에 만 쓰 여 있 습 니 다. 올 바른 방법 으로 덮어 쓰 는 지 확인 합 니 다.
  • 하위 클래스 방법의 반환 값 은 부모 클래스 방법 과 같은 반환 값 범위
  • 보다 작 아야 합 니 다.
  • 하위 클래스 방법의 권한 은 부모 클래스 방법 과 같은 권한 수정자 보다 커 야 합 니 다: Public > proctected > (default) > private
  • class Employee {
         
        String name;
        int ID = 111;
    
        public void showInfo(){
         
            System.out.println("ID is: " + ID);
            System.out.println("name is: " + name);
        }
    }
    
    class Teacher extends Employee{
         
        int ID = 100;
        String classroom = "CS";
        int salary = 10000;
    
        @Override
        public void showInfo() {
         
            System.out.println("ID is: " + ID);
            System.out.println("name is: " + name);
            System.out.println("classroom is: " + classroom);
            System.out.println("salary is: " + salary);
        }
    }
    
    public class OverrideTest {
         
        public static void main(String[] args) {
         
            Teacher t = new Teacher();
            t.showInfo();
            /*
            ID is: 100
            name is: null
            classroom is: CS
            salary is: 10000
             */
        }
    }
    

    구조 적 접근
    계승 관계 에서 부자 류 구조 방법의 방문 특징:
  • 하위 구조 방법 중 기본 적 인 '슈퍼 ()' 호출 이 있 기 때문에 반드시 먼저 부모 구 조 를 호출 한 다음 에 하위 구조
  • 를 집행 해 야 한다.
  • 하위 클래스 호출 은 슈퍼 키 워드 를 통 해 부모 클래스 구조 방법
  • 을 호출 할 수 있 습 니 다.
  • 슈퍼 의 부류 구조 호출 은 반드시 하위 구조 방법의 첫 번 째 문장 이 어야 하 며, 하위 구 조 는 여러 번 슈퍼 구 조 를 호출 할 수 없다
  • 하위 클래스 는 부모 구조 방법 을 사용 해 야 하 며, 쓰 지 않 으 면 기본 으로 슈퍼 () 를 증정 합 니 다.쓰 면 지정 한 슈퍼 호출 을 사용 합 니 다. 슈퍼 는 하나 밖 에 없 으 며 첫 번 째
  • 여야 합 니 다.
    public class Employee {
         
        String name;
        int ID = 111;
        String school = "STU";
    
        public Employee(){
         
            System.out.println("Employee constructor...");
        }
    }
    
    class Teacher extends Employee{
         
        public Teacher(){
         
            super();
            System.out.println("Teacher constructor...");
        }
    }
    
    public class ExtendsTest3 {
         
        public static void main(String[] args) {
         
            Teacher t = new Teacher();
            // Employee constructor...
            //Teacher constructor...
    }
    
    

    슈퍼 키워드 의 용법
  • 하위 클래스 의 구성원 방법 에서 부모 클래스 의 구성원 변 수 를 방문 합 니 다
  • 하위 클래스 의 구성원 방법 에서 부모 클래스 의 구성원 을 방문 하 는 방법
  • 자 류 의 구조 방법 에서 부 류 를 방문 하 는 구조 방법
  • class Employee {
         
        String name;
        int ID = 111;
        String school = "STU";
    
        public void showInfo(){
         
            System.out.println("ID is: " + ID);
            System.out.println("name is: " + name);
        }
    }
    
    class Teacher extends Employee{
         
        public Teacher(){
         
            super();
            System.out.println("Teacher constructor...");
        }
        
        public void getFatherInfo(){
         
            System.out.println(super.school);
            super.showInfo();
        }
    }
    
    public class ExtendsTest3 {
         
        public static void main(String[] args) {
         
            Teacher t = new Teacher();
            t.getFatherInfo();
            /*
            STU
            ID is: 111
            name is: null
             */
        }
    }
    

    this 키워드 용법
  • 본 유형의 구성원 방법 에서 본 유형의 구성원 변 수 를 방문 합 니 다
  • 본 유형의 구성원 방법 에서 본 유형의 다른 구성원 을 방문 하 는 방법
  • 본 유형의 구조 방법 에서 다른 구조 방법 을 방문 하고
  • this (...) 호출 은 반드시 구조 방법의 첫 번 째 문구 이 고 유일한
  • 슈퍼 와 this 두 가지 구 조 를 동시에 사용 할 수 없다

  • 자바 의 this 키워드
    중요 특징
  • 자바 는 단독 계승 이 고 한 유형의 직접 부 류 는 하나
    class A{
           }
    class B extends A{
           } //   
    class C{
           }
    class D extends A, C{
           } //  
    
  • 만 있 을 수 있다.
  • 자바 언어 다단 계 계승 가능
    class A{
           }
    class B extends A{
           } //  
    class C extends B{
           } //  
    
  • 한 자 류 의 직접 부 류 는 유일한 것 이지 만 한 부 류 는 많은 자 류
    class A{
           }
    class B extends A{
           } //  
    class C extends A{
           } //   
    
  • 를 가 질 수 있다.

    좋은 웹페이지 즐겨찾기