2009-04-24 25 views
12

cái gì đó là nhầm lẫn tôi - một ví dụ:Tại sao nhập khẩu của lớp không cần thiết khi gọi phương pháp trên dụ (Java)

Thing.java:

import java.util.Date; 

class Thing { 
    static Date getDate() {return new Date();} 
} 

(cùng gói) TestUsesThing.java:

// not importing Date here. 

public class TestUsesThing { 

    public static void main(String[] args) { 
     System.out.println(Thing.getDate().getTime()); // okay 
     // Date date = new Date(); // naturally this wouldn't be okay 
    } 

} 

Tại sao không cần nhập Ngày để có thể gọi hàm getTime() trên một trong số chúng?

+1

Bạn không có nghĩa là 'System.out.println (Thing.getDate(). GetTime());' – JeeBee

+0

@JeeBee: Nó sẽ hoạt động như văn bản, nhưng bạn nói đúng là nó gây hiểu lầm (tất cả mọi thứ sẽ có cùng ngày). –

+0

Rất tiếc, cảm ơn - đã sửa. getDate() bắt đầu như một phương thức cá thể và tôi quên thay đổi cuộc gọi khi tôi đang viết. Bài học để tự chạy qua javac trước khi đăng bài. – jjujuma

Trả lời

24

Nhập khẩu trong Java là chỉ cần thiết để trình biên dịch biết những gì một Date là nếu bạn gõ

Date date = new Date(); 

nhập được không thích #include trong C/C++; tất cả các loại trên đường dẫn lớp là có sẵn, nhưng bạn import chỉ để tránh phải viết tên đủ điều kiện. Và trong trường hợp này, nó không cần thiết.

+0

Aha có ý nghĩa hoàn chỉnh, cảm ơn bạn! – jjujuma

+0

+1: Tôi đang học Java bản thân mình và của tất cả các tài liệu tôi đã đọc, tôi không nhớ lại nhìn thấy miếng ngon của thông tin giải thích theo cách đó. Điều đó rõ ràng rất nhiều. Cảm ơn. –

+0

Nhận xét có liên quan phần nào khác là tất cả gói java.lang được nhập tự động. Vì vậy, điều đó có nghĩa là bạn có thể sử dụng những thứ như Hệ thống mà không có câu lệnh nhập. –

1

Câu hỏi hay !!

Tôi nghĩ kết quả là sự khác biệt giữa cách trình biên dịch java xử lý các biểu thức so với các câu lệnh.

Date d = new Date(); // a statement 

nơi như

new Thing().getDate().getTime() 

là một biểu hiện khi nó xảy ra bên trong gọi phương thức println. Khi bạn gọi hàm getDate trên Thing(), trình biên dịch sẽ cố xử lý biểu thức bằng cách xem thông tin kiểu cho lớp Thing, đây là nơi nó nhận khai báo kiểu Date. Nhưng khi bạn cố gắng sử dụng ngày riêng biệt trong một tuyên bố như

Date d = new Thing().getDate(); 

bạn đang gán kết quả vào một loại trong phạm vi hiện tại (lớp TestUsesThing), trình biên dịch cố gắng giải quyết các loại trong phạm vi đó. Kết quả là, bạn thấy lỗi trình biên dịch cho loại không xác định.

0

Thing và TestUsesThing trong cùng một gói? Nếu vậy thì bạn không phải nhập Thing. Lý do bạn phải nhập Ngày là vì nó nằm trong một gói khác.

+0

Có, xin lỗi, câu hỏi thực sự là về nhập ngày, không phải mối quan hệ giữa các lớp mà tôi đã làm rõ bây giờ. – jjujuma

0

import báo cáo được sử dụng cho một vài điều.

  1. Kiểm tra loại trình biên dịch và tránh va chạm tên.
  2. Đảm bảo mã byte liên kết

Bất cứ khi nào chúng ta nói

System.out.println(new Thing().getDate().getTime()) 

Trình biên dịch phân tích tuyên bố này trái sang phải và được vào lớp đó.

Phân tích cú pháp trình biên dịch cấp một.

  1. Đến lớp điều
  2. biên dịch không có bất kỳ mối liên hệ hoặc lỗi ClassVersion từ Thing.lớp

  3. Kiểm tra Thing.class có phương thức getDate.
  4. nếu # 3 tốt thì con trỏ trình biên dịch vẫn ở trong Thing.class (có các câu lệnh nhập ngày) và tôi có thể gọi phương thức Thời gian.
  5. Là người tiêu dùng TestUsesThing chỉ có biến dài.

    System.out.println(new Thing().getDate()) 
    

    5,1 Trong trường hợp này chúng ta đang ngầm truy cập ToString() phương pháp

0

Trên thực tế, đó là một ví dụ lý tưởng, vì có hai tiêu chuẩn Java ngày lớp khác nhau: java.util .Datejava. sql .Date.

Làm cách nào để biết thiết bị nào cần sử dụng? Đơn giản. Phương pháp getDate() được khai báo như là một phần của định nghĩa của lớp Thing, và một phần của tuyên bố đó là returntype của nó:

public java.util.Date getDate() { 
    return this.date; 
} 

Tất nhiên, nếu bạn có một nhập khẩu trong định nghĩa của lớp Thing - và nó không phải là mơ hồ, bạn chỉ cần nói:

public Date getDate() { 

Nếu bạn đã giải mã nhị phân của lớp Thing, bạn sẽ thấy chữ ký phương pháp của phương pháp getDate, và nó bao gồm các tên lớp đầy đủ (bao gồm cả gói) của kiểu trả về.

An nhập chỉ đơn giản là cách nói cho trình biên dịch (các) gói bạn muốn giả định khi tham chiếu đến các lớp không có trình độ rõ ràng. Danh sách nhập khẩu sẽ được quét bất cứ khi nào một tên lớp không đủ tiêu chuẩn được nhìn thấy, và các gói sẽ được tìm kiếm. Nếu không có sự mơ hồ (chẳng hạn như nhập cả java.util.date và java.sql.Date), thì lớp đó sẽ được sử dụng. Nếu bạn có thể xác định lớp một cách ngầm định, hoặc nếu tên lớp hoàn toàn đủ điều kiện, bạn không cần phải nhập khẩu.

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