In laymans terms, what does 'static' mean in Java? [duplicate]
С точки зрения непрофессионала, что означает "статический" в Java?
Мне сказали несколько определений для этого, посмотрел в Википедии, но как новичок в Java, я все еще не уверен, что это значит. Кто-нибудь свободно владеет Java?
Переведено автоматически
Ответ 1
статический означает, что переменная или метод, помеченный как таковой, доступен на уровне класса. Другими словами, вам не нужно создавать экземпляр класса, чтобы получить к нему доступ.
publicclassFoo { publicstaticvoiddoStuff(){ // does stuff } }
Итак, вместо того, чтобы создавать экземпляр Foo и затем вызывать doStuff вот так:
Foof=newFoo(); f.doStuff();
Вы просто вызываете метод непосредственно для класса, вот так:
Foo.doStuff();
Ответ 2
С точки зрения совсем непрофессионала, класс - это форма, а объект - копия, созданная с помощью этой формы. Статический принадлежит форме и может быть доступен напрямую, без создания каких-либо копий, отсюда приведенный выше пример.
Ответ 3
Ключевое слово static может использоваться в Java несколькими различными способами, и почти во всех случаях это модификатор, который означает, что то, что оно изменяет, можно использовать без экземпляра окружающего объекта.
Java - объектно-ориентированный язык, и по умолчанию для большинства кода, который вы пишете, требуется использовать экземпляр объекта.
publicclassSomeObject { publicint someField; publicvoidsomeMethod() { }; public Class SomeInnerClass { }; }
Чтобы использовать someField, someMethod или SomeInnerClass, я должен сначала создать экземпляр SomeObject.
publicclassSomeOtherObject { publicvoiddoSomeStuff() { SomeObjectanInstance=newSomeObject(); anInstance.someField = 7; anInstance.someMethod(); //Non-static inner classes are usually not created outside of the //class instance so you don't normally see this syntax SomeInnerClassblah= anInstance.newSomeInnerClass(); } }
Если я объявляю эти вещи статическими , то они не требуют заключающего экземпляра.
publicclassSomeOtherObject { publicvoiddoSomeStuff() { SomeObjectWithStaticStuff.someField = 7; SomeObjectWithStaticStuff.someMethod(); SomeObjectWithStaticStuff.SomeInnerClassblah=newSomeObjectWithStaticStuff.SomeInnerClass(); //Or you can also do this if your imports are correct SomeInnerClassblah2=newSomeInnerClass(); } }
Declaring something static has several implications.
First, there can only ever one value of a static field throughout your entire application.
publicclassSomeOtherObject { publicvoiddoSomeStuff() { //Two objects, two different values SomeObjectinstanceOne=newSomeObject(); SomeObjectinstanceTwo=newSomeObject(); instanceOne.someField = 7; instanceTwo.someField = 10; //Static object, only ever one value SomeObjectWithStaticStuff.someField = 7; SomeObjectWithStaticStuff.someField = 10; //Redefines the above set } }
The second issue is that static methods and inner classes cannot access fields in the enclosing object (since there isn't one).
publicstaticvoidsomeStaticMethod() { nonStaticField = 7; //Not allowed this.nonStaticField = 7; //Not allowed, can never use *this* in static nonStaticMethod(); //Not allowed super.someSuperMethod(); //Not allowed, can never use *super* in static }
publicstaticclassSomeStaticInnerClass {
publicvoiddoStuff() { someStaticField = 7; //Not allowed nonStaticMethod(); //Not allowed someStaticMethod(); //This is ok }
} }
The static keyword can also be applied to inner interfaces, annotations, and enums.
In all of these cases the keyword is redundant and has no effect. Interfaces, annotations, and enums are static by default because they never have a relationship to an inner class.
This just describes what they keyword does. It does not describe whether the use of the keyword is a bad idea or not. That can be covered in more detail in other questions such as Is using a lot of static methods a bad thing?
There are also a few less common uses of the keyword static. There are static imports which allow you to use static types (including interfaces, annotations, and enums not redundantly marked static) unqualified.
Lastly, there are static initializers which are blocks of code that are run when the class is first loaded (which is usually just before a class is instantiated for the first time in an application) and (like static methods) cannot access non-static fields or methods.
publicclassSomeObject {
privatestaticint x;
static { x = 7; } }
Ответ 4
Another great example of when static attributes and operations are used when you want to apply the Singleton design pattern. In a nutshell, the Singleton design pattern ensures that one and only one object of a particular class is ever constructeed during the lifetime of your system. to ensure that only one object is ever constructed, typical implemenations of the Singleton pattern keep an internal static reference to the single allowed object instance, and access to that instance is controlled using a static operation