2015-02-06 2 views
0

저는 Java에서 근본적인 문제로 생각하는 것을 이해하는 데 어려움을 겪고 있습니다. 다음은 3 번 줄이 클래스 캐스트 예외에 기댈 수있는 대답입니다. 원래 a1이 객체 A의 배열을 가리키고 있다는 것을 알 수 있습니다. 그러나 1 행에서는 객체 B의 배열을 가리 키지 않습니다. 따라서 a1이 a를 가리키고 있다면 b를 가리 키지 않아야 하는가? Enthuware에서참고 자료 및 주조

설명 : -

프로그램은 라인에서 java.lang.ClassCastException가 발생합니다 3 실행시 레이블.

컴파일 중 서브 라인 참조에서 수퍼 클래스 참조로 지정되기 때문에 // 1 줄이 허용됩니다. 수퍼 클래스 참조가 서브 클래스 참조 변수에 지정되기 때문에 // 2 행이 필요합니다. 그리고 이것은 런타임에 작동합니다. 왜냐하면 a가 참조하는 객체가 실제로 B의 배열이기 때문입니다. 이제 // 3 행의 캐스트가 걱정하지 않도록 컴파일러에게 알려줍니다. 저는 좋은 프로그래머이고 내가 무엇인지 압니다. 슈퍼 클래스 참조 (a1)에 의해 참조되는 객체는 실제로 런타임에 클래스 B가됩니다. 따라서 컴파일 시간 오류가 없습니다. 실제 객체가 B의 배열이 아니라 A.

public static void main(String args[]) { 

    A[] a, a1; 
    B[] b; 
    a = new A[10]; 
    a1 = a; 
    b = new B[20]; 
    a = b;   //line 1 
    b = (B[]) a; //line 2 
    b = (B[]) a1; //line 3 

    } 

} 

class A { 
} 

class B extends A {} 
+0

http://stackoverflow.com/questions/ 1750106/how-can-i-use-pointers-in-java – chancea

답변

0

동일한 개체를 참조하는 변수가 여러 개인 경우 참조를 사용하여 개체의 변경을 수행 할 수 있지만 참조가 변경되면 해당 참조에만 영향을줍니다.

예에서 a와 a1은 동일한 배열을 참조합니다. 참조 된 객체 인 A의 배열을 수정하면 a 또는 a1을 사용하면 동일한 객체를 참조하기 때문에 동일합니다.

A[] a, a1; 
a = new A[10]; 
a1 = a; 
/* You can use a or a1 to modify the object with the same results. */ 
a[0] = new A(); /* Equivalent to a1[0] = new A() */ 

다른 개체를 참조하도록 변수를 수정하면 다른 참조는 변경되지 않습니다.

A[] a, a1; 
a = new A[10]; 
a1 = a; 
a = new A[15]; /* a1 still references the first array and a the new one */ 

개체 참조를 함수 매개 변수로 사용하면 비슷한 결과가 발생합니다. 방법보다 주어진

예를하려면 : 위의 메소드를 호출하면

public static void uselessMethod(A[] a) { 
    /* a is a local variable that makes reference to the object, 
     modify the reference only has effect inside this method, 
     but modify the array has effects outside the method */ 
    a = null; 
} 

는 참조가 변경되지 않습니다 :

A[] a = new A[10]; 
uselessMethod(a); 
System.out.println(a.length); /* This will print 10 */ 
1

의 배열입니다 그리고 A1 A를 가리키고, 따라서 경우에하는 것은 지금 또한 B 지점으로 안 기 때문에 실행시에이 실패?

변수 값을 보유하고 다른 변수는 완전히 독립적이다. 한 변수의 값을 변경하면 해당 변수에만 영향을 미칩니다.

+0

답변 해 주셔서 감사합니다. 두 분 모두 도움이되었지만 David SN의 설명이 내가 명확하지 않은 부분을 확대한다고 생각합니다. – user4702831