자바 의 계승 을 얕 게 이해 하 다
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에 따라 라이센스가 부여됩니다.