Подтвердить что ты не робот

Почему другие методы могут быть "статическими", но конструктор не может?

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

Кроме того, я не понимаю, почему я не могу создать статический конструктор.

Может ли кто-нибудь помочь объяснить эту концепцию?

4b9b3361

Ответ 1

В Java есть [статические конструкторы] статические блоки инициализации, которые можно рассматривать как "статический конструктор":

class Foo {
  static String Bar;
  static {
     // "static constructor"
     Bar = "Hello world!";
  }
}

В любом случае единственным методом в основном классе, который должен быть статичным, является метод main. Это происходит потому, что он вызывается без предварительного создания экземпляра "основного класса". Обычный метод и тот, который я предпочитаю, - это быстро выйти из статического контекста:

class Main {
   int argCount;

   // constructor
   public Main (String[] args) {
     // and back to boring ol' non-static Java
     argCount = args.length;       
   }

   void runIt () {
      System.out.println("arg count: " + argCount);
   }

   // must be static -- no Main instance created yet
   public static void main (String[] args) {
      Main me = new Main(args);
      me.runIt();
   }
}

Кроме того, static не имеет ничего общего с "конфликтами имен". Статический метод (или переменная) - это просто метод (или переменная), который не связан с конкретным экземпляром типа. Я бы порекомендовал прочитать Учебник по классам и объектам Java и раздел Понимание экземпляра и переменные класса.

Счастливое кодирование.

Ответ 2

Я разделяю одну из причин: "Почему конструктор java не является статичным".

Просто сказать: "Конструктор java всегда не статичен", потому что

Цель конструктора - только инициализировать/построить объект и сделать наследование возможным. Для этого нам нужно использовать два полезных слова Java (включая нестатические переменные), такие как this и super. Мы будем использовать 'this' для инициализации объекта. Мы /Java будем использовать super (forcourse super()) для вызова суперкласса суперкласса, чтобы сначала создать супер объект (или класс Object), затем дочерний объект (следовательно, наследование) Если конструктор является статическим, мы не можем использовать в нем два ключевых слова (нестатические переменные) (поскольку мы знаем, что нестатические элементы не могут ссылаться на статический контекст)

Поэтому конструкторы java не должны статично.

Ответ 3

Статические методы относятся к классу, а не к объекту. Основной метод должен быть статическим, потому что он вызывается первым, прежде чем какой-либо другой код выполнит для создания экземпляра любых объектов. Он обеспечивает отправную точку для программы. Статические методы вызывают извне контейнера объекта. То же самое относится к статическим переменным класса. Для всего класса существует только одна копия, в отличие от переменной-члена, которая создается один раз для каждого объекта, созданного из класса. Они используются для хранения данных для класса, таких как количество экземпляров объектов, которые были созданы и не уничтожены. Эти данные принадлежат классу. Хорошим примером статического метода является одноэлементный шаблон, в котором конструктор является закрытым и к нему может обращаться только статическая функция-член. Функция вне класса не сможет реплицировать эту функцию. Этот метод действует на данные класса и объекты, поэтому логически принадлежит к одному классу. Все это сводится к инкапсуляции. Класс отвечает только за себя и знает только себя.

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

Надеюсь, что это поможет.

Ответ 4

Конструктор используется для создания объектов.

Статический, как правило, тот же для всех объектов.

Итак, если у нас были статические конструкторы, создание одного объекта повлияло бы на все остальные существующие объекты.

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

Надеюсь, это поможет....:)

Ответ 5

Я написал простой пример как ответ на связанный с ним вопрос вчера, который может помочь сделать вещи более понятными: в чем смысл java-конструктора?

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

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

Ответ 6

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

и

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

например.

  public class Foo
    {
       String name;
       int id;
        // define constructors
           Foo (String name, int id)
        {
            this.name = name;
            this.id = id;
        }

          p s v m(String[] arg)
      {
          Foo f1 = new Foo("Amit",001);
          Foo f2 = new Foo("Rahul",002);
      }
    }

Если мы создадим статический конструктор, то оба объекта (f1 также) будут содержать последнее обновленное значение, касающееся имени и id, как Rahul и 002.

Ответ 7

Конструктор не может быть статическим, потому что на языке OO процесс создания объекта выглядит следующим образом:

  • выделить объект
  • вызов конструктора для инициализации вновь выделенного объекта

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

Если конструктор статичен, он не получит ссылку на вновь выделенный объект и, следовательно, не сможет его инициализировать.

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

Ответ 8

Метод main(String[]) имеет определенный прототип, который продиктован тем, как работает среда выполнения Java. Когда вы вызываете java MyApplication из командной строки, виртуальная машина Java будет искать статический метод main(String[]), содержащийся в этом классе, чтобы выполнить приложение. Если этот метод не найден, то виртуальная машина Java не может запускать класс в качестве приложения. Это то, как определяется язык. Это также означает, что Java VM не создает экземпляр вашего класса приложения для его запуска.

Теперь, если вы хотите, чтобы ваш класс можно было использовать либо как отдельное приложение, либо как экземпляр, созданный чем-то другим, тогда вы можете реализовать свой класс интерфейса Runnable, а также предоставить метод main, который выполняет метод run в новом экземпляре.

public class MyRunnableThing implements Runnable
{
    // Define whatever variables your runnable thing needs here as
    // private instance fields.

    /** Fulfills requirements of Runnable interface. */
    public void run()
    {
        System.out.println( "I'm running..." ) ;
    }

    /** Also makes the class runnable from the console. */
    public static void main( String[] args )
    {
        MyRunnableThing runMeNow = new MyRunnableThing() ;
        runMeNow.run() ;
    }
}

Теперь любой класс потенциально может создать экземпляр MyRunnableThing и использовать его метод run() для создания такого же поведения, которое было бы видно при выполнении java MyRunnablething.

Смотрите также: Работа со Static Constructor в Java. Некоторые основные моменты этого Q & A:

  • Конструктор используется для создания экземпляра класса, поэтому это метод экземпляра, а не статический метод.
  • Вы можете создать статический метод, который создает экземпляр класса, используя конструктор. Вот как работают модные новые классы "строитель".
  • Вы можете создать статический метод, который возвращает постоянный уникальный экземпляр singleton.
  • Если у вашего класса есть статические члены, вы можете создать статический инициализатор, чтобы инициализировать значения этих членов.

Ответ 9

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

Ответ 10

Метод, объявленный как static, не требует создания объекта. Поскольку мы не создаем объект для основного метода, он объявляется как статический.

Конструктор

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

Ответ 11

Конструктор - это свойство объекта, а static не имеет ничего общего с объектом. Вот почему нет ничего, как статический конструктор. Но у нас есть статический блок для выполнения аналогичной задачи как конструктор, то есть инициализация полей и т.д.