Как статическая переменная (глобальная переменная) может быть объектом в 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 связан с видимостью из других классов.