2015-03-18 3 views
2

Что делает public static void main(String args[]) {} соглашением для проверки кода, а не просто static {}?Зачем использовать main(), когда вы можете использовать static {}?

class Test { 
    public static void main(String args[]) { 
     System.out.println("testing"); 
    } 
} 

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

class Test { 
    static { 
     System.out.println("testing"); 
    } 
} 

Есть стандартная причина, чтобы не использовать маленькие static {} для запуска вашего среднего теста? Могу ли я воспринимать это как свой выбор/предпочтение безопасно?

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

+4

Зачем использовать 'static {}', когда вы можете использовать 'main()'?и получить аргументы командной строки? и возможность бросать исключения? и возможность использования 'java -jar'? – EJP

+3

По той же причине вы не используете конструкторы вместо методов и исключения вместо возвращаемых значений - это очень сложно понять, как ваша программа должна работать * – immibis

ответ

6

Я бы сказал, что самая важная причина не использовать static {} для таких вещей заключается в том, что у вас мало контроля над тем, когда она работает. static {} блоки выполняются «когда класс инициализируется», что означает, по крайней мере, четыре (следить за испанской инквизиции) вредные вещи для этой цели:

  • Это не обязательно произойдет только потому, что класс загружен.
  • Это, с другой стороны, происходит только потому, что вам нужен экземпляр класса или ссылка на статическое поле из какого-либо другого класса, что является основной причиной, по которой вы действительно не хотите размещать код с широким диапазоном побочные эффекты в блоках static {}.
  • Также не гарантируется, что не происходит по таким простым причинам, как файл Jar, находящийся на вашем пути к классу. JVM могут запускать блоки static {}, когда им это нравится, если они есть до того, как будут сделаны какие-либо статические ссылки из класса из другого кода. «До» может означать «при запуске VM».
  • Нет реализации VM имеет любые аргументы вызова для запуска такого кода для вас по запросу.

Цель static {} блоков инициализировать статические данные класса (в возможно довольно сложным образом, конечно), и из предыдущих пунктов, вы можете быть в состоянии понять, почему это не особенно полезно для всего остального.

2

В java для каждого приложения требуется основной метод, который будет точкой входа приложения. Основной метод требовал имеет сигнатуру следующим образом:

Разница между этим методом и другой вы предложили (помимо того, что ваше приложение нуждается в основной методе с этой подписью в качестве точки входа) является то, что это является методом и принимает параметр «String [] args». Этот параметр указывает, что ваши аргументы будут идти при запуске программы с консоли.

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

Ваш статический блок {} не обязательно является методом или функцией, которая может быть вызвана и, следовательно, не может использоваться в качестве точки входа в ваше приложение. Он не принимает никаких параметров, и у вас нет контроля над тем, когда будет выполняться его кодовый блок.

Смежные вопросы