Java의 객체 인 배열


93

자바에서는 다음과 같은 배열을 선언 할 수 있습니다.

String[] array = new String[10]; 
int size = array.length; 

이것은 배열 자체가 객체라는 것을 의미합니까? C ++에서 배열은 포인터 일 뿐이며 메서드가 없기 때문입니다.


5
아니요, C ++에서 배열은 배열이 아니라 배열입니다.
Kerrek SB

42
if (array instanceof Object) System.out.println("Yes!")
skaffman

6
아, 그리고 C ++에서 배열과 포인터는 모두 객체입니다.
R. Martinho Fernandes

2
@ R.MartinhoFernandes 모든 C ++ 배열은 실제로 C ++ 객체이지만 C ++ 객체가 아닌 C ++ 포인터, 즉 rvalue를 평가 한 결과 인 모든 포인터가 있습니다. 예를 들면 &x, p+inew int(42).
fredoverflow

1
@skaffman 메시지는 그렇지 않으면 컴파일되지 않기 때문에 꼭 필요한 것은 아닙니다.
shmosel

답변:



60

예; Java 언어 사양 다음과 같이 씁니다 .

Java 프로그래밍 언어에서 배열은 객체 (§4.3.1)이며 동적으로 생성되며 Object 유형 (§4.3.2)의 변수에 할당 될 수 있습니다. Object 클래스의 모든 메서드는 배열에서 호출 될 수 있습니다.


배열이 객체라면 그것이 클래스의 인스턴스라는 것을 의미하지 않습니까? 그렇다면 해당 클래스를 확장 할 수 있습니까?
One Two Three

9
아니요, 그렇지 않습니다. Java 사양 다음과 같이 기록합니다 . "객체는 클래스 인스턴스 또는 배열입니다. 클래스 인스턴스는 클래스 인스턴스 생성 표현식 (§15.9)에 의해 명시 적으로 생성됩니다. 배열은 배열 생성 표현식에 의해 명시 적으로 생성됩니다. (§15.10). ". 아니요, extends 절 에 ClassType이 있어야 하므로 배열을 확장 할 수 없습니다 .
meriton 2013-04-03

36

글쎄, 자바에게 물어 보자!

public class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println(args instanceof Object);
    int[] someIntegers = new int[] {42};
    System.out.println(someIntegers instanceof Object);
  }
}

산출:

true
true

1
int[] someIntegers = {42};동일한 결과 로을 선언 할 수도 있습니다.
Holger

7

예, Java의 객체입니다.

또한 그렇게 할 때 array.length메서드를 호출하는 것이 아니라 배열의 length필드에 액세스하는 것 입니다. Arrays 클래스 에는 많은 정적 메서드가 있습니다.


3

Java의 배열에는 객체와 공유하지 않는 고유 한 바이트 코드가 있다는 점에 유의해야합니다. 그것들은 확실히 객체이지만 낮은 수준에서 약간 다르게 처리됩니다.


2

엄밀히 말하면 배열도 C ++의 객체라고 덧붙일 수 있지만 대답은 '예'라고 말하고 싶습니다. 현재 표준 (FDIS)의 §1.8 [intro.object]에서 :

객체 저장 영역이다.



1

Java의 모든 배열은 객체입니다. ex int [] a = new int [2]; 그래서 new는 객체를 만드는 데 사용되며 객체이므로 a.getClass (). getName ();을 사용하여 클래스 이름을 확인할 수 있습니다.


1
  1. 배열은 클래스 트리에 나열된 클래스의 인스턴스가 아니지만 각 배열은 객체이며 java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. 클래스 java.util.Arrays는 도우미 클래스이고 배열은이 클래스의 인스턴스가 아닙니다.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. 클래스 java.lang.reflect.Array는 도우미 클래스이고 배열은이 클래스의 인스턴스가 아닙니다.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. 배열은 모든 구성원을 상속합니다. java.lang.Object

  2. 배열은에서 clone()상속 된 메서드를 재정의합니다 Object.

  3. 배열 length은 배열의 구성 요소 수를 포함 하는 field를 구현합니다 . 길이는 양수 또는 0 일 수 있습니다. 그것은이다 publicfinal.

  4. 배열은 인터페이스 Cloneablejava.io.Serializable.

8a. 배열은에서 지원됩니다 Class<T>. Class<T>배열 인스턴스에서 인스턴스를 검색 할 수 있습니다.

(new int[2]).getClass()

또는 배열 유형에서

int[].class

8b. 고유 한 리플렉션 클래스 인스턴스 (예 :의 인스턴스 java.lang.Class<T>)가 코드의 각 배열 유형에 대해 생성됩니다. 예

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. 반복하려면 : 배열은 객체이지만 클래스 트리에있는 클래스의 인스턴스가 아닙니다.

참고 문헌

Java 사양 섹션 4.3.1 객체에서

  • 객체는 클래스 인스턴스 또는 배열입니다.

  • 클래스 인스턴스는 클래스 인스턴스 생성 표현식에 의해 명시 적으로 생성됩니다.

  • 배열은 배열 생성 표현식에 의해 명시 적으로 생성됩니다.

에서 java.util.Arrays

  • 이 클래스에는 배열을 조작하기위한 다양한 메서드 (예 : 정렬 및 검색)가 포함되어 있습니다.

에서 java.lang.reflect.Array

  • Array 클래스는 Java 배열을 동적으로 만들고 액세스 할 수있는 정적 메서드를 제공합니다.

에서 10.1 객체

  • 배열 유형의 직접 수퍼 클래스는 Object입니다.

  • 모든 배열 유형은 인터페이스 Cloneablejava.io.Serializable.

에서 제 10.7 배열 구성원

배열 유형의 멤버는 모두 다음과 같습니다.

  • length배열의 구성 요소 수가 포함 된 공개 최종 필드 입니다. 길이는 양수 또는 0 일 수 있습니다.

  • clone클래스에서 동일한 이름의 메서드를 재정의하고 Object확인 된 예외를 throw하지 않는 공용 메서드 입니다. clone배열 유형 메서드의 반환 유형은 T[]입니다 T[].

  • 다차원 배열의 복제본은 얕습니다. 즉, 하나의 새 배열 만 생성합니다. 하위 배열이 공유됩니다.

  • Object 클래스에서 상속 된 모든 멤버 상속되지 않는 Object의 유일한 방법은 복제 방법입니다.


1

모든 배열은 객체입니다. 하나는 다음과 같은 방법을 호출 할 수 있습니다 equals, hashcode등 :

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

네이티브 유형에서는 메서드를 호출 할 수 없습니다.


0

아래 코드 조각과 출력을 관찰하십시오.

public class Tester {
int a[];
public static void main(String[] args) {
    System.out.println(new Tester().a);// null
    System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}

}

명확하게 배열 a 는 객체로 취급됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.