Вопрос

Чтобы быть конкретным, я пробовал этот код:

package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

Но это выдало ошибку

Не удается получить доступ к нестатическому полю в статическом методе main

Поэтому я изменил объявление clock к этому:

static Clock clock = new Clock();

И это сработало.Что значит поместить это ключевое слово перед объявлением?Что именно это будет делать и / или ограничивать с точки зрения того, что может быть сделано с этим объектом?

Это было полезно?

Решение

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

Это означает , что только один экземпляр static поле существует[1] даже если вы создадите миллион экземпляров класса или не создадите ни одного.Он будет общим для всех экземпляров.

С тех пор как static методы также не принадлежат конкретному экземпляру, они не могут ссылаться на членов экземпляра.В приведенном примере, main не знает, какой экземпляр Hello класс (и, следовательно, какой экземпляр Clock класс), на который он должен ссылаться. static участники могут ссылаться только на static Участники.Участники экземпляра, конечно, могут получить доступ static Участники.

Боковое примечание: Конечно, static участники могут получить доступ к элементам экземпляра через ссылку на объект.

Пример:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;

        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[1]:В зависимости от характеристик среды выполнения, это может быть по одному на ClassLoader, AppDomain или thread, но это не относится к делу.

Другие советы

Это означает, что существует только один экземпляр "Clock" в Hello, не по одному на каждый отдельный экземпляр " Hello " класс, или более того, это означает, что будет один общедоступный «clock» ссылка среди всех случаев " Hello " класс.

Так что, если вы хотите сделать " новый Hello " в любом месте вашего кода: A - в первом сценарии (до изменения, без использования «статического») он будет каждый раз делать новые часы «новым Hello». называется, но B- во втором сценарии (после изменения, используя «статический»), каждый «новый Hello» экземпляр будет по-прежнему совместно использовать и использовать исходные и те же «часы» ссылка создана.

Если вам не нужны "часы" где-то за пределами main, это будет работать так же хорошо:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}

Тот Самый static ключевое слово означает, что что-либо (поле, метод или вложенный класс) связано с Тип скорее, чем какой-либо конкретный экземпляр такого типа.Так, например, один из них вызывает Math.sin(...) без какого-либо экземпляра Math класс, да и вообще вы не могу создайте экземпляр Math класс.

Для получения дополнительной информации смотрите соответствующий фрагмент руководства Oracle по Java.


Побочное примечание

Java, к сожалению позволяет вы можете получить доступ к статическим членам, как если бы они были членами экземпляра, например

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

Это делает его посмотри как будто sleep это метод экземпляра, но на самом деле это статический метод - он всегда переводит текущий поток в спящий режим.Лучше всего прояснить это в вызывающем коде:

// Clearer
Thread.sleep(5000);

Ключевое слово static в Java означает, что переменная или функция являются общими для всех экземпляров этого класса, так как они принадлежат типу , а не самим фактическим объектам.

Таким образом, если у вас есть переменная: private static int i = 0; и вы увеличиваете ее ( i ++ ) в одном экземпляре, изменение будет отражено во всех экземплярах. , i теперь будет 1 во всех случаях.

Статические методы могут использоваться без создания объекта.

Основное использование статических элементов ...

public class Hello
{
    // value / method
    public static String staticValue;
    public String nonStaticValue;
}

class A
{
    Hello hello = new Hello();
    hello.staticValue = "abc";
    hello.nonStaticValue = "xyz";
}

class B
{
    Hello hello2 = new Hello(); // here staticValue = "abc"
    hello2.staticValue; // will have value of "abc"
    hello2.nonStaticValue; // will have value of null
}

Таким образом, вы можете иметь общие значения для всех членов класса, не отправляя экземпляр класса Hello другому классу. И, кроме статики, вам не нужно создавать экземпляр класса.

Hello hello = new Hello();
hello.staticValue = "abc";

Вы можете просто вызывать статические значения или методы по имени класса:

Hello.staticValue = "abc";

Статический в Java:

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

Ключевое слово Static МОЖЕТ быть использовано с:

Способ

Переменная

Класс, вложенный в другой класс

