2013-06-21 3 views
18

Мне интересно, как нестатический метод может изменять статическую переменную экземпляра. Я знаю, что статические методы могут обращаться только к другим статическим методам и статическим переменным. Однако, правда ли другая сторона? Могут ли нестатические методы обращаться к нестационарным переменным? Например:Могут ли нестатические методы изменять статические переменные

public class SampleClass { 
    private static int currentCount = 0; 

    public SampleClass() { 
    currentCount++; 
    } 

    public void increaseCount() { 
    currentCount++; 
    } 
} 

Этот код компилируется, и я хотел бы знать, почему с точки зрения статического доступа.

+6

пытались ли вы его? –

+1

@Marco Да, он компилируется. Просто интересно, знают ли люди это где-нибудь, и правильно ли мои рассуждения. –

+2

На самом деле не так, что статические методы не могут изменять переменные экземпляра. Просто они не имеют никаких скрытых «этих» ссылок. Вы можете написать 'class Ex {private int x; static void fn (Ex ex) {ex.x = 12; }} '. Кстати: Мутированная статика - это, как правило, плохая идея. –

ответ

23

Я нашел это от The Java Tutorials

  • методы экземпляра может получить доступ к переменному экземпляру и методам экземпляра непосредственно.
  • Методы экземпляров могут напрямую обращаться к переменным класса и методам класса.
  • Методы класса могут напрямую обращаться к переменным класса и методам класса.
  • Методы класса не могут напрямую обращаться к переменным экземпляра или методам экземпляра - они должны использовать ссылку на объект. Кроме того, методы класса не могут использовать это ключевое слово, так как для этого нет экземпляра.

Так что ответ да, то не статические методы могут изменить статические переменные

15

Нет, любой нестатический метод имеет доступ к статическим членам. Единственный способ, которым это было бы ложным, - это если нестатический контекст не имел доступа к статическому члену (например, статический член является приватным классу, а нестатический код не входит в этот класс). существуют статические переменные для предоставления бесплатной переменной/метода экземпляра, поэтому, например, если у нас есть класс Game и переменная с рекордом, рекордер будет статичным (доступным без экземпляра) и после каждой игры (экземпляр класса Game) мы можем изменить рекорды из нашего нестатического контекста, если наш счет больше, чем высокий балл.

+0

Спасибо, человек. Я не знал о частной вещи, и у меня возникла головная боль ... –

0

Посмотрите на это так. Статическая переменная может быть доступна во многих отношениях. Один из наиболее распространенных заключается в том, чтобы предшествовать имени var с именем класса, поскольку статические vars для каждого класса. Поскольку вы ссылаетесь на эту переменную в том же классе, вы освобождаетесь от , имеющей, перед имением с именем класса. Неважно, где вы называете статическую переменную. Также это частный статический var, недоступный для любого другого класса.

0

Статические методы не могут изменять Non-статические поля с - Для использования нестатический поля (вне класса), вы должны создать экземпляр class object, Но для использования статического метода вообще нет необходимости в создании объекта. Вот почему это не разумно для нестатического метода (который не требует создания экземпляра объекта) , чтобы изменить поле, которое должно быть создано.

Для этого - Статические методы могут касаться только статических полей (или вызвать другие статические методы).

Но как вы уже упоминали, возможно, наоборот, Нестатический метод может изменять статическое поле, статичное для всех объектов его класса.

0

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

5

Нестационарные методы могут обращаться к статическим переменным. Статические методы могут напрямую обращаться к статическим переменным или методам без создания объекта object.ex: public static void main (String arg [])

+0

Без * использования * объекта. Он может быть представлен как параметр. – EJP

0

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

0

Non-Статические методы могут получить доступ как статические переменные & статические методы, как они членами класса

Demo Code

public class Static_Class { 
    protected static String str; 
    private static int runningLoop; 

    static{ 
     str = "Static Block"; 
    } 

    /** 
    * Non-Static Method Accessing Static Member 
    */ 
    public void modifyStaticMember(){ 
     str = "Non-Static Method";  
    } 

    /** 
    * Non-Static Method invoking Static Method 
    */ 
    public void invokeStaticMethod(){ 
     String[] args = {}; 
     if(runningLoop == 0){ 
      runningLoop++; 
      main(args); 
     } 
     //Exiting as it will lead to java.lang.StackOverflowError 
     System.exit(0); 
    } 

    public static void main(String[] args) { 
     Static_Class instance = new Static_Class(); 
     System.out.println(str); 
     instance.modifyStaticMember(); 

     // Changed Value persists 
     System.out.println(str); 

     //Invoking Static Method 
     instance.invokeStaticMethod(); 

    } 
} 
0

Да, статический метод может получить доступ к не статическую переменную. Это делается путем создания объекта в классе и доступа к переменной через объект. В приведенном ниже примере main является статическим методом, который обращается к переменной a, которая является нестатической переменной.

демо-код:

public class Sample { 

    private int a; 

    void method() 
    { 
     System.out.println("i am a private method"); 
    } 

    public static void main(String[] args) 
    { 
     Sample sample=new Sample(); 
     sample.a=10; 
     System.out.println(sample.a); 
    } 
}