Чем отличается static java
В кодах при сравнении используются все цвета радуги — это сбивает не опытного программиста. Лучше бы весь код был написан чёрным цветом, а то, что различается — красным.
У меня немного странный вопрос. Почему мы используем ключевое слово «static» и для переменных, и для методов, хотя принципы совсем разные? В первом случае «static» показывает, что переменная как бы общая для всех объектов класса, она как бы переменная всего класса. А во втором — что работа ведется только со статическими переменными и внутрь метода не передаются данные ни о каком объекте. Почему и то, и то статик? В чем логика использования и там, и там одного и того же ключевого слова?
на заметку, для понимания: статические переменные и методы можно вызывать без создания экземпляра класса. этого должно быть длостаточно на текущий момент.
Была прекрасная статья про Статик: https://javarush.com/groups/posts/modifikator-static-java Насколько, я понял: Если статик, то принадлежит классу, а не объекту класса. И неважно переменная эта или метод. Соответственно статик ни чего не может делать с объектом, раз объект не его.
Видимо, статические методы — это как-бы стратегические методы, они выполняют принципиальные задачи и поэтому важны в плане наследования. Отсюда и отделенность от объектов, то есть в одном ограниченность, зато в другом перспектива. Обычные методы более приземленные, и закрывают насущные потребности. Они не понадобятся дальше, так почему не упростить с ними работу сейчас. Статика, это кости, а обычные методы — мясо.
10 заметок о модификаторе Static в Java
Модификатор static в Java напрямую связан с классом. Если поле статично, значит оно принадлежит классу, если метод статичный — аналогично: он принадлежит классу. Исходя из этого, можно обращаться к статическому методу или полю, используя имя класса. Например, если поле count статично в классе Counter, значит, вы можете обратиться к переменной запросом вида: Counter.count. Прежде чем приступить к заметкам, давайте вспомним (а может быть, узнаем), что такое static и что может быть статическим в Java. Static — модификатор, применяемый к полю, блоку, методу или внутреннему классу. Данный модификатор указывает на привязку субъекта к текущему классу.
Статические поля
При обозначении переменной уровня класса мы указываем на то, что это значение относится к классу. Если этого не делать, то значение переменной будет привязываться к объекту, созданному по этому классу. Что это значит? А то, что если переменная не статическая, то у каждого нового объекта данного класса будет своё значение этой переменной, меняя которое мы меняем его исключительно в одном объекте: Например, у нас есть класс Car с нестатической переменной:
Car orangeCar = new Car(); orangeCar.km = 100; Car blueCar = new Car(); blueCar.km = 85; System.out.println("Orange car - " + orangeCar.km); System.out.println("Blue car - " + blueCar.km);
Orange car - 100 Blue car - 85
Как видим, у каждого объекта своя переменная, изменение которой происходит только для этого объекта. Ну а если у нас переменная статическая, то это глобальное значение — одно для всех: Теперь мы имеем Car со статической переменной:
Orange car - 85 Blue car - 85
Ведь переменная у нас одна на всех, и каждый раз мы меняем именно ее. К статическим переменным, как правило обращаются не по ссылке на объект — orangeCar.km, а по имени класса — Car.km
Статический блок
Есть два блока инициализации — обычный и статический. Блок предназначен для инициализации внутренних переменных. Если блок обычный, то им инициализируют внутренние переменные объекта, если же статический, соответственно, им задают статические переменные (то есть переменные класса). Пример класса со статическим блоком инициализации:
Статический метод
Статические методы отличаются от обычных тем, что они также привязаны к классу, а не к объекту. Важным свойством статического метода является то, что он может обратиться только к статическим переменным/методам. В качестве примера давайте рассмотрим класс, который у нас будет неким счётчиком, ведущим учет вызовов метода:
Counter.invokeCounter(); Counter.invokeCounter(); Counter.invokeCounter();
Текущее значение счётчика - 1 Текущее значение счётчика - 2 Текущее значение счётчика - 3
Статический класс в Java
Статическим классом может быть только внутренний класс. Опять же, этот класс привязан к внешнему классу, и если внешний наследуется другим классом, то этот не будет наследован. При этом данный класс можно наследовать, как и он может наследоваться от любого другого класса и имплементировать интерфейс. По сути статический вложенный класс ничем не отличается от любого другого внутреннего класса за исключением того, что его объект не содержит ссылку на создавший его объект внешнего класса. Тем не менее, благодаря этому статический класс наиболее похож на обычный не вложенный, ведь единственное различие состоит в том, что он упакован в другой класс. В некоторых случаях для нас это преимущество, так как с него у нас есть доступ к приватным статическим переменным внешнего класса. Пример вложенного статического класса:
Vehicle.Car car = new Vehicle.Car(); car.km = 90;
Для использования статических методов/переменных/класса нам не нужно создавать объект данного класса. Конечно, следует учитывать модификаторы доступа. Например, поля private доступны только внутри класса, в котором они объявлены. Поля protected доступны всем классам внутри пакета (package), а также всем классам-наследникам вне пакета. Для более подробной информации ознакомьтесь со статьей “private vs protected vs public”. Предположим, существует статический метод increment() в классе Counter , задачей которого является инкрементирование счётчика count . Для вызова данного метода можно использовать обращение вида Counter.increment() . Нет необходимости создавать экземпляр класса Counter для доступа к статическому полю или методу. Это фундаментальное отличие между статическими и НЕ статическими объектами (членами класса). Еще раз напомню, что статические члены класса напрямую принадлежат классу, а не его экземпляру. То есть, значение статической переменной count будет одинаковое для всех объектов типа Counter . Далее в этой статье мы рассмотрим основополагающие аспекты применения модификатора static в Java, а также некоторые особенности, которые помогут понять ключевые концепции программирования.
Что должен знать каждый программист о модификаторе Static в Java
- Вы НЕ можете получить доступ к НЕ статическим членам класса, внутри статического контекста, как вариант, метода или блока. Результатом компиляции приведенного ниже кода будет ошибка:
class Vehicle < public static void kmToMiles(int km)< System.out.println("Внутри родительского класса/статического метода"); >> class Car extends Vehicle < public static void kmToMiles(int km)< System.out.println("Внутри дочернего класса/статического метода "); >> public class Demo< public static void main(String args[])< Vehicle v = new Car(); v.kmToMiles(10); >>
Чем отличается static java
Короче, выжимка следующая: 1. Статические методы и переменные принадлежат самому классу, а не конкретному экземпляру класса. Они могут быть вызваны или использованы без создания экземпляра класса. Статические методы не могут напрямую обращаться к нестатическим методам и переменным, так как они не имеют доступа к экземпляру класса (this). Примером статического метода в Java является main(), который является точкой входа в приложение.
class MyClass < static void staticMethod() < System.out.println("Static method"); >> // Call static method MyClass.staticMethod(); // prints "Static method"
2. Обычные методы принадлежат экземпляру класса. Они имеют доступ к любым переменным экземпляра и могут вызывать любые другие обычные методы того же экземпляра класса. Они не могут быть вызваны без создания экземпляра класса. Однако, они могут вызывать статические методы и обращаться к статическим переменным.
class MyClass < void instanceMethod() < System.out.println("Instance method"); >> // Create instance and call instance method MyClass obj = new MyClass(); obj.instanceMethod(); // prints "Instance method"
3.Статические переменные также принадлежат классу, а не конкретному экземпляру класса. Они делятся всеми экземплярами этого класса. Примером статической переменной в Java является System.out.
class MyClass < static int staticVar = 10; >// Access static variable System.out.println(MyClass.staticVar); // prints "10"
class MyClass < int instanceVar = 20; >// Create instance and access instance variable MyClass obj = new MyClass(); System.out.println(obj.instanceVar); // prints "20"
Статическая переменная — одна коробка и для класса и для всех его экземпляров. Обычная переменная — у каждого экземпляра класса своя коробка.
В книге Г. Шилдта зашла мне эта тема лучше. Иногда требуется определить такой член класса, который будет использоваться независимо от каких бы то ни было объектов этого класса. Как правило, доступ к члену класса организуется посредством объекта этого класса, но в то же время можно создать член класса для самостоятельного применения без ссылки на конкретный объект. Для того чтобы создать такой член класса, достаточно указать в самом начале его объявления ключевое слово static. Если член класса объявляется как static, он становится доступным до создания каких-либо объектов своего класса и без ссылки на какой-либо объект. С помощью ключевого слова static можно объявлять как переменные, так и методы. Такие члены и методы называются статическими. Наиболее характерным примером члена типа static служит метод main (), который объявляется таковым потому, что он должен вызываться виртуальной машиной Java в самом начале выполняемой программы. Для того чтобы воспользоваться членом типа static за пределами класса, достаточно дополнить имя данного члена именем класса, используя точечную нотацию. Но создавать объект для этого не нужно. В действительности член типа static оказывается доступным не по ссылке на объект, а по имени своего класса. Так, если требуется присвоить значение 10 переменной count типа static, являющейся членом класса Timer, то для этой цели можно воспользоваться следующей строкой кода:
Эта форма записи подобна той, что используется для доступа к обычным переменным экземпляра посредством объекта, но в ней указывается имя класса, а не объекта. Аналогичным образом вызываются методы типа static. Переменные, объявляемые как static, по существу являются глобальными. В силу этого при создании объектов данного класса копии статических переменных в них не создаются. Вместо этого все экземпляры класса совместно пользуются одной и той же статической переменной.