Блок инициализации

НЕ может быть использован с:

Класс (не вложенный)

Конструктор

Интерфейсы

Метод локального внутреннего класса (разница затем вложенный класс)

Методы внутреннего класса

Переменные экземпляра

Локальные переменные

Пример:

Представьте себе следующий пример, в котором есть переменная экземпляра с именем count который увеличивается в конструкторе:

package pkg;

class StaticExample {
    int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

Выходной сигнал:

1 1 1

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

Теперь, если мы измените значение переменной экземпляра count на статическое во-первых, тогда программа выдаст другой результат:

package pkg;

class StaticExample {
    static int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

Выходной сигнал:

1 2 3

В этом случае статическая переменная получит доступ к памяти только один раз, если какой-либо объект изменит значение статической переменной, он сохранит свое значение.

Статический с Окончательным:

Глобальная переменная, которая объявлена как окончательный и статичный остается неизменным на протяжении всего выполнения.Потому что статические члены хранятся в памяти класса и загружаются только один раз за все время выполнения.Они являются общими для всех объектов класса.Если вы объявляете статические переменные как окончательные, ни один из объектов не может изменить их значение, поскольку оно является окончательным.Поэтому переменные, объявленные как конечные и статические, иногда называются константами.Все поля интерфейсов называются константами, поскольку по умолчанию они являются окончательными и статическими.

enter image description here

Ресурс изображения : Конечная Статика

Статический означает, что вам не нужно создавать экземпляр класса, чтобы использовать методы или переменные, связанные с классом. В вашем примере вы могли бы позвонить:

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

напрямую, вместо:

Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

Внутри статического метода (который принадлежит классу) вы не можете получить доступ к любым элементам, которые не являются статическими, так как их значения зависят от вашего экземпляра класса. Нестатический объект Clock, являющийся членом экземпляра, будет иметь различное значение / ссылку для каждого экземпляра вашего класса Hello, и поэтому вы не сможете получить к нему доступ из статической части класса.

В этом обсуждении до сих пор игнорировались соображения загрузчика классов. Строго говоря, статические поля Java совместно используются всеми экземплярами класса для данного загрузчика классов .

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

Процентная ставка 2% применяется ко ВСЕМ сберегательным счетам. Следовательно, он статический .

Баланс должен быть индивидуальным , поэтому он не статичен.

 введите описание изображения здесь

Поле может быть назначено либо классу, либо экземпляру класса. По умолчанию поля являются переменными экземпляра. При использовании static поле становится переменной класса, таким образом, имеется один и только один clock . Если вы вносите изменения в одном месте, это видно везде. Varables экземпляра меняются независимо друг от друга.

Ключевое слово static используется для обозначения поля или метода как принадлежащих самому классу, а не экземпляру. Используя ваш код, если объект Clock является статическим, все экземпляры класса Hello будут использовать этот элемент данных (поле) Clock в общий. Если вы сделаете его нестатичным, каждый отдельный экземпляр Hello может иметь уникальное поле Clock .

Проблема в том, что вы добавили метод main в свой класс Hello , чтобы вы могли запустить код. Проблема здесь заключается в том, что метод main является статическим и поэтому не может ссылаться на нестатические поля или методы внутри него. Вы можете решить эту проблему двумя способами:

<Ол>
  • Сделайте все поля и методы класса Hello статическими, чтобы на них можно было ссылаться внутри метода main . Это действительно не очень хорошая вещь (или неправильная причина, по которой поле и / или метод становятся статическими)
  • Создайте экземпляр вашего класса Hello внутри метода main и получите доступ ко всем его полям и методам так, как они были предназначены в первую очередь.
  • Для вас это означает следующее изменение вашего кода:

    package hello;
    
    public class Hello {
    
        private Clock clock = new Clock();
    
        public Clock getClock() {
            return clock;
        }
    
        public static void main(String args[]) {
            Hello hello = new Hello();
            hello.getClock().sayTime();
        }
    }
    

    На языке Java static ключевое слово можно просто рассматривать как указывающее на следующее:

    "без учета или отношения к какому-либо конкретному случаю"

