developer tip

Java의 객체 인 배열

copycodes 2020. 9. 4. 07:37
반응형

Java의 객체 인 배열


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

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

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


예.

Java 언어 사양 섹션 4.3.1 은 다음으로 시작됩니다.

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


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

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


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

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

예, Java의 객체입니다.

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


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


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

객체 저장 영역이다.


배열이 리플렉션 API- java.lang.reflect.Array에 표현되어 있음을 추가하고 싶습니다 .


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


  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

  • The Array class provides static methods to dynamically create and access Java arrays.

From Section 10.1 Objects

  • The direct superclass of an array type is Object.

  • Every array type implements the interfaces Cloneable and java.io.Serializable.

From Section 10.7 Array Members

The members of an array type are all of the following:

  • The public final field length, which contains the number of components of the array. length may be positive or zero.

  • The public method clone, which overrides the method of the same name in class Object and throws no checked exceptions. The return type of the clone method of an array type T[] is T[].

  • A clone of a multidimensional array is shallow, which is to say that it creates only a single new array. Subarrays are shared.

  • All the members inherited from class Object; the only method of Object that is not inherited is its clone method.


Observe below code snippet and output.

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)
}

}

clearly array a is treated as object.

참고URL : https://stackoverflow.com/questions/8781022/is-an-array-an-object-in-java

반응형