나는 오늘 모듈 오픈 북 시험의 끝 에서이 질문을 받았으며 자신을 잃어 버렸습니다. 나는 읽고 Head first Java
있었고 두 정의는 정확히 같은 것처럼 보였다. 나는 내 자신의 마음에 대한 주요 차이점이 무엇인지 궁금해하고있었습니다. 나는 이것과 비슷한 질문이 많이 있다는 것을 알고 있지만 결정적인 대답을 제공하는 것은 없습니다.
나는 오늘 모듈 오픈 북 시험의 끝 에서이 질문을 받았으며 자신을 잃어 버렸습니다. 나는 읽고 Head first Java
있었고 두 정의는 정확히 같은 것처럼 보였다. 나는 내 자신의 마음에 대한 주요 차이점이 무엇인지 궁금해하고있었습니다. 나는 이것과 비슷한 질문이 많이 있다는 것을 알고 있지만 결정적인 대답을 제공하는 것은 없습니다.
답변:
상속은 '클래스'가 기존 '클래스'에서 파생 될 때입니다. 당신은이 그렇다면 Person
클래스를, 당신은이 Student
확장 클래스는 Person
, Student
상속 모든 것을 Person
가지고있다. 직접 필드 / 메소드에 입력 한 액세스 수정 자에 대한 세부 사항이 있지만 이것이 기본 아이디어입니다. 예를 들어, 당신이 개인 필드가있는 경우 Person
, Student
그 개인 있기 때문에 그것을 볼, 민간 분야는 서브 클래스에 표시되지 않습니다.
다형성은 어떤 유형의 물건에 따라 프로그램이 어떤 방법을 사용해야하는지 결정합니다. 당신이있는 경우 Person
이있는, read
방법을, 당신은이 Student
확장되는 Person
고유의 구현이있는, read
당신이있는 경우에 따라 런타임에 의해 당신을 위해 결정 호출되는 방법, Person
또는를 Student
. 조금 까다로워 지지만 다음과 같은 일을하면
Person p = new Student();
p.read();
Student 의 read 메소드 가 호출됩니다. 그것이 다형성의 실천입니다. a Student
는 a 이므로 해당 할당을 수행 할 수 Person
있지만 런타임은 실제 유형 p
이 Student 인 것을 알기에 충분히 영리 합니다.
세부 사항은 언어마다 다릅니다. 예를 들어 자바 스크립트에서 상속을 수행 할 수 있지만 Java에서 작동하는 방식과 완전히 다릅니다.
Person
의 read
메소드가 공개 액세스 수정자를 사용하고 있다면 Student
객체가 액세스 할 수 없습니까? 그러면 Student s = new Student();
쉽지 않을까요? 나는 여전히 실제로 Polymporphism의 이점을 얻지 못합니다.
Person p = new Student();
대신에 사용하고 싶 Student p = new Student();
습니까?
상속 은 서브 클래스에서 수퍼 클래스 의 구조와 동작 을 사용하는 것을 말합니다 .
다형성 은 서브 클래스에서 수퍼 클래스 의 동작 을 변경하는 것을 말합니다 .
m
(모두 static
와 instance
의 슈퍼 ...의)는"(상속에 관한 자세한 사항은 다음에). 나에게 "코드 재사용"처럼 들린다.
import static
이러한 인터페이스의 오용을 제거하기 위해 도입 했습니다.) Java의 순수한 다형성을 위해 사용할 도구는 클래스 상속이 아닌 인터페이스입니다.
다형성 (Polymorphism) : 다른 유형의 물체를 비슷한 방식으로 처리하는 능력. 예 : 기린과 악어는 모두 동물이며 동물은 할 수 있습니다 Move
. 의 인스턴스가 있다면 어떤 종류의 동물인지 알거나 돌보지 않고 Animal
전화 할 수 있습니다 Move
.
상속 : 이것은 다형성과 코드 재사용을 동시에 달성하는 한 가지 방법입니다.
다형성의 다른 형태 : 다형성을 달성하는 다른 방법이 있습니다, 같은 단지 다형성하지만 코드 재사용을 제공하는 인터페이스로는 (때로는 코드는 다음과 같은 매우 다른 Move
뱀은 상당히 다른 것위한 Move
, 개가있는 경우 이 경우 인터페이스가 더 나은 다형성 선택이 될 것입니다.
다른 동적 인 언어에서, 다형은 Duck Typing으로 달성 할 수 있습니다.이 클래스는 동일한 기본 클래스 또는 인터페이스를 공유 할 필요가 없으며 동일한 이름의 메소드 만 있으면됩니다. 또는 Javascript와 같이 훨씬 역동적이므로 클래스가 전혀 필요하지 않으며 동일한 메소드 이름을 가진 객체 만 다형성으로 사용할 수 있습니다.
주요 차이점은 다형성이 상속의 특정 결과라는 것입니다. 다형성은 호출 할 메소드가 런타임에 오브젝트 유형에 따라 결정되는 위치입니다. 이것은 한 클래스가 다른 클래스를 상속하고 특정 메소드를 대체 할 때 발생하는 상황입니다. 그러나 일반 상속 트리에서는 메서드를 재정의 할 필요가 없으므로 모든 메서드 호출이 다형성 일 필요는 없습니다. 말이 돼? 그것은 모든 포드 차량과 자동차와 비슷한 문제이지만 모든 자동차가 포드는 아닙니다 (그러나 ....)는 아닙니다.
또한 다형성은 메소드 호출을 처리하지만 상속은 데이터 멤버 등을 설명합니다.
Java에서 두 가지는 밀접한 관련이 있습니다. Java가 "동적 디스패치"라는 메소드 호출 기술을 사용하기 때문입니다. 만약 내가 가지고 있다면
public class A {
public void draw() { ... }
public void spin() { ... }
}
public class B extends A {
public void draw() { ... }
public void bad() { ... }
}
...
A testObject = new B();
testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A
그러면 B가 상속하는 것을 볼 수 있습니다 spin
가 A로부터 있습니다. 그러나 객체를 마치 A 형인 것처럼 조작하려고하면 여전히 B의 동작이 나타납니다 draw
. draw
동작은 다형성이다.
일부 언어에서 다형성과 상속은 밀접한 관련이 없습니다. 예를 들어 C ++에서 virtual로 선언되지 않은 함수는 상속되지만 동적으로 전달되지 않으므로 상속을 사용할 때도 다형성 동작을 얻지 못합니다.
자바 스크립트에서 모든 함수 호출은 동적으로 전달되며 약한 입력이 있습니다. 즉, 각각 고유 한 draw
, 관련 객체를 반복하고 함수를 호출하는 함수를 가질 수 있으며 각각 정상적으로 작동합니다. 상속을받지 않고도 자신 만의 다형성 추첨을 할 수 있습니다.
다형성 : 펜을 판매하는 회사에서 일한다고 가정 해보십시오. 따라서 펜에 대해 알아야 할 모든 것을 처리하는 "펜"이라는 멋진 클래스를 만듭니다. 청구, 운송, 송장 작성을위한 모든 종류의 클래스를 Pen 클래스를 사용하여 작성합니다. 하루의 상사가 와서 "훌륭한 뉴스! 회사가 성장하고 있고 우리는 지금 Books & CD를 판매하고 있습니다!" Book & CD를 사용하기 위해 Pen을 사용하는 모든 클래스를 변경해야하기 때문에 좋은 소식은 아닙니다. 그러나 원래 "SellableProduct"라는 인터페이스를 만든 경우 Pen은이 인터페이스를 구현했습니다. 그런 다음 펜 대신 해당 인터페이스를 사용하기 위해 모든 배송, 송장 등의 클래스를 작성할 수 있습니다. 이제 SellableProduct 인터페이스를 구현하는 Book & CompactDisc라는 새 클래스를 작성하기 만하면됩니다. 다형성으로 인해 다른 모든 클래스는 변경없이 계속 작동 할 수 있습니다! 감지?
다형성을 달성하는 방법 중 하나 인 상속을 사용한다는 의미입니다.
다형성은 클래스 / 인터페이스에서 가능하지만 상속은 항상 2 개 이상의 클래스 / 인터페이스 사이에서 가능합니다. 상속은 항상 "is-a"관계를 따르는 반면, 항상 다형성 ( "is-a"/ "has-a"관계를 모두 준수 할 수있는)과 다를 수 있습니다.
상속은 더 정적 인 것입니다 (한 클래스는 다른 클래스를 확장합니다) 반면 다형성은 동적 / 런타임 것입니다 (객체는 정적 / 선언 유형이 아닌 동적 / 런타임 유형에 따라 동작합니다).
예 :
// This assignment is possible because B extends A
A a = new B();
// polymorphic call/ access
a.foo();
-> a의 정적 / 선언 유형은 A이지만 실제 동적 / 런타임 유형은 B이므로 a.foo ()는 A가 아닌 B에 정의 된대로 foo를 실행합니다.
상속은 코드 재사용과 관련된 개념입니다. 예를 들어 부모 클래스가 있다면Animal
그것은 특정 속성과 메소드 (이 예제의 말에 포함 makeNoise()
와 sleep()
) 나는라는 두 개의 하위 클래스를 생성 Dog
하고 Cat
. 개와 고양이 모두 같은 방식으로 잠들기 때문에 (부정적이라고 가정) 부모 클래스가 제공 sleep()
하는 Dog
및 Cat
하위 클래스 의 메소드에 더 많은 기능을 추가 할 필요가 없습니다 Animal
. 그러나 Dog
짖는 소리와 Cat
야옹은Animal
클래스에는 소음을내는 방법이있을 수 있으며, 개와 고양이는 서로 다른 동물에 대해 다른 소음을냅니다. 따라서 특정 유형에 따라 해당 동작을 재정의해야합니다. 따라서 다형성의 정의. 도움이 되었기를 바랍니다.
오라클 문서는 그 차이를 정확하게 인용했습니다.
상속 : 클래스는 직접적이든 간접적이든 상관없이 모든 수퍼 클래스에서 필드와 메소드 를 상속 합니다 . 서브 클래스는 상속하는 메소드를 대체하거나 상속하는 필드 나 메소드를 숨길 수 있습니다 . 필드를 숨기는 것은 일반적으로 나쁜 프로그래밍 관행입니다.
다형성 (polymorphism) : 다형성 (polymorphism) 은 유기체 또는 종이 다양한 형태 나 단계를 가질 수있는 생물학의 원리를 말합니다. 이 원칙은 객체 지향 프로그래밍 및 Java 언어와 같은 언어에도 적용될 수 있습니다. 클래스의 서브 클래스는 고유 한 동작을 정의 할 수 있지만 부모 클래스와 동일한 기능 중 일부를 공유 할 수 있습니다.
다형성 은 필드에 적용 할 수 없습니다.
관련 게시물 :
상속은 일종의 다형성이며, 사실 상속은 동적 다형성입니다. 따라서 상속을 제거하면 더 이상 재정의 할 수 없습니다.
함께 상속 구현은 슈퍼 클래스에 정의되어있다 - 그렇게 행동이 상속됩니다.
class Animal
{
double location;
void move(double newLocation)
{
location = newLocation;
}
}
class Dog extends Animal;
함께 다형성 때문에 단지 - 구현은 하위 클래스에 정의 된 인터페이스가 상속됩니다.
interface Animal
{
void move(double newLocation);
}
class Dog implements Animal
{
double location;
void move(double newLocation)
{
location = newLocation;
}
}
다형성 은의 상속 에 의해 달성됩니다 Java
.
├── Animal
└── (instances)
├── Cat
├── Hamster
├── Lion
└── Moose
├── interface-for-diet
│ ├── Carnivore
│ └── Herbivore
├── interface-for-habitat
│ ├── Pet
│ └── Wild
public class Animal {
void breath() {
};
}
public interface Carnivore {
void loveMeat();
}
public interface Herbivore {
void loveGreens();
}
public interface Pet {
void liveInside();
}
public interface Wild {
void liveOutside();
}
public class Hamster extends Animal implements Herbivore, Pet {
@Override
public void liveInside() {
System.out.println("I live in a cage and my neighbor is a Gerbil");
}
@Override
public void loveGreens() {
System.out.println("I eat Carrots, Grapes, Tomatoes, and More");
}
}
public class Cat extends Animal implements Carnivore, Pet {
@Override
public void liveInside() {
System.out.println("I live in a cage and my neighbr is a Gerbil");
}
@Override
public void loveMeat() {
System.out.println("I eat Tuna, Chicken, and More");
}
}
public class Moose extends Animal implements Herbivore, Wild {
@Override
public void liveOutside() {
System.out.println("I live in the forest");
}
@Override
public void loveGreens() {
System.out.println("I eat grass");
}
}
public class Lion extends Animal implements Carnivore, Wild {
@Override
public void liveOutside() {
System.out.println("I live in the forest");
}
@Override
public void loveMeat() {
System.out.println("I eat Moose");
}
}
Hamster
클래스 상속의 구조 에서 Animal
, Herbivore
그리고 Pet
전시하는 다형성의 행동주의를 국내 애완 동물을.
Cat
클래스 상속 구조 에서 Animal
, Carnivore
그리고 Pet
에 또한 전시 다형성 행동주의 국내 애완 동물을.