2016-01-12 13 views
26

Đây là bài tập huấn luyện để hiểu các hoạt động của các lớp bên trong trong Java. Theo câu hỏi, có bao nhiêu phiên bản khác nhau của x có thể truy cập được trong (*)?Có thể truy cập bao nhiêu phiên bản khác nhau của 'x' trong (*)?

class Outer { 
    int x; 

    class Inner extends Outer { 
     int x; 

     void f(int x) { 
      (*) 
     } 
    } 
} 

tôi nghiêng để nghĩ rằng có 3, cụ thể là: this.x, super.xx nhưng một số đồng nghiệp của tôi dường như nghĩ rằng có 4.

Những người trong chúng ta đang lúng túng? Và bạn có thể giải thích?

+16

Bleaaah, thật là một mớ hỗn độn. Nhưng tôi nghiêng về phía 4, phân biệt 'Outer.this.x' từ' super.x', bởi vì bạn có 'Outer' là cả supertype và một kiểu kèm theo, và chúng là khác biệt. –

+1

Chính xác.Với 'Outer a = new Outer(); Bên trong b = a.new Inner(); 'có 4 trong số chúng. –

+0

một số biểu mẫu cú pháp khác - 'Inner.super.x',' ((Bên ngoài) này) .x' – ZhongYu

Trả lời

30

Có 4, cụ thể là: x, this.x, super.xOuter.this.x.

xem xét như sau:

public class Outer { 

    int x; 

    public static void main(String[] args) { 
     Outer outer = new Outer(); 
     Outer.Inner inner = outer.new Inner(); 
     outer.x = 3; 
     inner.x = 2; 
     inner.f(1); 
    } 

    class Inner extends Outer { 
     int x; 

     void f(int x) { 
      System.out.println(super.x); 
      System.out.println(x); 
      System.out.println(this.x); 
      System.out.println(Outer.this.x); 
     } 
    } 

} 

Mã này sẽ in

0 
1 
2 
3 

thấy 4 giá trị khác nhau.

gì đang xảy ra như sau:

  1. Phụ huynh của inner dụ có một x biến unitialized. Đối với một số int, giá trị mặc định bằng 0: đây là super.x.
  2. Phương thức f được gọi với đối số 1: đây là x.
  3. Ví dụ inner đã được đặt x thành 2 với inner.x = 2: đây là this.x.
  4. Ví dụ outer, được Outer.this được đặt giá trị x thành 3: đây là Outer.this.x.

Bí quyết ở đây là Inner là cả một inner class (vì vậy nó có một kèm Outer chẳng hạn) và một subclass (vì vậy nó có một mẹ Outer chẳng hạn), và hai Outer trường hợp không giống nhau .

+0

Re: "a [subclass] (https://docs.oracle.com/javase/specs/jls/se8 /html/jls-8.html#jls-8.1.4) (do đó, nó có một trường hợp cha mẹ 'Outer')": Đây phải là "một [subclass] (https://docs.oracle.com/javase/specs /jls/se8/html/jls-8.html#jls-8.1.4) (vì vậy nó là chính nó là một ví dụ 'Outer')". (Hoặc đúng hơn: "a [subclass] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.4) (vì vậy các thể hiện của nó là chính nó' Outer 'trường hợp)".) – ruakh

10

Có bốn trong số họ:

  • Outer.this.x cho Outer lớp tài sản
  • this.x cho Inner lớp tài sản
  • super.x cho siêu loại Outer lớp tài sản
  • x cho đối số phương pháp
Các vấn đề liên quan