Что делает ключевое слово static в классе? - PullRequest
421 голосов
/ 05 января 2009

Если быть точным, я пытался этот код:

package hello;

public class Hello {

    Clock clock = new Clock();

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

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

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

Поэтому я изменил объявление clock на следующее:

static Clock clock = new Clock();

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

Ответы [ 21 ]

6 голосов
/ 12 ноября 2014

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

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

  1. Сделайте все поля и методы класса Hello статическими, чтобы к ним можно было обращаться из метода main . Это действительно не очень хорошая вещь (или неправильная причина, по которой поле и / или метод становятся статическими)
  2. Создайте экземпляр вашего класса 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();
    }
}
6 голосов
/ 03 октября 2015

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

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

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

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

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

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

5 голосов
/ 05 января 2009

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

5 голосов
/ 05 января 2009

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

Hello hello = new Hello();
hello.clock.sayTime();
5 голосов
/ 18 декабря 2012

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

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

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

3 голосов
/ 18 сентября 2018
//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
    }
}
3 голосов
/ 04 апреля 2017

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

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");
    }
}
3 голосов
/ 05 января 2009

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

2 голосов
/ 13 мая 2015

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

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

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

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

1 голос
/ 24 июня 2015

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

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

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

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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...