Как статическая переменная (глобальная переменная) может быть объектом в Java?


Хорошо, я знаю, что этот вопрос либо звучит как здравый смысл, либо очень запутан из-за его формулировки. К сожалению, из-за недостатка знаний, даже после многих исследований, я не уверен, как это сформулировать. Насколько я понимаю на данный момент, статические переменные ссылаются не на экземпляр класса, а на класс.вызов метода используется для доступа к ним. переменные, объявленные нестатическими и открытыми, являются экземплярами класса и могут быть вызваны с помощью объекта.вызов метода. Однако в последнее время примеры, я видел утверждения, такие как:

private static Rectangle rect; 

Почему бы просто не написать

public Rectangle rect;

Как это возможно? Я думал, что статические переменные не связаны с экземплярами классов ? Я просто очень запутался относительно значения и ограничений/использования статического и нестатического.Я приношу извинения за любую путаницу. Если этот вопрос будет сочтен неразрешимым, ссылка, дающая пример простого разграничения между статическим и публичным использованием, будет значительно оцененный. Я полный новичок, поэтому, пожалуйста, избегайте использования слишком много технического жаргона. Заранее спасибо.

4 3

4 ответа:

public/protected/private не имеют ничего общего с static.

static означает, что элемент (будь то элемент данных или метод) принадлежит классу , а не конкретному экземпляру .

public/protected/private просто контролируйте, какие другие классы могут получить доступ к этим членам, будь то члены экземпляра или члены static.

Рассмотрим FirstClass и SecondClass ниже:

public class FirstClass {
    private static Rectangle rect;
    // getters and setters
}

И

public class SecondClass {
    private Rectangle rect; 
    // getters and setters
}

Вы можете создать столько экземпляров FirstClass и SecondClass, сколько захотите. Однако rect обрабатывается по-разному двумя классами из-за ключевого слова static:

  • в случае FirstClass, rect является переменной класса , указывая, что будет только одна ссылка на экземпляр Rectangle. Обратите внимание, что в зависимости от реализации FirstClass Вы можете или не должны создавать экземпляр FirstClass вообще, и все же есть ссылка на rect.
  • в случае SecondClass, rect переменная экземпляра означает, что каждый экземпляр SecondClass всегда будет иметь ссылку на экземпляр Rectangle. Однако эти ссылки не существуют, если не создан экземпляр SecondClass.

Я предлагаю вам прочитать опонимании членов класса в официальном учебнике Java. С самой первой строки:

Ключевое слово static для создания полей и методов, принадлежащих класс, а не к экземпляру класса.

Чтобы ответить на эту разницу, рассмотрим следующий пример:

class MyClass {
    public static Rectangle rect = new Rectangle();
    public Rectangle rect1;
    public MyClass(Rectangle rect1) {
       this.rect1 = rect1
    }
}

Теперь, если мне нравится:

MyClass clazz1 = new MyClass(new Rectangle());
MyClass clazz2 = new MyClass(new Rectangle());

Сколько экземпляров вы видите rect и сколько rect1? Вы можете иметь rect1, связанный с каждым объектом, в то время как у вас будет только один экземпляр rect и общий для каждого класса.

Во-первых, чтобы отменить различие, предположим, что это как написано в некотором классе Foo,

public class Foo{
  private static Rectangle rect;
}

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

public class Foo{
 public  Rectangle rect;
}

Это означает, что rect можно получить из любого другого класса, создав экземпляр Foo.

Когда статика не ассоциируется с каким-либо объектом, это означает, что вам не нужно создавать объект для статической переменной accessin и ее общего количества во всех экземплярах. Однако private / public/proctected связан с видимостью из других классов.