2013-07-11 52 views
17

Tôi ngạc nhiên khi thấy hành vi này.Tuyên bố biến không tên - tại sao nó hoạt động?

Đó có phải là lỗi hay gì đó không?

for(Object obj = new Object(), Integer = new Integer(300); 
    obj.toString().length()>3; 
    System.out.println("on object's loop")) { 

} //causes an infinite loop (not foreach loop, of course) 

biên dịch mã trên và chạy tốt mà không cần tham chiếu đến new Integer(300). Tại sao như vậy?

Tôi chỉ muốn biết tại sao Integer = new Integer(300); là không sao nếu không có bất kỳ tham chiếu nào.

+1

Nó khai báo một biến mới có tên 'Integer' của kiểu' Object' với giá trị ban đầu "a fresh' java.lang.Integer', value 300 ". Câu hỏi của bạn là gì? – Dirk

+1

Đã mở lại - Đó là một câu hỏi hợp pháp (nếu có thể được viết sai). (Có thể là khôn ngoan cho OP để rephrase tiêu đề.) –

Trả lời

27
Object obj = new Object(), Integer = new Integer(300); 

Điều này tạo ra hai biến:

  1. obj loại Object, mà được giao cho new Object().
  2. Integer (vâng, đó là tên của biến) cũng loại Object, mà được giao cho new Integer(300).

Bằng cách này, việc này không liên quan gì đến vòng for; dòng đó sẽ tự biên dịch tốt. Bây giờ, nếu điều đó , thực sự là một ;, đó sẽ là một câu chuyện khác.

Nói chung, chúng ta có thể xây dựng báo cáo hợp lệ có dạng:

Type t1 = ..., t2 = ..., t3 = ..., ...; 

tương đương với

Type t1 = ...; 
Type t2 = ...; 
Type t3 = ...; 
... 
+4

Ah! Vì dấu phẩy, "Số nguyên" được hiểu là một tên biến loại "Đối tượng".(Tôi chưa bao giờ thực sự thích các khai báo mở rộng bằng dấu phẩy, vì chúng tạo ra tất cả các loại cơ hội cho lỗi/nhầm lẫn.) –

+1

Và sử dụng Integer làm định danh, có hai thứ này lẫn lộn lẫn nhau. – kosa

+1

Vì 'Integer' không phải là một từ khóa dành riêng cho Java (trái với' int'), nó có thể được sử dụng như tên biến. –

15

Tôi nghĩ anh ấy hỏi tại sao Integer = new Integer (300) hoạt động. - arshajii 2 mins ago

Integer là tên định danh hợp lệ và loại của nó là Object

Object obj = new Object(), Integer = new Integer(300); 

Đó là tương đương với

int a=2, b=4; 

obj.toString() in các String (bao gồm classname và hashcode), có chiều dài> 3 để vòng lặp vô hạn

+0

Tôi nghĩ rằng anh ta hỏi tại sao 'Integer = new Integer (300)' hoạt động. – arshajii

+0

@arshajii tất nhiên là người đàn ông !! –

+0

@Sachin câu trả lời cập nhật –

3
String String = "foo"; 
    System.out.println(new String(String)); 

cũng là hợp pháp - trình biên dịch là đủ thông minh để tìm ra là một tham chiếu biến và không phải là tham chiếu.

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