Как статическая переменная (глобальная переменная) может быть объектом в Java?
Хорошо, я знаю, что этот вопрос либо звучит как здравый смысл, либо очень запутан из-за его формулировки. К сожалению, из-за недостатка знаний, даже после многих исследований, я не уверен, как это сформулировать. Насколько я понимаю на данный момент, статические переменные ссылаются не на экземпляр класса, а на класс.вызов метода используется для доступа к ним. переменные, объявленные нестатическими и открытыми, являются экземплярами класса и могут быть вызваны с помощью объекта.вызов метода. Однако в последнее время примеры, я видел утверждения, такие как:
private static Rectangle rect;
Почему бы просто не написать
public Rectangle rect;
Как это возможно? Я думал, что статические переменные не связаны с экземплярами классов ? Я просто очень запутался относительно значения и ограничений/использования статического и нестатического.Я приношу извинения за любую путаницу. Если этот вопрос будет сочтен неразрешимым, ссылка, дающая пример простого разграничения между статическим и публичным использованием, будет значительно оцененный. Я полный новичок, поэтому, пожалуйста, избегайте использования слишком много технического жаргона. Заранее спасибо.
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 связан с видимостью из других классов.