2010-09-09 34 views
5

Tôi hiểu rằng đoạn mã sau sẽ không làm việcTự động hóa/mở rộng xảy ra trong Ngắn a = 3 nhưng không xuất hiện trong Float a = 3;

Float a=3 

vì dịch là phao a = Integer.valueOf của nó (3). Chúng ta sẽ có một tham chiếu Float trên LHS và một đối tượng Integer trên RHS, nó không tương thích. Nhưng:

1.

 `Short a=3;` 

này hoạt động, mặc dù đây một lần nữa, chúng tôi sẽ có một tham chiếu ngắn trên LHS và một đối tượng Integer trên RHS.

2.

Float a=(Float) 3

Nếu chúng ta không typecasted 3, nó đã có thể được dịch là Integer.valueOf (3). Bây giờ, nó sẽ được dịch là Float.valueOf (3)?

+0

Bạn có trình biên dịch Java không? Nếu có, bạn có thể thử điều này. – DJClayworth

Trả lời

0

Nếu bạn cố gắng khởi tạo biến có giá trị lớn hơn giá trị có thể giữ (bất kể dạng số của giá trị), trình biên dịch sẽ cung cấp cho bạn thông báo lỗi.

char c = 0xffff; // max char hex value 
byte b = 0x7f; // max byte hex value 
short s = 0x7fff; // max short hex value 

Lưu ý trong mã ở trên giá trị thập lục phân có thể tối đa cho char, byte và ngắn. Nếu bạn vượt quá những điều này, trình biên dịch sẽ tự động làm cho giá trị một int và cho bạn biết rằng bạn cần một dàn diễn viên thu hẹp cho nhiệm vụ. Bạn sẽ biết bạn đã bước qua dòng.

Vì vậy, trong trường hợp của bạn Short s = 3 thực sự trở thành Short s = new Short(3) và hoạt động. (Phương pháp valueOf không được sử dụng khi autoboxing đó là lý do tại sao IDE hiện đại có các tùy chọn để cờ những autoboxing như các lỗi và chúng tôi có thể thay thế chúng bằng các phương pháp valueOf cho Quản lý đ.thoại tốt hơn bộ nhớ)

Trong trường hợp thứ hai Float a=(Float) 3 sẽ trở thành Float.valueOf(3)

+0

Cảm ơn. Rất rõ ràng. Bạn có thể xác nhận sau đó, rằng "Float a = 3 sẽ không hoạt động vì Java không cho phép mở rộng sau bằng cách autoboxing". Ngoài ra, autoboxing không chỉ có nghĩa là hàm tạo trình bao bọc thích hợp được gọi cho LHS. Nếu đúng như vậy, Float a = 3 sẽ hoạt động. Điều gì phải xảy ra là trước khi autoboxing, một chuyển đổi thu hẹp phải được thực hiện để làm cho kiểu nguyên thủy giống như kiểu nguyên thủy của trình bao bọc và sau đó chỉ có autoboxing sẽ diễn ra. Tôi có ở đây không? – Daud

1

Các hình thức ngắn gọn là:

Float a=3.0f; 

Đối với loại Double:

Double b=3.0; 
2

Nếu câu hỏi của bạn là "Tại sao nổi f = 3; không biên dịch, nhưng ngắn s = 3; không? ", sau đó câu trả lời là:

Trình biên dịch Java thực hiện một số công việc đặc biệt trên hằng số nguyên để khớp với chúng ở phía bên trái: nó tìm loại phù hợp nhất và sử dụng nó. Vì vậy,

Short s = 3; 

được biên soạn để

Short s = Short.valueOf(3); 

Về cơ bản, sự kỳ diệu tương tự xảy ra khi bạn viết

short s = 3; 

Nhưng điều này được thực hiện chỉ dành cho số nguyên, và không cho các giá trị dấu chấm động .

0

Không có cách nào để xác định hằng số ngắn và byte, do đó trình biên dịch cho phép bạn dịch các hằng số int một cách minh bạch. Có hằng số float trong java vì vậy nó không hỗ trợ dịch thuật ngầm định.Nếu bạn muốn một float/Float tôi đề nghị bạn sử dụng một hằng số float.

Byte b = 3; 
Short s = 3; 
Integer i = 3; 
Long l = 3L; 
Float f = 3f; 
Double d = 3d; 
Các vấn đề liên quan