자바 의 계승 을 얕 게 이해 하 다
                                            
 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
    }
}
  그 중에서 계승 에는 몇 가지 중요 한 개념 이 포함 되 어 있다.
public class      extends     {
     }
  동시에 계승 관계 에는 다음 과 같은 특징 이 있다.
구성원 변수의 접근
부자 류 의 계승 관계 에서 구성원 변수 가 이름 을 바 꾸 면 하위 클래스 대상 을 만 들 때 두 가지 방식 으로 접근 합 니 다.
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 입 니 다.이름 변경 변수의 사용
하위 클래스 의 실현 에 있어 서 계승 하 는 부모 클래스 의 구성원 변수, 자신의 구성원 변수 와 자신의 구성원 방법 중의 부분 변수 가 이름 을 바 꾸 는 상황 이 발생 할 수 있 습 니 다. 그러면 이름 을 바 꾸 는 변 수 를 사용 할 때 어떻게 구분 합 니까?서로 다른 변 수 를 대상 으로 다음 과 같이 구분 할 수 있 습 니 다.
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) 의 차이 점:
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 키워드
중요 특징
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{
       } //   
 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.