2013-04-27 5 views
0

초보자 질문이지만 변수 값을 읽는 방법에 대해 혼란 스러웠습니다.초기화시 변수 읽기

int a = 7; 

왼쪽이나 오른쪽으로 남겨 두겠습니까?

이 : X 그들의 슈퍼 클래스 인 경우

//X is a supper class of Y and Z which are sibblings. 
public class RunTimeCastDemo { 

    public static void main(String args[]) { 
      X x = new X(); 
      Y y = new Y(); 
      Z z = new Z(); 
      X xy = new Y(); // compiles ok (up the hierarchy) 
      X xz = new Z(); // compiles ok (up the hierarchy) 
      //  Y yz = new Z(); incompatible type (siblings) 
      //  Y y1 = new X(); X is not a Y 
      //  Z z1 = new X(); X is not a Z 
      X x1 = y; // compiles ok (y is subclass of X) 
      X x2 = z; // compiles ok (z is subclass of X) 
      Y y1 = (Y) x; // compiles ok but produces runtime error 
      Z z1 = (Z) x; // compiles ok but produces runtime error 
      Y y2 = (Y) x1; // compiles and runs ok (x1 is type Y) 
      Z z2 = (Z) x2; // compiles and runs ok (x2 is type Z) 
      //  Y y3 = (Y) z;  inconvertible types (siblings) 
      //  Z z3 = (Z) y;  inconvertible types (siblings) 
      Object o = z; 
      Object o1 = (Y) o; // compiles ok but produces runtime error 
     } 
    } 

내가 슈퍼 클래스는 = 새로운 서브 클래스가

X xy = new Y(); // compiles ok (up the hierarchy) 
    X xz = new Z(); // compiles ok (up the hierarchy) 

읽기 방법하지 않는다 (왜, 계층까지의 것 ?) 아래쪽에 있지 않아야합니까?)

+0

엄지 규칙은 항상 하위 유형 객체를 참조하기 위해 수퍼 유형 변수를 사용할 수 있다는 것입니다. –

+0

어떻게 읽습니까? 두 가지 선택이 있습니다 : a = 7 또는 7 = a. Java에서는 원시 정수를 재 할당 할 수 없으므로 한 방향 만 이해할 수 있습니다. –

+0

감사합니다 @DaveNewton하지만 변수에 대한 객체 할당을 처리하는 경우에는 어떻게해야합니까? 같은 일이 적용됩니까? EX : 수퍼 클래스 X = 서브 클래스 Y; X = 하위 클래스 Y 또는 Y = 수퍼 클래스 X로 읽을 수 있습니까? –

답변

2

... 변수의 값을 읽는 방법은 무엇입니까?

= (할당) 작업의 경우 오른쪽의 값이 계산되어 왼쪽의 변수에 저장됩니다. 따라서 귀하의 예에서는 7이 먼저 평가되어 a에 저장됩니다. 오른쪽이 더 복잡한 경우 왼쪽에있는 변수에 저장되기 전에 왼쪽에서 오른쪽으로 평가됩니다.

X가 상위 클래스 인 경우 왜 상위 계층일까요? 아래로 떨어지지 않아야합니까?

하위 클래스가 수퍼 클래스의 모든 기능을 구현하므로 하위 클래스를 수퍼 클래스로 저장할 수 있습니다. 따라서 X이 메서드 Test()을 정의하고 YX의 하위 클래스 인 경우 Y도이 메서드를 구현합니다. 따라서 YX의 기능을 모두 사용할 수 있기 때문에 Y의 인스턴스를 가지고 X에 대한 변수에 저장하면됩니다.

+0

그래, 나에게 그것을 명확하게 해줬지만, 나는 이것에 약간 혼란 스럽다. (위의 코드를 다시 참고하자) X xy = new Y(); // ok (계층 구조 위로) 컴파일 xy가 'type'X이지만 객체 Y를 참조하면 무엇을 의미합니까? xy는 모든 객체 Y의 메소드에 액세스 할 수 있습니까? 아니면 캐스트가 필요합니까? –

+0

'X xy = new Y()'의 경우'xy'가'X' 타입이기 때문에'xy.YMethod()'를 캐스트없이 호출 할 수 있습니다. 'Y' 객체는'X' 변수에 저장 될 때 수정되지 않지만'X'y = newZ()'와 같이 할 수 있기 때문에 대소 문자가 필요합니다.'Z'도 마찬가지입니다. 'X'의 하위 클래스입니다. 그런 다음'((Y) xy) .YMethod()'를 실행하려고하면 객체 자체가'Z'이므로 캐스트가 실패합니다. 그래서 조금 붐비었지만, 간단히 말해, 객체가 상위 유형으로 저장되어 있다면, 하위 유형의 메소드에 액세스해야하는 경우 하위 유형으로 캐스팅해야합니다. –

+1

이 답변은 –