    Если вы подумаете о static таким образом, становится легче понять его использование в различных контекстах, в которых он встречается:

    • A static field - это поле, которое принадлежит классу, а не какому-либо конкретному экземпляру

    • A static метод - это метод, который не имеет понятия о this;он определен в классе и не знает ни о каком конкретном экземпляре этого класса, если на него не передана ссылка

    • A static класс-член - это вложенный класс без какого-либо представления или знания экземпляра включающего его класса (если только ему не передана ссылка на экземпляр включающего класса).

    Static делает член часов членом класса вместо члена экземпляра. Без ключевого слова static вам нужно было бы создать экземпляр класса Hello (который имеет переменную-член clock), например

    .
    Hello hello = new Hello();
    hello.clock.sayTime();
    

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

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

    Вызывающему классу не нужно создавать другую переменную-член (экземпляр) вспомогательного класса. Вы просто вызываете методы вспомогательного класса. Также улучшен вспомогательный класс, поскольку вам больше не нужен конструктор и вам не нужны переменные-члены (экземпляры).

    Возможно, есть и другие преимущества.

    Можно также подумать о статических членах, не имеющих " this " указатель. Они являются общими для всех экземпляров.

    Понимание статических концепций

    public class StaticPractise1 {
        public static void main(String[] args) {
            StaticPractise2 staticPractise2 = new StaticPractise2();
            staticPractise2.printUddhav(); //true
            StaticPractise2.printUddhav(); /* false, because printUddhav() is although inside StaticPractise2, but it is where exactly depends on PC program counter on runtime. */
    
            StaticPractise2.printUddhavsStatic1(); //true
            staticPractise2.printUddhavsStatic1(); /*false, because, when staticPractise2 is blueprinted, it tracks everything other than static  things and it organizes in its own heap. So, class static methods, object can't reference */
    
        }
    }
    

    Второй класс

    public class StaticPractise2 {
        public static void printUddhavsStatic1() {
            System.out.println("Uddhav");
        }
    
        public void printUddhav() {
            System.out.println("Uddhav");
        }
    }
    
    //Here is an example 
    
    public class StaticClass 
    {
        static int version;
        public void printVersion() {
             System.out.println(version);
        }
    }
    
    public class MainClass 
    {
        public static void main(String args[]) {  
            StaticClass staticVar1 = new StaticClass();
            staticVar1.version = 10;
            staticVar1.printVersion() // Output 10
    
            StaticClass staticVar2 = new StaticClass();
            staticVar2.printVersion() // Output 10
            staticVar2.version = 20;
            staticVar2.printVersion() // Output 20
            staticVar1.printVersion() // Output 20
        }
    }
    

    main () - статический метод, имеющий два фундаментальных ограничения:

    <Ол>
  • Статический метод не может использовать нестатический элемент данных или напрямую вызывать нестатический метод.
  • this () и super () нельзя использовать в статическом контексте.

    class A {  
        int a = 40; //non static
        public static void main(String args[]) {  
            System.out.println(a);  
        }  
    }
    
  •   

    Вывод: ошибка времени компиляции

    Статические переменные Доступ возможен только в статических методах, поэтому, когда мы объявляем статические переменные, методы getter и setter будут статическими методами

    статические методы - это уровень класса, к которому мы можем получить доступ, используя имя класса

    Ниже приведен пример получения и установки статических переменных:

    public class Static 
    {
    
        private static String owner;
        private static int rent;
        private String car;
        public String getCar() {
            return car;
        }
        public void setCar(String car) {
            this.car = car;
        }
        public static int getRent() {
            return rent;
        }
        public static void setRent(int rent) {
            Static.rent = rent;
        }
        public static String getOwner() {
            return owner;
        }
    
        public static void setOwner(String owner) {
            Static.owner = owner;
        }
    
    }
    
      

    При запуске какого-либо проекта сначала загружаются статические объекты (переменные, методы, блоки ..).

    При запуске этого проекта основной метод загружается первым. Потому что это статический метод . Тогда это выглядит объектом " a " объект . Но объект еще не определен. Потому что это не статично. Тогда приходите, как эта ошибка.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top