2014-02-13 5 views
0

В нижеследующем коде, b и show неотъемлемо статический?Стационарные члены класса статические в Java?

public class A { 
    public static class B { 
     private int b = 0; 
     public void show() { 
      System.out.println(b); 
     } 
    } 
} 
+2

У экземпляра 'B' нет неявной ссылки на экземпляр' A' –

+0

Спасибо всем за такие подробные ответы. Однако я мог только принять его, хотя все были информативными. –

ответ

4

static ключевого слова в вашем примере коды означает, что экземпляры B может быть созданы без экземпляра А.

Если B не был статичным:

  • экземпляры будут иметь неявную ссылку на экземпляр от A.
  • Единственный способ создать их - использовать new B() внутри класса A или использовать синтаксис как new A().new B().
  • Методы в Bмогут относятся к A.this (неявная ссылка на экземпляр A).
  • Методы в Bмогут относятся к A.this.someField (используя эту неявную ссылку).
  • Методы в Bмогут методы вызова (нестатические) методы в A.

Однако, поскольку B статична:

  • экземпляры не имеют ссылки на экземпляр A - вам не нужно A создать B.
  • Экземпляры могут быть созданы с помощью new A.B() (или просто new B() изнутри в классе A)
  • методы в Bне могут относятся к A.this.
  • Методы в Bне может поля доступа в A (если не переданы как параметр).
  • Методы в Bне может методы вызова (нестатические) методы в A.
+0

+1 Хорошая проработка :) –

+0

+1 Это покрывало все точки и ясно объясняло их. – Axoren

2

Они не являются статическими. Они являются полями экземпляров в B.
Это значит, что вам нужно иметь экземпляр B, чтобы получить/установить их.
B статический в A, но это не делает эти поля B статическими.
Вы можете создать множество экземпляров B без ссылки на A.
Итак, B - это статический класс в A, но это не так для полей экземпляров B.

+0

Как они «статичны» по отношению к «А». На самом деле вы не должны даже говорить об этом wrt 'A', поскольку они являются членами класса' B'. –

+0

Поскольку B является статическим классом в A. –

+0

Можете ли вы объяснить, как именно это делает поля в 'B'' static'? –

9

Нет, они не являются static. Вам необходимо создать экземпляр B для доступа к ним.

0

B является статическим внутренним классом А. нужно создать экземпляр B.

A.B innerObject = new A.B(); 
innerObject.show(); 
1

Статический ключевое слово имеет два значения, которые на самом деле очень разные, и это может привести к путанице.

Статический метод переменной/означает, что он существует на уровне класса, а не на уровне экземпляра. Это означает, что у вас есть только одна копия этой переменной/метода независимо от количества экземпляров создаваемого вами класса.

Статический на внутреннем классе, хотя это означает, что класс не зависит от его внешнего класса. В вашем примере вы можете создать new B() без A. Если у вас не было статического ключевого слова в классе, вы не смогли бы создать new B(), если он не был в экземпляре A.

0

Идентификатор static имеет здесь определенную цель, которую многие люди не сразу схватывают. Я собираюсь взять ваш код и немного изменить его.

public class A { 
    private int a; 
    public A(int a) { 
     this.a = a; 
    } 

    public class B { 
     public void show() { 
      System.out.println(a); 
     } 
    } 
} 

Теперь, что происходит в классе B? Поскольку B является нестатическим классом, он имеет доступ к другим нестатическим членам класса A. По сути, он утверждает, что каждый объект класса A имеет свой собственный вкус объектов класса B, даже если они считаются функционально одинаковыми. Для нас, чтобы получить то же поведение, если B был статический класс:

public class A { 
    private int a; 
    public A(int a) { 
     this.a = a; 
    } 

    public int getA() { return a; } 

    public static class B { 
     public void show(A a) { 
      System.out.println(a.getA()); 
     } 
    } 
} 

Здесь это означает, что аромат B объектов не меняется в зависимости от объекта A создал его. Класс B является статическим, так что он не может получить доступ к нестационарным членам объекта класса A, который его создал, и должен явно получить доступ к этим элементам из любого объекта A, с которым он хочет взаимодействовать.

В предыдущей реализации объект B мог бы легко получать доступ к полям и нестационарным методам объекта A, который его создал.

Это два разных поведения, и часто ясно, что именно соответствует вашей цели.

Смежные вопросы