Java는 다중 상속을 허용하지 않지만 다중 인터페이스를 구현할 수 있습니다. 왜?
답변
인터페이스 만 지정하기 때문에 어떤 클래스가 아니라하고있다 어떻게 그것을하고있다.
다중 상속의 문제점은 두 클래스가 동일한 작업을 수행하는 다른 방법 을 정의 할 수 있으며 서브 클래스는 선택할 방법을 선택할 수 없다는 것입니다.
답변
내 대학 강사 중 한 명이이 방법을 설명했습니다.
토스터 인 클래스 하나와 NuclearBomb 클래스가 있다고 가정 해 봅시다. 둘 다 “어둠”설정이있을 수 있습니다. 둘 다 on () 메소드를 가지고 있습니다. (하나는 off ()를 가지고 있고 다른 하나는 그렇지 않습니다.) 둘 다의 서브 클래스 인 클래스를 만들려면 여기에서 볼 수 있듯이 이것은 실제로 내 얼굴을 날려 버릴 수있는 문제입니다. .
따라서 주요 문제 중 하나는 부모 클래스가 두 개인 경우 강사의 예에서와 같이 동일한 기능의 다른 구현 또는 동일한 이름을 가진 두 개의 다른 기능을 가질 수 있다는 것입니다. 그런 다음 서브 클래스에서 사용할 클래스를 결정해야합니다. 이를 처리하는 방법은 확실히 있습니다. C ++도 마찬가지입니다. 그러나 Java 설계자들은 이것이 너무 복잡해질 것이라고 생각했습니다.
그러나 인터페이스를 사용하면 다른 클래스의 방법을 빌려주는 대신 클래스가 수행 할 수있는 것을 설명합니다. 다중 인터페이스는 다중 상위 클래스보다 해결해야하는 까다로운 충돌을 유발할 가능성이 훨씬 낮습니다.
답변
“이봐, 그 방법은 유용 해 보인다. 나는 그 클래스도 확장 할 것이다”라고 말할 수 없을 때에도 상속이 과도하게 사용되기 때문이다 .
public class MyGodClass extends AppDomainObject, HttpServlet, MouseAdapter,
AbstractTableModel, AbstractListModel, AbstractList, AbstractMap, ...
답변
이 질문에 대한 답은 java 컴파일러 (생성자 체인)의 내부 작업에 있습니다.
Java 컴파일러의 내부 작업을 보면 :
public class Bank {
public void printBankBalance(){
System.out.println("10k");
}
}
class SBI extends Bank{
public void printBankBalance(){
System.out.println("20k");
}
}
이 컴파일 후 다음과 같습니다
public class Bank {
public Bank(){
super();
}
public void printBankBalance(){
System.out.println("10k");
}
}
class SBI extends Bank {
SBI(){
super();
}
public void printBankBalance(){
System.out.println("20k");
}
}
클래스를 확장하고 그 객체를 만들면 하나의 생성자 체인이 Object
클래스 까지 실행됩니다 .
위의 코드는 정상적으로 실행됩니다. 그러나 Car
확장 이라는 다른 클래스 Bank
와 하나의 하이브리드 (다중 상속) 클래스 가 있다면 SBICar
:
class Car extends Bank {
Car() {
super();
}
public void run(){
System.out.println("99Km/h");
}
}
class SBICar extends Bank, Car {
SBICar() {
super(); //NOTE: compile time ambiguity.
}
public void run() {
System.out.println("99Km/h");
}
public void printBankBalance(){
System.out.println("20k");
}
}
이 경우 (SBICar)는 생성자 체인을 생성하지 못합니다 ( 컴파일 시간 모호성 ).
인터페이스의 경우 객체를 만들 수 없으므로 허용됩니다.
새로운 개념 default
과 static
방법 에 대해서는 인터페이스에서 기본값을 참조하십시오 .
이것이 쿼리를 해결할 수 있기를 바랍니다. 감사.
답변
여러 인터페이스를 구현하는 것은 매우 유용하며 언어 구현 자나 프로그래머에게 많은 문제를 일으키지 않습니다. 따라서 허용됩니다. 다중 상속도 유용하지만 사용자에게 심각한 문제를 일으킬 수 있습니다 ( 사망의 다이아몬드 ). 그리고 다중 상속으로 수행하는 대부분의 작업은 구성 또는 내부 클래스를 사용하여 수행 할 수도 있습니다. 따라서 여러 상속은 이익보다 더 많은 문제를 일으키는 것으로 금지됩니다.
답변
다중 상속에 대한 오라클 문서 페이지에서이 쿼리에 대한 정확한 답변을 찾을 수 있습니다.
-
다중 상태 상속 : 여러 클래스에서 필드를 상속하는 기능
Java 프로그래밍 언어로 인해 둘 이상의 클래스를 확장 할 수없는 한 가지 이유는 여러 클래스에서 필드를 상속 할 수있는 다중 상태 상속 문제를 피하기위한 것입니다.
다중 상속이 허용되고 해당 클래스를 인스턴스화하여 객체를 만들면 해당 객체는 모든 클래스의 수퍼 클래스에서 필드를 상속합니다. 두 가지 문제가 발생합니다.
- 다른 수퍼 클래스의 메소드 또는 생성자가 동일한 필드를 인스턴스화하면 어떻게됩니까?
- 어떤 메소드 또는 생성자가 우선합니까?
-
다중 구현 상속 : 다중 클래스에서 메소드 정의를 상속하는 기능
이 접근 방식의 문제점 : 이름 충돌 및 모호성 . 서브 클래스와 수퍼 클래스에 동일한 메소드 이름 (및 서명)이 포함되어 있으면 컴파일러는 호출 할 버전을 판별 할 수 없습니다.
그러나 Java는 Java 8 릴리스 이후에 도입 된 기본 메소드를 사용 하여 이러한 유형의 다중 상속을 지원합니다 . Java 컴파일러는 특정 클래스가 사용하는 기본 메소드를 판별하기위한 규칙을 제공합니다.
다이아몬드 문제 해결에 대한 자세한 내용은 아래 SE 게시물을 참조하십시오.
-
다중 상속 유형 : 하나 이상의 인터페이스를 구현할 수있는 클래스의 기능.
인터페이스에 변경 가능한 필드가 포함되어 있지 않으므로 여기에서 다중 상태 상속으로 인해 발생하는 문제에 대해 걱정할 필요가 없습니다.
답변
객체 상태는 필드의 필드와 관련하여 참조되며 너무 많은 클래스가 상속되면 모호해질 수 있습니다. 여기 링크가 있습니다
http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html
