2014-04-17 4 views
0
import java.util.Arrays; 
class B { 

    int i; 

    B(int i) { 
    this.i = i; 
    } 

    public String toString() { 
      return "i = " + this.i; 
     } 
} 

public class MainClass{ 

     public static void main(String[] args) { 
      B [] x = new B[2]; 
      x[0] = new B(90); 
      x[1] = new B(100); 
      B obj = new B(10); 
      System.out.println(obj); 
        System.out.println(x);//toString method of class B is not called here. 

    } 
} 

// obj를 인쇄 할 때 B 클래스의 toString 메서드가 호출되었지만 x를 인쇄하려고했을 때 아무 것도 설명하지 못했습니다 !!!배열 자바의 미묘한 동작

답변

1

는 사실, Array 클래스의 toString 메서드가 호출 된 시도하고 배열 개체 toString()을 무시하지 않습니다 - 그래서 당신은 클래스 이름과 (본질적으로) 참조 주소를 얻는다. 당신이 원했던 것은 아마도 Arrays.toString(Object[])이었을 것입니다 - 그렇게,

// System.out.println(x); // <-- calls toString of java.lang.Array 
System.out.println(Arrays.toString(x)); 
+0

Arrays.toString (x) 올바른 정보가 인쇄 된 후에 알 수 있습니다.하지만 x를 인쇄했을 때 B 클래스의 toString() 메서드를 호출하지 않는 이유는 무엇입니까? – Aamir

+0

@Aamir 더 직접적으로 대답하도록 수정되었습니다. –

+0

고마워, 이제 알았다. !! – Aamir

0

Java는 배열 구성원에서 toString을 자동으로 호출하지 않습니다. 언급 한 바와 같이 here, 당신은 Arrays.toString(x)을 원합니다.

0

배열의 개별 요소가 아닌 배열 자체를 인쇄하기 때문입니다. 배열은 객체이기도하지만 toString() from Object을 덮어 쓰지 않습니다.

System.out.println(Arrays.toString(x)); 
+0

조심하세요! Java 배열은 일반적으로 객체 유형이지만 Java 언어 스펙에 정의 된대로 _Objects_가 아닙니다. –

+0

@jameslarge'x instanceof Object'는 어떤 결과를 낳습니까? '사실'. – rgettman

+0

@ jameslarge 왜 그렇게 생각하니? –