2014-04-18 45 views
5

Theo như tôi biết, bạn không thể khai báo các phương thức tĩnh trong phần thân giao diện. Tuy nhiên, vô tình tôi tìm thấy đoạn mã đặc biệt trên trang web http://docs.oracle.com/. Đây là linkPhương thức tĩnh trong giao diện java

Namelly

public interface TimeClient 
{ 
void setTime(int hour, int minute, int second); 
void setDate(int day, int month, int year); 
void setDateAndTime(int day, int month, int year, 
          int hour, int minute, int second); 
LocalDateTime getLocalDateTime(); 

static ZoneId getZoneId (String zoneString) { 
    try { 
     return ZoneId.of(zoneString); 
    } catch (DateTimeException e) { 
     System.err.println("Invalid time zone: " + zoneString + 
      "; using default time zone instead."); 
     return ZoneId.systemDefault(); 
    } 
} 

default ZonedDateTime getZonedDateTime(String zoneString) { 
    return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 
    } 
} 

này interface có một phương pháp staticgetZoneId

Tôi bị mất ... bất cứ ai có thể giải thích xin vui lòng

+4

Bạn _can_ tuyên bố phương pháp tĩnh trong giao diện bắt đầu với Java 8. Cũng lưu ý các 'getZoneDateTime() 'phương thức (phương thức mở rộng ảo, cũng mới trong Java 8). – fge

+1

Vui lòng đọc http://marioosh.5dots.pl/2014/02/12/java-8-default-and-static-methods-in-interfaces.html – Sap

+0

Bạn chưa thấy danh sách tính năng mới của Java 8 chưa? kiểm tra nó. –

Trả lời

5

Java 8 bây giờ đã có ý tưởng "mặc định "triển khai phương thức trong giao diện:

http://blog.hartveld.com/2013/03/jdk-8-13-interface-default-method.html

+1

mọi người đều trả lời đúng cho câu hỏi của tôi. Bạn là người đầu tiên mặc dù. –

+1

Không thực sự, có một sự khác biệt giữa các phương pháp mặc định và tĩnh, vì vậy chúng ta không nhầm lẫn giữa những người dùng đó (và những người dùng khác). Đây có thể là một con trỏ tốt, nhưng không phải là câu trả lời đúng. – virgo47

+0

@ virgo47 bạn nói đúng, tôi không chắc mình đang làm gì ở đây. Tôi đã nhìn xem liệu câu hỏi ban đầu đã tham chiếu các phương thức mặc định hay chưa nhưng nó không. Tôi sẽ xóa cái này. Er, không thể xóa nó khi nó được chấp nhận: ( –

5

Bắt đầu với Java 8 bạn có thể thực hiện việc này. Các official tutorial rằng đoạn mã của bạn đến từ (mà đã được cập nhật cho Java 8) nói nó tốt nhất:

Cơ quan giao diện có thể chứa các phương thức trừu tượng, phương pháp mặc định, và các phương pháp tĩnh. Một phương thức trừu tượng trong một giao diện được theo sau bởi một dấu chấm phẩy, nhưng không có dấu ngoặc (một phương thức trừu tượng không chứa một thực thi). Các phương thức mặc định được định nghĩa với công cụ sửa đổi default và các phương thức tĩnh với từ khóa static. Tất cả các phương thức trừu tượng, mặc định và tĩnh trong một giao diện ngầm là công khai, vì vậy bạn có thể bỏ qua công cụ sửa đổi công khai.

Hoặc từ Java 8 của JLS section 9.4:

Một phương pháp mặc định là một phương pháp mà được khai báo trong một giao diện với các modifier default; cơ thể của nó luôn luôn được đại diện bởi một khối. Nó cung cấp một cài đặt mặc định cho bất kỳ lớp nào thực hiện giao diện mà không ghi đè phương thức. Các phương thức mặc định khác với các phương thức cụ thể, được khai báo trong các lớp.

...

Một giao diện có thể khai báo các phương pháp tĩnh, được gọi mà không cần tham chiếu đến một đối tượng cụ thể.

4

trong Java 8, giao diện có thể có phương pháp tĩnh, cũng như phương pháp ghi đè có thể với một cài đặt mặc định. Họ vẫn không thể có trường thể hiện mặc dù. Các tính năng này là một phần của sự hỗ trợ biểu thức lambda, và bạn có thể đọc thêm về chúng trong Phần H của. JSR 335

13

Bạn đang dưới sự chứng kiến ​​của hai tính năng mới trong Java 8 ở đây:

  • phương pháp tĩnh trong giao diện,
  • phương pháp khuyến nông ảo.

Trong mẫu mã bạn cung cấp, getZoneId() minh họa tính mới đầu tiên và .getZoneDateTime() thứ hai.

thứ hai đặc biệt là những gì đã cho phép giao diện Collection được mở rộng với các phương pháp bổ sung như .stream(), ví dụ, mà không phá vỡ tính tương thích ngược. Xem here để xem minh họa.

Điều đầu tiên cho phép tránh viết các lớp "túi phương pháp" thường chỉ tồn tại để cung cấp các phương thức tĩnh tiện ích trên giao diện. Một trong những ví dụ sẽ là Guava's Functions class (không nên trộn với Java 8 của Function mà nó về cơ bản đã đánh cắp từ ổi, cùng với Predicate và một vài người khác)

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