Почему другие методы могут быть «статичными», а конструктор - нет? - PullRequest
43 голосов
/ 16 октября 2011

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

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

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

Ответы [ 13 ]

80 голосов
/ 16 октября 2011

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-учебник по классам и объектам и раздел Общие сведения о переменных экземпляра и класса .

Удачного кодирования.

24 голосов
/ 07 марта 2014

Я разделяю одну из причин, почему java-конструктор не статичен.

Проще говоря, «Java-конструктор всегда нестатичен», потому что

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

Так что Java-конструкторы не должны быть статичными.

7 голосов
/ 23 сентября 2013

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

Статика обычно одинакова для всех объектов.

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

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

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

7 голосов
/ 16 октября 2011

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

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

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

1 голос
/ 23 января 2017

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

0 голосов
/ 30 марта 2019

Статический Принадлежит Классу, Конструктор к Объекту

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

0 голосов
/ 16 октября 2018

Java не позволяет объявлять конструктор как статический. Ниже приведены причины.

  1. Статические средства для того же класса. т.е. статические методы не могут быть унаследованы.

  2. При использовании статической ссылки «это» (ключевое слово) нельзя использовать. «это» всегда связано с объектом. Конструктор всегда принадлежит какому-либо объекту.

  3. Если конструктор является статическим, объект подкласса не может получить к нему доступ. Если статический допускается с помощью конструктора, он доступен внутри класса, но не подклассом.

0 голосов
/ 30 июня 2016

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

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

0 голосов
/ 26 апреля 2016

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

0 голосов
/ 24 декабря 2014

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

См. Также: Работа со статическим конструктором в Java .Некоторые основные моменты из этой Q & A:

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