2010-03-22 2 views
6

클래스는 Java에서 정의 된 length 필드입니다 (예 : 배열 길이)? Object 클래스에서 정의 된 것을 볼 수 있습니까?자바의 도트 길이 - 해당 정의 찾기

편집 : 왜이 ​​필드가 그렇게 설계 되었습니까 (보안 또는 메모리 효율성과 관련된 모든 항목)?

+0

우리는 문자열 길이, 배열 길이, 객체 크기 등을 이야기하고 있습니까? –

+0

@ Jason : 그는 배열에 대해 이야기하고 있다고 생각합니다. – missingfaktor

+0

@ Jason, 나는 그가 array에 대해 이야기하고 있다고 생각한다. length, String은 length 변수를 가지고 있지 않다. length() 메소드를 가지고있다. (getLength()가 아니기 때문에 혼란 스럽다.) – medopal

답변

12

배열 유형은 Java에서 특별합니다. 이 어레이 형의 부재는 다음의 모두 JLS 10.7 Array Members

발췌이다 어레이의 구성 요소의 수를 포함

  • public final 필드 length (길이가 포지티브 일 수도 제로).
  • public 메서드 cloneObject 클래스의 동일한 이름 메서드를 재정의하고 검사 예외를 throw하지 않습니다. 배열 유형이 T[] 인 복제 메소드의 반환 유형은 T[]입니다.
  • Object 클래스에서 상속 된 모든 멤버 상속되지 않는 Object의 유일한 메소드는 clone 메소드입니다. 당신이 배열에 반사를 사용할 때이에도 불구하고

, 오래 서 버그 아직 없습니다 : 둘 lengthclone은 반사 (bug# 5047859, bug# 4987375)를 통해 찾을 수 없습니다.

어느 멤버도 모든 수퍼 클래스의 전통적인 방식으로 상속받지 않습니다. 모든 배열 유형은 Object에서 직접 확장됩니다. 이 "특별 대우"는 이러한 버그가 처음부터 존재하는 이유입니다.


"정의되는 길이 변수를 볼 수 없습니까?"

어레이 유형에 대한 실제 소스 코드는 없습니다. 다시 말하지만, 이러한 유형은 특별합니다. JVM은 필요할 때마다 이러한 유형을 모자에서 꺼냅니다. 배열 유형 int[].class에 대한 .java 소스 파일 (즉, 모두 int 배열 유형)이 표시되지 않습니다. 정의 된 length필드에게을 볼 수

그래서, 아니, 당신은 할 수 없습니다.

+0

이것은 정의 된 길이 변수를 결코 볼 수 없다는 뜻입니까? – abson

+0

나는 '반사를 통해 발견 될 수있다'라는 말을 이해하지 못했다. 여기서 설명해 주시겠습니까? – abson

+0

@ abson : 귀하의 의견을 언급하기 위해 몇 가지 의견을 추가했습니다. 더 많은 설명을 요청하십시오. – polygenelubricants

2

좀 더 구체적으로 설명해야합니다.

가변 길이는 모든 클래스에 존재할 수 있습니다. API에서 의미하는 경우 아마 당신은 배열을 찾고 있습니다.

일부 클래스에는 length() 메소드가 있습니다.

+0

일부는 길이 속성 (예 : 배열), length() 메서드 (예 : String) 및 size() 메서드 (다양한 컬렉션)를 포함합니다. – extraneon

+0

예 배열의 길이 속성 – abson

2

배열이있는 자바에서는 이것을 할 수 있습니다. 예 :

String[] a = new String [] {"a","b","c"}; 
int length = a.length; 

길이는 3입니다.

+0

하지만 그는 길이 var 무엇입니까? – medopal

+0

그럴 수도 있습니다. –

+0

예 @jschoen 프로그램에서 사용 된 길이 변수가 정의 된 위치를 알려주시겠습니까? – abson

0

이 질문에 대한 대답은 하나도 없습니다. 누구나 클래스에 length 변수를 포함 할 수는 있지만 특정 클래스에서 그것이 존재한다고 보장 할 수는 없습니다. 관심있는 클래스의 소스를 읽는 것만으로도 충분합니다. JavaBean convention에서 길이 속성을 합리적으로 가질 수는 있지만 공용 변수가없는 클래스는 종종 length입니다. getLength()setLength() 방법이 있습니다. 질문의 범위를 벗어나는 여러 가지 이유 때문에 공용 변수보다 낫습니다.하지만 관심이 있으시면 this related SO question을 확인하십시오.

+0

예 배열의 길이 속성은 실제로 정의 된 위치를 알려주시겠습니까? – abson

5

배열은 일반 클래스와 다르며 Java Language Specification에 정의 된 특별한 경우입니다. 따라서 .length 공용 최종 변수는 Java 언어 스펙에 정의되어 있지만 실제로 .java 또는 .class 파일의 어느 곳에서나 정의되지는 않습니다.

+0

이것은 Object 클래스에 정의되어 있음을 의미합니까? – abson

+0

JLS 링크에 나를 때리는 +1. @abson, 아니요, Object 클래스에 없습니다. someArray.getclass()를 출력하면 사람이 읽을 수없는 것을 얻을 수 있습니다. 언어에 내장 된 특수한 형식입니다. – Pops

1

클래스는 length이라는 필드를 가질 수 있습니다. 그냥 추가하십시오.

배열에는 length 필드가 없습니다. 이 컴파일되지 않기 때문에,

int[] a = new int[10]; 
System.out.println("array length is: " + a.length); 

하지만 정말 일반 필드 되지 않습니다 : 다음 JVM 수준에서,

int[] a = new int[10]; 
a.length = 42; // <- here the compiler gets grumpy 

을, 그들은 같은 필드처럼 보이는 뭔가를 배열 길이는 특정 작업 코드 (arraylength)로 액세스되며 일반 인스턴스 필드 액세스 명령 코드 (getfield)로 액세스되지 않습니다.

0

그 배열에 대한 액세스 할 수있는 변수가 알아 방법 :


더 읽기를 들어, 여기에 자바 반사에 대한 몇 가지 정보입니다 배열에 많은 요소가 있습니다.