2012-12-02 2 views
3

나는 자바에서 상속 주위에 내 머리를 싸려고 해요. 지금까지 나는 다음과 같은 방식으로 객체를 선언하면 이해했다 : Superclass object = new Subclass() 생성 된 자식 객체는 부모 객체의 메소드로 제한된다. 아이의 추가 메소드에 액세스하려면 아이에게 전송해야합니다. 그러나 자식 클래스에서 여전히 메서드가 재정의됩니다.Java 상속 초보자를위한

여기

public class Parent { 

    public Parent() {  

    } 

    public void whoAmI(){  
     System.out.println("I'm a parent"); 
    } 

} 
public class Child extends Parent { 

public Child() {   

} 

public void whoAmI(){  
    System.out.println("I'm a child"); 
} 

public void childMethode() { 
    System.out.println("Foo"); 

} 
} 

public class Test { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    List<Parent> list = new ArrayList<>();  

    Child c = new Child(); 
    Parent p = new Parent(); 
    Parent pc = new Child(); 

    c.whoAmI(); 
    p.whoAmI(); 
    pc.whoAmI(); 

    // Access child methodess 
    ((Child) pc).childMethode(); 

    list.add(c);  
    list.add(p); 
    list.add(pc); 

    System.out.println(list.size()); 

} 

} 

pc.whoAmI() 인쇄 "나는 아이 해요"내 예입니다. 왜 나는 "나는 부모"라고 인쇄하지 않습니까?

+0

[이 기사] (http://javarevisited.blogspot.com/2011/08/what-is-polymorphism-in-java-example.html)도 도움이 될 수 있습니다. – Pshemo

+0

논리적으로는 실제 객체 메소드를 호출하는 것이 좋습니다 . 아래 예제를 참조하십시오 –

답변

1

왜 대답하기 어려운 질문입니까? 오랜 시간 전에 Java 팀이 디자인 결정을 내 렸습니다.

그들은 정적으로 명시 적으로 표시되지 않는 한 모든 방법이 virtual 인 것으로 결정했습니다. 일부 언어에서는 다른 방법이 있습니다 (가상으로 선언하지 않는 한 메서드는 기본적으로 정적입니다), 실제로 차이가 없습니다.

중요한 것은 how static and virtual methods work을 이해하는 것입니다. (또는 때때로 Java로 호출되기도합니다 : 인스턴스 및 클래스/정적 메서드)

1

상속은 super이라는 숨겨진 멤버를 만드는 것으로 상상할 수 있습니다.

Java의 각 객체 인스턴스에는 자체 상수 유형이 있습니다. 캐스팅하는 동안 변경하지 마십시오. 캐스팅하는 동안 Java에이 객체가 하위 유형임을 확신한다고 말하면됩니다.

재정의 된 메소드가 여전히 오버라이드 된 채로 남아 있습니다. 이는 Java의 이데올로기입니다. C++을 알고 있다면 Java의 모든 기능이 가상이라고 말할 수 있습니다.

4

혼란을 피하기 위해 을 만드는 하위 클래스 개체에는 항상 모든 메서드이 포함되어 있음을 이해해야합니다. 다운 캐스팅은 아무 작업도 아닙니다. 하위 유형의 인스턴스와 동일한 객체를 처리하면됩니다.

결론 : 사용자는 다운 캐스팅을 통해 결코 개체의 동작을 변경할 수 없습니다. 이것은 바로 위에서와 같이 항상 동일한 오버라이드 메소드에 액세스하고 슈퍼 클래스의 메소드에는 액세스하지 않습니다.

이러한 종류의 동작을 통해 동일한 선언 된 상위 유형에 대해 다른 동작을 대체 할 수 있습니다. 다형성이라고하며, 일반적으로 Java 프로그래밍 및 OOP의 핵심 요소입니다. 그것 없이는 우선 클래스 계층 구조를 갖는 것이 중요하지 않습니다. 적어도, 그것은 훨씬 덜 유용 할 것입니다.

+0

감사합니다. 그래서 부모 pc = new Child()를 선언함으로써; PC는 여전히 additonal 자식 methode을 가지고 있지만 그것을 액세스 할 수없는, 오른쪽? whoAmI 메소드는 자바 작성자가 상상 한 방식이기 때문에 항상 무시됩니다. – user1870482

+0

스몰 토크에 이르기까지 모든 OOP의 초석이기 때문에 자바 크리에이터가 생각하는 것보다 조금 더 낫습니다. 예, 모든 메소드가 있으며, 변수 유형으로 선언되지 않은 메소드를 호출하는 코드 컴파일을 거부하는 것은 컴파일러뿐입니다. –

0
class Person{ 

    public void run(){ 
     //running 

    } 

} 

class OneLeggedPerson extends Person{ 
    @Override 
    public void run(){ 
     //cant run have only one leg 
    } 
} 


Person p = new OneLeggedPerson(); 
p.run(); //cannot as it is actually a one legged person 


Hope that makes sense now.. 
0

여러분이 Apple이고 iPod을 판매하고 있다고 가정 해 보겠습니다.

프로세스가 변경 되었기 때문에 하나의 팩토리와 다른 팩토리간에 또는 iPod 모델의 첫 번째 릴리스와 마지막 모델 사이에 iPod을 만드는 방식에 약간의 차이가있을 수 있습니다.

당신, 애플, 빌드 아이팟의 종류를 알고

IPodWithFirstWayOfBuildingIt ipod = new IPodWithFirstWayOfBuildingIt(); 

또는

IPodWithSecondWayOfBuildingIt ipod = new IPodWithSecondWayOfBuildingIt(); 

그러나 최종 고객 (즉, 코드의 나머지 부분)은 iPod이 만들어지는 방식에 관해서 똥을주지 않는다. 아이팟이 중요하게 생각하는 점은 아이포드가 마치 아이포드처럼 작동한다는 것입니다 (광고 나 최종 사용자 매뉴얼 또는 아이팟 클래스의 자바 독에서 보여지는 방식). 그는 매장에 "나에게 첫 번째 방법으로 iPod을 줘"라고 부탁하지 않습니다. 그러나 실제로 아이팟을 만드는 첫 번째 방법이나 아이팟을 만드는 두 번째 방법으로 아이팟을 얻는다. 그리고 그는 그것을 호출 사실은 "아이팟은"따라서, 아이팟 내장 된 방법을 변경하지 않습니다

IPod iPod = new IPodWithFirstWayOfBuildingIt(); 

그런 말을 할 수있는 방법입니다. 먼저 iPod을 제작하는 첫 번째 방법으로 iPod을 제작합니다. 그러나 iPod을 어떻게 제작했는지에 상관없이 다른 iPod과 마찬가지로 사용할 것입니다.