2010-01-05 8 views

답변

9

자바 프로그래밍 언어의 배열에서 Java 언어 사양 says so :

때문에 (§4.3.1), 동적으로 생성되는 개체가 있으며, Object 형식 (§4.3의 변수에 할당 할 수있다. 2). Object 클래스의 모든 메서드는 배열에서 호출 할 수 있습니다.

그래서, C++과는 달리, 자바는 일류 개체로 진정한 배열을 제공합니다

  • length 회원이있다.
  • Object에 같은 이름의 메서드를 재정의하는 clone() 메서드가 있습니다.
  • 플러스 클래스 Object의 모든 구성원.
  • 범위를 벗어난 배열에 액세스하려고하면 예외가 throw됩니다.
  • 배열은 동적 메모리에 인스턴스화됩니다.
0

그 모든 혜택 :

  • getHashCode()
  • toString()

및 배열 그래서, '원시적'아니다 그들이 원시적 일 수 없다면, 그것들은 객체이어야한다.

+2

자바에서는 배열의 기본 hashCode 및 toString 구현 (즉, ID 해시 코드 및'[LFooBar; @ deadbeef')이 사용되므로 일반적으로별로 유용하지 않습니다. :-P –

0

공식적인 이유가 확실하지 않습니다.

그러나 길이가 걸리는 등 작업을 수행 할 수 있고 새 키워드를 도입하는 대신 이러한 작업을 멤버 함수로 지원하는 것이 더 적합하기 때문에 이들을 개체라고 생각합니다. 다른 작업에는 clone(), 객체의 상속 된 작업 등이 있습니다. 배열은 해시 가능하며 잠재적으로 비교 가능합니다.

이것은 배열이 기본적으로 메모리 오프셋에 대한 포인터 인 C (및 C++의 기본 배열)와는 다릅니다.

+1

실제로, Java 배열의 길이를 취하는 것은 조작이 아닙니다. 길이는 객체의 public 멤버입니다. –

+0

사실입니다. 왜 그들이 최종 getLength()에 넣지 않았는지 모르겠습니다. – Uri

+0

배열은 자연 순서를 사용하여 비교할 수 없지만 물론 그들과 함께 작동하는'Comparator'를 자유롭게 쓸 수 있습니다. –

3

어레이를 객체로 묶는 것은 count (someArray, 'foo')와 같은 작업을 수행하는 대신 (예 : someArray.count ('foo')) 더 자연스러운 구문으로.

+1

Java에서 배열에는'clone' (올바른 공변 리턴 유형이 있고 public이며 검사 예외가 없음)을 제외하고는 추가 메서드가 없습니다. 또한 'length'필드가 추가로 있습니다. 그 외에도,'Object'가 제공하는 것 이상의 다른 메소드 나 필드는 사용할 수 없습니다. –

1

또 다른 요점은 객체가 변경 가능하며 참조로 전달된다는 것입니다. 배열에는 배열의 "속성"을 변경하는 데 사용할 수있는 필드/메서드가 없지만 요소 값을 변경할 수 있습니다. 그리고 참조를 통해 배열을 전달하면 얻을 수있는 이점은 분명합니다 (기능 프로그래머는 Java가 값으로 전달 된 불변 목록을 원할 수도 있음).

편집 : 언급하는 것을 잊었습니다. autoboxing 이전의 기간에는 배열을 콜렉션에 저장하고 ObjectStreams 등에 쓸 수있는 것이 도움이되었습니다.

+0

참고로 통과를 위해 +1하고 싶었지만 불변의 것을 값으로 전달하고자하는 이유는 무엇입니까? 불변의 큰 +는 부작용에 대한 두려움없이 참조로 전달할 수 있다는 것입니다. – ILMTitan

+0

값을 전달한다고해서 반드시 값을 복사한다는 의미는 아닙니다. 실제로 참조 투명성이있는 언어로 : http://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29 구별은 부적합합니다. – Dan

1

link은 배열이 Java의 객체 (객체의 시작 부분) 인 이유를 설명합니다.

+0

stackoverflow는 해당 정보를 현장에서 가져오고 관련 부분을 강조 표시하고 보관하는 것을 좋아하기 때문에이 기사의 필수 부분을 인용하여 대답을 향상시킬 수 있습니다. – n611x007

1

아마도 모든 것을 개체로 만들기 위해 가능한 한 가까워지기를 원했기 때문일 수 있습니다. 기본 유형은 이전 버전과의 호환성을 위해 존재합니다.