java - jlabel 사용법




배열이 기본 유형이나 객체입니까? 아니면 완전히 다른 것입니까? (5)

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

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

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

그러나 배열에 length 와 메소드와 같은 public 필드가 있다는 사실은 .equals().clone() 과 같이 호출 할 수 있습니다 (완전히 강력하게).

프리미티브 배열의 이상한 표현과 동작에 대한 설명은 무엇입니까?

참고로, 필자는 배열의 .clone() 메소드에 "Open Implementation"Eclipse 기능을 사용하려고 시도했다.이 메소드가 정의 된 위치와 방법을 볼 수 있기를 바랐다. (int [ ] Object에서 오버로드), 실제로 실제로 전체 Eclipse가 멈추고 충돌을 일으켰습니다 ...


간단하고 간단합니다. 예 <Type> []은 Object 유형입니다. 내가 이해할 때 Object 에서 직접 확장됩니다. 거기에 모든 Object 메서드, toString() , hashCode() , ... 더하기 length 라는 특수 노출 된 변수. java.util.Arrays 클래스는, 배열의 형태를 처리하는 유틸리티 클래스입니다. int[]Object[] 에서 상속받지 못합니다. 또한 다른 Object 유형과 달리 배열 유형에는 생성자가 없습니다. 그들은 new 키워드를 존중하지만 일반적으로 크기를 할당합니다. 약간 기괴하지만, 그 언어의 단 하나뿐입니다.

질문에 대답하기 위해, 그렇습니다 그들은 대상입니다.


모든 배열 유형에 대한 클래스가 있으므로 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);
}

AB A 부속 유형이고 A[]B[] 부속 유형 인 경우 컴파일 시간 부속 유형 지정 규칙이 있습니다.


아래 코드를 참조하십시오. 그것은 컴파일 : -

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

자, 어떤 원시 타입에서, 당신은 Object 클래스에서 정의 된 메소드 ( toString() )를 호출 할 수 없습니다. (그 문제에 대한 모든 메소드). 그래서 배열은 본질적으로 Object .

좋아, 여기 있네 : -

JLS 섹션 4.3에서 : -

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

그리고, 제 10 항 :

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

따라서 첫 번째 인용구에서 Array 는 실제로 클래스가 아닙니다 .. 다른 유형입니다. 그러나 본질적으로 배열은 객체이지만 일부 Class 는 아니지만 Array 유형입니다. 따라서 일부 클래스의 인스턴스가 아닙니다. , array 객체 일 수 있습니다 그런 식으로 생성되도록 정의되었습니다 ..


Java 언어 사양 은 다음과 같은 아이디어를 제공합니다.

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

모든 배열 유형은 Cloneablejava.io.Serializable 인터페이스를 구현합니다.

Moreover :

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

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





primitive