2010-03-22 41 views
6

Trong đó lớp là trường length được xác định bằng Java (ví dụ: chiều dài mảng)? Tôi có thể thấy nó được định nghĩa trong lớp Object không?độ dài chấm trong java - tìm định nghĩa của nó

EDIT: Tại sao trường này được thiết kế như vậy (bất kỳ điều gì liên quan đến hiệu quả bảo mật hoặc bộ nhớ)?

+0

Có phải chúng ta đang nói về chiều dài chuỗi, chiều dài mảng, kích thước đối tượng hay không? –

+0

@ Jason: Tôi nghĩ anh ấy đang nói về mảng. – missingfaktor

+0

@ Jason, tôi nghĩ rằng anh ấy đang nói về mảng.length, String không có biến độ dài, nó có phương thức length() (điều này gây nhầm lẫn vì nó không phải là getLength()). – medopal

Trả lời

12

Loại mảng đặc biệt trong Java. Đây là một đoạn trích từ JLS 10.7 Array Members

Các thành viên của một loại mảng là tất cả những điều sau đây:

  • Các public final lĩnh vực length, trong đó có số lượng các thành phần của mảng (chiều dài có thể tích cực hay số không).
  • Phương thức publicclone, ghi đè phương thức cùng tên trong lớp Object và không ném ngoại lệ đã kiểm tra. Kiểu trả về của phương thức sao chép của một loại mảng T[]T[].
  • Tất cả các thành viên được kế thừa từ đối tượng lớp; phương pháp duy nhất của đối tượng không được kế thừa là phương pháp clone của nó.

Mặc dù vậy, vẫn còn lỗi cũ đứng khi bạn đang sử dụng phản ánh trên các mảng: không length cũng không clone có thể được tìm thấy thông qua sự phản ánh (bug# 5047859, bug# 4987375).

Không có thành viên nào được kế thừa theo cách truyền thống từ bất kỳ siêu lớp nào; tất cả các loại mảng đều mở rộng từ Object trực tiếp. Điều này "điều trị đặc biệt" có thể là lý do tại sao các lỗi này tồn tại ở nơi đầu tiên.


"điều này có nghĩa là sẽ không bao giờ có thể thấy biến chiều dài được xác định?"

Không có mã nguồn thực sự cho các loại mảng. Một lần nữa, những loại này là đặc biệt; JVM chỉ rút ra những loại mũ này bất cứ khi nào chúng được yêu cầu. Bạn sẽ không thấy tệp nguồn .java cho loại mảng int[].class (tức là loại của tất cả các mảng int).

Vì vậy, không có, bạn sẽ không thể thấy các lengthlĩnh vực xác định.


Để đọc thêm, đây là một số thông tin về Java Reflection:

+0

điều này có nghĩa là sẽ không bao giờ có thể thấy biến chiều dài được xác định? – abson

+0

tôi không hiểu 'có thể được tìm thấy thông qua cụm từ phản ánh' ở đây bạn có thể vui lòng giải thích nó? – abson

+0

@abson: Tôi đã thêm một số nhận xét để giải quyết các nhận xét của bạn. Vui lòng yêu cầu làm rõ thêm. – polygenelubricants

2

Bạn cần cụ thể hơn một chút.

Độ dài biến có thể tồn tại trong bất kỳ lớp nào. Nếu bạn có ý nghĩa từ các API thì có thể bạn đang tìm kiếm Array.

Một số lớp có phương thức length().

+0

Một số có thuộc tính length (như mảng), một số phương thức length(), như String, và một số khác là một phương thức size(), giống như các bộ sưu tập khác nhau. – extraneon

+0

Có thuộc tính độ dài của mảng là – abson

2

Trong java với mảng, bạn có thể làm điều này. Ví dụ:

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

Độ dài sẽ là 3;

+0

nhưng anh ta hỏi độ dài var ở đâu? – medopal

+0

Điều đó có thể xảy ra. –

+0

yes @jschoen bạn có thể cho tôi biết độ dài biến được sử dụng trong chương trình của bạn được xác định không? – abson

0

Không có câu trả lời duy nhất cho câu hỏi này. Bất kỳ ai cũng có thể bao gồm biến số length trong một lớp học, nhưng không có gì đảm bảo rằng nó tồn tại - hoặc, nếu nó tồn tại, nó được công khai - trong bất kỳ lớp học nào. Bạn thực sự chỉ cần đọc nguồn cho lớp mà bạn quan tâm.

Tôi sẽ nói rằng trong các lớp JavaBean convention được sử dụng rộng rãi, các lớp có thể có thuộc tính độ dài hợp lý nhưng không có biến công khai length thường có các phương thức getLength()setLength(). Điều đó tốt hơn so với biến số công khai vì một số lý do nằm ngoài phạm vi cho câu hỏi của bạn, nhưng nếu bạn quan tâm, hãy xem this related SO question.

+0

Có thuộc tính chiều dài của mảng của bạn có thể vui lòng cho biết nơi nó thực sự được xác định? – abson

5

Mảng không giống như các lớp thông thường, chúng là trường hợp đặc biệt được xác định trong Java Language Specification. Vì vậy, biến cuối cùng công khai .length được định nghĩa trong Đặc tả Ngôn ngữ Java, nhưng nó không thực sự được định nghĩa ở bất kỳ đâu trong tệp .java hoặc .class.

+0

điều này có nghĩa là nó được định nghĩa trong lớp Object? – abson

+0

+1 để đánh bại tôi đến liên kết JLS. @abson, không, nó không có trong lớp Object. Nếu bạn in ra someArray.getclass(), bạn sẽ nhận được một cái gì đó không phải là con người có thể đọc được, đó là một kiểu đặc biệt được xây dựng trong ngôn ngữ. – Pops

1

Bất kỳ lớp nào có thể có trường được gọi là length. Chỉ cần thêm nó.

Mảng không có trường length; họ có một cái gì đó mà trông giống như một lĩnh vực như:

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

nhưng nó không phải là thực sự một lĩnh vực đồng bằng, bởi vì đây không biên dịch:

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

và, ở mức JVM, chiều dài mảng được truy cập với một mã vạch cụ thể (arraylength) và không phải là mã opcode truy cập trường hợp chung (getfield).

0

của một biến mà có thể được truy cập cho một mảng để tìm hiểu cách thức nhiều yếu tố có trong mảng.

Các vấn đề liên quan