Java의 다태적 개념을 한층 더 이해하다
1) 컴파일 시 다태성
여러 개의 동명 방법에 대해 컴파일할 때 동명 방법 중 어느 것을 실행할 수 있는지 확정할 수 있다면 컴파일할 때의 다태성이라고 한다.
2) 런타임 멀티태스킹
만약 컴파일할 때 확정할 수 없다면, 실행할 때만 여러 개의 동명 방법 중 어느 것을 실행할 것인지를 확정할 수 있으며, 이를 실행할 때의 다태성이라고 부른다.
메서드 덮어쓰기는 두 가지 다태성을 나타냅니다. 대상이 이 클래스의 실례를 얻을 때, 컴파일할 때 다태성, 그렇지 않으면 실행할 때 다태성, 예를 들어
XXXX x1 = new XXXX(매개변수 목록);//객체는 참조된 인스턴스 유형과 일치하는 클래스 인스턴스를 가져옵니다.
XXX xx1 = new XXX(매개변수 목록);
x1.toString();//컴파일할 때 다태적, XXX 클래스를 실행하는 방법.
xx1.toString();//컴파일할 때 다태적, XXX 클래스를 덮어쓰는 방법을 실행합니다.
XXXX는 XXX의 부류입니다.
하위 클래스 대상은 상위 클래스 대상이기 때문에 상위 클래스와 하위 클래스 대상 사이에는 부여 상용성이 있기 때문에 상위 클래스 대상은 하위 클래스 대상으로 부여될 수 있다.예를 들어,
XXXX x 2 = new XXX(매개변수 목록);//상위 객체는 하위 클래스 인스턴스를 가져옵니다. 하위 클래스 객체는 상위 클래스 객체입니다.
x2.toString();//런타임 멀티태스킹
x2 상위 클래스로 선언되었지만 하위 클래스 XXX의 실례를 얻었다면 x2.toString()은 상위 클래스 방법을 실행합니까 아니면 하위 클래스 덮어쓰기를 실행합니까?
이것은 두 가지 상황으로 나뉜다.
하위 클래스가 상위 클래스 방법을 덮어쓰는지에 따라 다릅니다.하위 클래스가 상위 클래스 방법을 덮어쓰면 하위 클래스 방법을 실행합니다.
덮어쓰지 않으면 상위 방법을 실행합니다.
컴파일할 때 대상이 속한 클래스에만 근거하여 시스템은 도대체 그 클래스를 실행해야 하는 방법을 확정할 수 없고 실행할 때만 확정할 수 있기 때문에 이것은 실행할 때 다태적이다.
상위 객체는 모든 하위 클래스 방법을 수행할 수 없으며 상위 클래스에서\하위 클래스 덮어쓰기를 선언하는 하위 클래스 방법만 수행할 수 있습니다.
java 다중 구현
자바의 다태는 c++와 마찬가지로 동적 귀속이나 실행할 때 귀속을 통해 이루어진다.어떤 대상을 인용하는 방법을 호출할 때, 컴파일러는 이 인용이 변수 설명을 가리킬 때 설명하는 형식의 대상인지, 이 형식의 하위 클래스의 대상인지 알지 못하기 때문이다.따라서 컴파일러는 이번 호출을 위해 구체적인 어떤 방법에 연결할 수 없습니다.자바에서 실행할 때 형식인식(RTT)을 통해 실행할 때 구체적인 방법으로 귀속시키는 방법
방법의 다시 쓰기overriding과 방법의 다시 불러오기overloading은java다태의 다른 표현이다.다시 쓰기overriding은 부류와 자류 간의 다태적인 표현이고 다시 불러오기overloading은 부류 중의 다태적인 표현이다.
구체적인 예를 들다.
class People {
public String toString() {
return "I am a people!";
}
public void eat() {
};
public void speak() {
};
}
class Boy extends People {
public String toString() {
return "I am a boy!";
}
public void fight() {
};
public void speak() {
};
}
class Girl extends People {
public String toString() {
return "I am a girl!";
}
public void sing() {
};
public void speak() {
};
}
public class TestToString {
public static void main(String args[]) {
People p = new Girl();
System.out.println(p.toString());
}
}
실행 결과:
I am a girl!
p는 People의 인용이지만 실행할 때 Girl 대상이기 때문에 Girl의 toString 방법을 사용합니다자바 다태를 깊이 이해하다
성명, 여기에 다른 학생의 예를 참고, 원문 링크:http://blog.csdn.net/thinkghoster/article/details/2307001
테스트 문제
class A {
public String show(D obj) {
return "A and D";
}
public String show(A obj) {
return "A and A";
}
}
class B extends A {
public String show(B obj) {
return "B and B";
}
public String show(A obj) {
return "B and A";
}
}
class C extends B {
}
class D extends B {
}
public class Main {
public static void main(String args[]) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); // 1
System.out.println(a1.show(c)); // 2
System.out.println(a1.show(d)); // 3
System.out.println(a2.show(b)); // 4
System.out.println(a2.show(c)); // 5
System.out.println(a2.show(d)); // 6
System.out.println(b.show(b)); // 7
System.out.println(b.show(c)); // 8
System.out.println(b.show(d)); // 9
}
}
답안
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
A and D
해석나는 이 문제를 하기 시작했다. 4, 5, 6, 9가 모두 잘못했다. 그 이유는 자바의 다태성을 잘 이해하지 못했기 때문이다. 여기서 설명한다.
우선, 재작성과 재부팅을 깊이 이해해야 한다. 재작성은 함수 명칭이 같을 뿐만 아니라 매개 변수 형식과 반환값 형식도 포함한다
그 다음에 이 말을 깊이 이해한다. "초클래스 대상이 변수를 인용하여 하위 클래스 대상을 인용할 때 인용된 대상의 유형이 아니라 인용된 변수의 유형이 누구의 구성원을 호출하는 방법을 결정하지만 이 호출된 방법은 반드시 초클래스에서 정의된 것이다. 즉, 하위 클래스에 다시 쓰는 방법이다."
그리고 나서 우리는 이 몇 가지 문제를 분석하고 있다
문제: B가 부류 A의 쇼 방법을 다시 썼다고 생각합니까?만약 다시 썼다면, 몇 개를 다시 썼습니까?
답안: 다시 썼습니다. 다시 썼습니다. 즉, public String show(A obj)입니다. 왜 public String show(B obj)는 부류를 다시 쓰는 방법이 아닙니까? 간단합니다. 파라미터 유형이 다르기 때문입니다.
예제 분석
위의 분석을 보면 우리도 두 가지 예를 분석한다.
하나, a2.show(b):
a2는 인용 변수로 유형은 A이고 b는 B의 실례이다.우선, 클래스 A에서 show(B obj)를 찾았지만 찾지 못했습니다.그래서 A의 초클래스에서 찾았는데 A가 초클래스가 없어서 A.this(슈퍼)B), (슈퍼)B가 A로 바뀌었기 때문에 A에서 쇼(A obj) 방법을 찾았지만 a2가 인용한 클래스 B의 한 대상으로 B가 A의 쇼(A obj) 방법을 다시 썼기 때문에 최종적으로 클래스 B의 쇼(A obj)로 잠그고 출력은'B and A'로 정했다
a2.show(c):
a2는 인용 변수로 유형은 A이고 b는 B의 실례이다.우선, 클래스 A에서 쇼(C obj)를 찾았지만 찾지 못했습니다.그래서 A의 초클래스에서 찾았는데 A가 초클래스가 없어서 A.this((슈퍼)C), (슈퍼)C가 B로 바뀌었어요. 여기까지, 이 a2.show(c)가 a2로 변했다.show(b)의 문제, 그리고 a2.show(b) 위에서 "B and A"출력이라고 분석했기 때문에 여기도 "B and 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에 따라 라이센스가 부여됩니다.