2016-07-14 13 views
5

Trong tất cả các hướng dẫn từ khóa super Tôi tìm thấy trực tuyến, thật khó để có được bất kỳ ví dụ nào gần hơn. Câu hỏi của tôi:Java - siêu từ khóa trong chủ đề mới Runnable - đề cập phương pháp không tĩnh qua lớp

  1. sự khác biệt giữa Tracker.super.track(event);test.parent.Tracker.track(event); là gì?

  2. Tại sao công việc đầu tiên?

  3. Tracker.super là gì? Một đối tượng hoặc một lớp học?

lớp con:

package test; 

public class Tracker extends test.parent.Tracker { 


@Override 
    public void track(final Event event) { 
    Executor.execute(new Runnable() { 
     public void run() { 
      Tracker.super.track(event); //this works!! why?? 
      super.track(event); // compile error: cannot resolve 
      test.parent.Tracker.track(event); //compile error: can only reference static method 
     } 
    }); 
    } 

} 

siêu lớp

package test.parent; 

public abstract class Tracker { 

public void track(Event event) {} 

} 

tham khảo cập nhật:

Trong jls8, 15.11.2

"Giả sử rằng biểu thức truy cập trường T.super.f xuất hiện trong lớp C và lớp con ngay lập tức của lớp được biểu thị bằng T là lớp có tên đủ điều kiện là S. Nếu f trong S có thể truy cập từ C, thì T. super.f được coi như là biểu thức this.f trong phần thân của lớp S. Nếu không, một lỗi biên dịch sẽ xảy ra.

Như vậy, T.super.f thể truy cập vào e lĩnh vực có thể truy cập trong lớp S, thậm chí nếu lĩnh vực đó là ẩn bởi một tuyên bố của một trường e trong lớp T.

Đó là một thời gian biên dịch lỗi nếu lớp hiện tại không phải là một lớp bên trong của lớp T hoặc T riêng của mình."

+0

'System.out.println (Tracker.class.getName()); ' –

+0

@ElliottFrisch Có nghĩa là gì? Bạn có thể xây dựng? –

+0

Bạn đang tạo (và hỏi về) đặt tên bóng trong một lớp địa phương ẩn danh (bạn cũng đang phân lớp 'Runnable'). Chọn bất kỳ tên nào bạn muốn tìm ra, và in nó bằng cách nhận được các lớp học. –

Trả lời

3

phương pháp run() của bạn là trong một lớp con nặc danh của Runnable nơi mà nó cũng là một lớp bên trong của Tracker.

có hiệu quả giống như

package test; 

public class Tracker extends test.parent.Tracker { 

... 
@Override 
    public void track(final Event event) { 
    //anonymous class translated into local class 
    class TrackerRunnable implements Runnable { 
     public void run(){ 
     Tracker.super.track(event); //this works!! why?? 
     super.track(event); // compile error: cannot resolve 
     test.parent.Tracker.track(event); //compile error: can only reference static method 
     } 
    } 

    Executor.execute(new TrackerRunnable()); 
    } 
} 

Trong Java một lớp bên trong cũng có một tham chiếu đến các lớp bên ngoài mà nó "thuộc" để. Bạn sẽ tham chiếu this cho TrackerRunnable dưới dạng this bên trong hoạt động, nhưng nếu bạn cần truy cập vào phiên bản Tracker thì TrackerRunnable có liên quan với bạn, bạn sẽ truy cập vào số Tracker.this. Điều tương tự với Tracker.super. Chỉ super là siêu lớp của TrackerRunnable không Tracker (trong trường hợp này là Runnable).

Điều chính cần lưu ý là đây là cú pháp được sử dụng để phân giải phạm vi chỉ trong các lớp bên trong và Tracker ở đây đề cập đến "Ví dụ của lớp Tracker mà tôi thuộc về". Trong trường hợp của test.parent.Tracker.trackTracker là "lớp Tracker", vì vậy bạn không thể gọi các thành viên cá thể trên chính lớp đó.

+1

'Không tĩnh bên trong' là một tautology, – EJP

+0

xấu của tôi về thuật ngữ của "lớp lồng nhau tĩnh" so với "lớp bên trong". Đã sửa câu trả lời. –

+0

@Pshemo EJP có nghĩa là những gì anh ta nói, và nó được nêu trong JLS. Tôi không trích dẫn các nguồn không quy định. – EJP

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