programing

배열이 기본 유형입니까, 객체입니까 (또는 완전히 다른 것)?

goodcopy 2021. 1. 18. 22:05
반응형

배열이 기본 유형입니까, 객체입니까 (또는 완전히 다른 것)?


질문은 기본적으로 자명합니다. 나는 배열에 대한 API를 찾을 수 없었습니다 (이 Arrays 제외하지만 이것은 실제 배열을 처리하기위한 정적 도우미 함수를 정의합니다). 클래스가 없으면 배열이 Object.

그러나 배열은 공공과 같은 필드가 사실 length과 같이 호출 할 수있는 방법 .equals().clone()(아주 강하게) 제안하는 것 정반대입니다.

원시 배열의 이상한 표현과 동작에 대한 설명은 무엇입니까?

참고로, .clone()방금 배열 메서드 에서 "개방형 구현"Eclipse 기능을 사용하려고했습니다. 이 메서드가 정의 된 위치와 방법을 볼 수 있기를 바라고 있습니다 (int []가 Object), 그러나 실제로 전체 Eclipse가 멈추고 충돌을 일으켰습니다.


모든 배열 유형에 대한 클래스가있다, 그래서위한 클래스가있다 int[]클래스가있다, Foo[]. 이러한 클래스는 JVM에 의해 생성됩니다. int[].class,으로 액세스 할 수 있습니다 Foo[].class. 이 클래스의 직접적인 수퍼 클래스는 다음과 같습니다.Object.class

public static void main(String[] args)
{
    test(int[].class);
    test(String[].class);
}

static void test(Class clazz)
{
    System.out.println(clazz.getName());
    System.out.println(clazz.getSuperclass());
    for(Class face : clazz.getInterfaces())
        System.out.println(face);
}

경우 컴파일 타임 하위 유형 규칙도있다 A의 하위 유형 인 B, A[]의 하위 유형입니다 B[].


Java 언어 사양은 당신에게 아이디어를 줄 것이다 :

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

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

또한 :

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

따라서 배열은 인스턴스가 아니므로 생성자를 생성하기 위해 생성자가 필요하지 않습니다. 대신 Array Creation Expressions 를 사용합니다 .


아래 코드를 참조하십시오. 다음과 같이 컴파일됩니다.-

    int[] arr = new int[2];
    System.out.println(arr.toString());

이제 모든 기본 유형 toString()에서 Object 클래스 (또는 해당 문제에 대한 모든 메소드)에 정의 된 method ( )를 호출 할 수 없습니다 . 따라서 배열은 본질적으로 Object..

좋습니다. 여기 있습니다.-

보내는 사람 JLS 4.3 : -

참조 유형에는 클래스 유형 (§8), 인터페이스 유형 (§9), 유형 변수 (§4.4) 및 배열 유형 (§10)의 네 가지 종류가 있습니다.

그리고 섹션 10 :-

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

그래서, 첫 번째 인용에서, Array실제로는 클래스가 아닙니다 .. 그것은 또 다른 유형입니다. 그러나 본질적으로 배열은 일부가 아니더라도 객체 Class이지만 Array유형입니다 .. 그래서 그들은 어떤 클래스의 인스턴스가 아니며 be 객체는 array그렇게 생성되도록 정의됩니다.


너무 짧고 간단합니다. 예 <Type> []은 Object. Object내가 이해하는대로 직접 확장됩니다 . 여기에는 모든 Object 메서드가 있습니다 toString(). hashCode(),, ... 그리고 length. 클래스 java.util.Arrays는 배열 유형을 처리하기위한 유틸리티 클래스입니다. : 그것은 당신이 같은 혼란 것들에 추가 할 때 혼란 약간의 int[]상속하지 않습니다 Object[]. 또한 다른 Object유형 과 달리 배열 유형에 대한 생성자가 없습니다. 그들은 new키워드를 존중 하지만 일반적으로 크기를 할당하는 것입니다. 약간 기이하지만 그 언어 적 특성 중 하나 일뿐입니다.

그래도 질문에 답하기 위해 그들은 객체입니다.


배열은 단일 유형의 고정 된 수의 값을 보유하는 컨테이너 객체입니다.

참조 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html를


우리가 알고있는 Java의 몇 가지 기본 유형 만. 기본적으로 필요한 경우 선언, 구성 또는 초기화 와 같은 배열을 만드는 여러 단계 가 있으며 이는 배열이 실제로 객체임을 의미합니다.

더 깊이 들어가면 원시 유형은 원래 값으로 메모리에 저장 될 수 있지만 객체는 주소 (참조)입니다. 그래서 우리는 역설을 상상할 수 있습니다. 배열이 원시 형이라면 어떻게 원래 값을 메모리에 저장할 수 있을까요? 나는 String과 동일하다고 생각하지만 String은 최종 객체이므로 원시 유형과 같이 쉽게 객체를 구성 할 수 있습니다. String s = "s".


개체입니다

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

ReferenceURL : https://stackoverflow.com/questions/12806739/is-an-array-a-primitive-type-or-an-object-or-something-else-entirely

반응형