2015-09-24 11 views
7

Tại sao L được chọn làm tiền tố cho các tham chiếu trong chữ ký loại? Có phải L là viết tắt của một cái gì đó, như B là viết tắt của byteI là viết tắt của int? Hay nó đã được chọn vì C đã được gán cho char?Tại sao L là tiền tố cho các loại tham chiếu (thay vì một số chữ cái khác)?

Ví dụ,

System.out.println(new String[0].getClass().getName()); 

Sản lượng:

[Ljava.lang.String; 

Tôi đã nhận thức được giải thích trong Java specClass.getName method javadoc.

+5

http://stackoverflow.com/questions/5085889/l-array-notation-where-does-it-come-from và http://stackoverflow.com/questions/3442090/java-gì-là-này-ljava-lang-object –

+0

Nó không phải là. Tiền tố mảng là '['. – chrylis

+0

Tại sao 'L' đặc biệt, thay vì một số chữ cái khác?Nó có tùy ý không? Hay nó có ý nghĩa gì? – GreenGiant

Trả lời

4

Ký tự này xuất phát từ chữ ký nội bộ JVM và biểu diễn tên lớp.

Xem JVM Specification §4.3.2. Field Descriptors:

 
    B byte  signed byte 
    C char  Unicode character code point in the Basic Multilingual Plane, 
       encoded with UTF-16 
    D double  double-precision floating-point value 
    F float  single-precision floating-point value 
    I int  integer 
    J long  long integer 
    L ClassName ; reference    an instance of class ClassName 
    S short  signed short 
    Z boolean true or false 
    [ reference one array dimension

Kiểu mảng bao gồm một [ cho mỗi chiều, tiếp theo là chữ ký yếu tố của họ, ví dụ [I cho int[]. Tương tự, Object[] được đại diện bởi [Ljava/lang/Object; nội bộ.

Dường như, khi chuyển đổi từ tên lớp nội bộ sang tên hiển thị ứng dụng, tức là trả về Class.getName() được triển khai lần đầu tiên, nó được triển khai chỉ chuyển đổi / thành . mà không quan tâm đến ký hiệu mảng. Sau đó, nó không thay đổi vì lý do tương thích.


Note Java 8 giới thiệu getTypeName() để giải quyết vấn đề, ví dụ: String[].class.getTypeName() sản lượng java.lang.String[].

+1

Có. Nhưng tại sao 'L' đặc biệt, thay vì một lá thư khác? Nó có tùy ý không? Hay nó có ý nghĩa gì? – GreenGiant

+0

Tôi không biết lý do (nhưng) nhưng phải có một lý do. Rõ ràng là, các chữ cái cho các kiểu nguyên thủy chỉ đơn giản là bắt nguồn từ tên của chúng, ngoại trừ một cái có xung đột, tức là 'Z' cho' boolean' vì 'B' đã được sử dụng cho' byte'. Và ở đó, 'long' phải đi với' J' vì 'L' đã được dành riêng cho các kiểu tham chiếu. Tôi đoán, bạn sẽ không tạo ra xung đột tên, nếu bạn chỉ có thể chọn ký tự * bất kỳ *, vì vậy phải có lý do để chọn 'L' cho các loại tham chiếu. – Holger

+0

'long' xuất hiện sau loại tham chiếu? – ZhongYu

0

"[" là thứ nguyên của mảng. Vì vậy, "[" là mảng 1 chiều, "[[" là mảng 2 chiều, v.v.

"Ljava.lang.String" cho biết rằng đó là một mảng đối tượng (đó là "L") của lớp java.lang.String.

Nếu bạn có một mảng nguyên thủy, ví dụ: int, nó sẽ là "[I". Các kiểu nguyên thủy khác có các chữ cái khác nhau.

-1

[Ljava.lang.String;

Đây [nghĩa là một mảng. L có nghĩa là một lớp kiểu java.lang.String. Đây là các phím tắt mà JVM giữ cho chính nó để xác định các kiểu dữ liệu Java. Điều đó tương tự như các kiểu mô tả được sử dụng trong nội bộ bytecode. Ví dụ, đối với các giá trị nguyên thủy, giá trị là: [I cho mảng int, một mảng hai chiều sẽ là: [[I.

Dưới đây là một lời giải thích rất tốt: [L array notation - where does it come from?

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