Public static void main что это
1.5 Первая программа Java
1.5 Первая программа Java
Теперь давайте посмотрим на простую программу, написанную на языке Java.
1.5.1 Программа Hello World!
1.5.2 Описание «Hello World»
Теперь подробно разберёмся в коде и попробуем понять его синтаксис.
import j ava.io.*;
Эта строка объявляет класс по имени HelloWorld. При создании класса используется ключевое слово class вместе с именем класса/именем файла.
Обратите внимание: принято, чтобы имя класса начиналось с заглавной буквы.
Ключевое слово static позволяет методу main() вызываться без потребности создавать образец класса. К объекту класса нельзя обратиться, не создав это. Но в этом случае, есть копия этого метода, доступного в памяти после того, как класс расположен, даже если не был создан образец этого класса. Это важно, потому что JVM вызывает этот метод в первую очередь. Следовательно этот метод должен быть как static и не должен зависеть от экземпляров любого создаваемого класса.
Ключевое слово void говорит компилятору, что метод не возвращает никакого значения.
main ()— метод, который исполняет специфическую задачу. Это место с которого начинается выполнение всех приложений Java. Класс, который не имеет основного метода, может быть успешно откомпилирован, но не может быть выполнен, поскольку он не имеет отправной точки выполнения, которой является main() метод.
Эта запись отображает строку экране. Вывод строки осуществляется с помощью метода println (). println () отображает только строку, которая передаётся со справкой System.out.
Все инструкции в Java заканчиваются точкой с запятой (;).
Чтобы скомпилировать исходный текст, выполните команду javac, определяя название исходного файла в командной строке:
Рисунок 1.4: Компилирование файла a.java
Компилятор Java создает файл HelloWorld.class, который содержит байт-коды, и которые не могут быть непосредственно выполнены. Мы должны использовать интерпретатор Java, чтобы выполнить этот код-
Рисунок 1.5: Выполнение файла a.java
Вывод на экран отображается так:
Welcome to the world of Java
Зона кода
Эту статью я написал несколько лет назад для другого сайта, но она так и не была опубликована. Тогда 7-я версия Java только-только появилась на свет, а 6-я была всё ещё актуальна. Статья адресована, в первую очередь тем, кто начинает знакомиться с языком Java. Я решил стряхнуть с неё пыль и опубликовать: пусть будет!
Здравствуйте, уважаемый читатель! Эта статья состоит из двух частей.
Первая из них адресована новичкам, которые только-только приступают к изучению Java и, возможно, не написали ещё ни одной программы на этом языке.
Новичкам
Метод main() должен объявляться в классе следующим образом:
Ключевое слово public означает, что метод main() доступен везде, где доступен содержащий его класс. Ключевое слово static означает, что метод является статическим, т. е. не требует для своего вызова наличие экземпляра класса. Ключевое слово void означает, что метод не возвращает никакого значения. Все эти три слова обязательно должны присутствовать в описании метода.
Вместо имени массива args можно использовать любое другое имя. Например, следующее описание main() вполне корректно.
Сохраним код класса MainTest в файле с именем MainTest.java и скомпилируем этот файл командой
java MainTest Это всего лишь проверка!
Если нет проблем с отображением кириллицы, то в результате выполнения команды на консоль будет выведено:
Это
всего
лишь
проверка!
Метод main() может вызываться не только виртуальной машиной Java, но и любым другим методом. Например, main() может быть рекурсивным, т. е. может вызывать сам себя. В этом отношении main() ничем не отличается от остальных методов.
В следующем примере (весьма вычурном) метод main() рекурсивен. При каждом вызове метода, за исключением последнего, на печать выводится один аргумент командной строки.
Новичкам и не только
В Интернете на форумах, посвящённых Java, я нередко встречал любопытную задачку: написать класс, метод main() которого имеет пустое тело, выводящий на консоль надпись “Hello world!”. Полагаю, что эта задача известна многим из тех, кто интересуется Java.
Статический блок имеет некоторое сходство со статическим методом. Отличается он от последнего тем, что не имеет имени, не принимает параметров, не возвращает значения (а значит, не может содержать инструкции return ) и не вызывается явно. Так же как и статический метод, статический блок может содержать обращения к статическим полям и методам класса.
Статические блоки используются редко. Как правило, в их задачи входит инициализация статических полей класса.
Ну а мы поместим в статический блок инструкцию вывода на консоль строки “Hello world!”:
Можно скомпилировать класс, запустить на выполнение и удостовериться в том, что с поставленной задачей он вполне успешно справляется.
На консоль будет выведено:
Привет от static-блока!
Привет от метода main()!
Вот код, демонстрирующий данный подход:
И вот тут начинается самое интересное! Я компилировал и запускал этот класс с использованием комплектов разработки на языке Java (JDK) трёх разных версий: jdk1.6_021, jdk1.6_024 и jdk1.7.0_01. Во всех трёх случаях код компилировался без проблем. А вот с запуском класса проблемы возникали.
Для начала, оговорюсь, что каждый файл с расширением class запускался под управлением “своей” виртуальной машины Java, т. е. входящей в тот JDK, посредством которого этот файл был получен в результате компиляции.
Итак, в последних двух случаях на экран выводилась надпись:
Error: Main method not found in class WithoutMain, please define the main method as: public static void main(String[] args)
Таким образом, не выполнялся даже код, входящий в статический блок. А вот в первом случае на консоль выводилось следующее:
HelloWorld!
Exception in thread «main» java.lang.NoSuchMethodError: main
Выполнение программы приводит к следующему выводу на консоль:
Основной метод Java – main method
Программа Java – это последовательность инструкций, которые выполняются в определенном порядке. Поскольку инструкции выполняются в определенном порядке, Java-программа имеет начало и конец.
Для выполнения вашей программы вам необходимо указать виртуальной машине, с чего начать выполнение программы. Все инструкции(код) должны находиться внутри класса. Класс – это способ группировки данных и инструкций, которые принадлежат друг другу. Таким образом, класс может содержать как переменные, так и методы. Переменная может содержать данные, а метод группирует набор операций над данными(инструкции). Не так страшно, если вы еще не до конца поняли это. Начнем разбираться.
Простое объявление класса Java
Объявление простого класса без каких-либо переменных, методов или любых других инструкций выглядит следующим образом:
Рекомендуется размещать свой класс в пакете Java. Пакет Java – это просто каталог в вашей файловой системе, который может содержать один или несколько файлов. Пакеты могут быть вложенными, как каталоги.
Например, вы можете создать пакет с именем myjavacode, который будет соответствовать каталогу на вашем жестком диске с именем myjavacode.
Если вы находите класс внутри пакета, вы должны указать имя пакета в верхней части файла. Вот как выглядит класс с добавлением объявления пакета:
Примечание. Файл MyClass.java должен теперь находиться в каталоге myjavacode и содержать объявление пакета package myjavacode; Недостаточно, чтобы файл находился в правильном каталоге. Также недостаточно просто иметь объявление пакета внутри файла. Оба требования должны быть выполнены.
main() метод
Три ключевых слова public, static и void имеют особое значение. Просто помните, что для объявления метода main() нужны эти три ключевых слова.
После трех ключевых слов у вас есть имя метода. Напомним, что метод – это набор инструкций, которые могут быть выполнены, как если бы они были одной операцией. Вызывая(выполняя) метод, вы выполняете все инструкции внутри этого метода.
После имени метода сначала ставится левая скобка, а затем список параметров. Параметры – это переменные(данные / значения), которые мы можем передать методу, который может использоваться инструкциями в методе для настройки его поведения. Основной метод всегда должен принимать массив объектов String. Вы объявляете массив объектов String следующим образом:
Расскажу о том, что такое String или что такое массив в следующих уроках. Не имеет значения, какое имя вы даете параметру. Ранее в примере с методом main() я вызывал параметр аргумента массива String, а во втором – строковый массив. Вы можете выбрать имя любое.
После списка параметров метода следует сначала левая фигурная скобка(<), затем некоторое пустое пространство, а затем правая фигурная скобка(>). Внутри фигурных скобок инструкции, которые должны выполняться при выполнении основного метода. В приведенном выше примере нет никаких инструкций для выполнения. Метод пуст.
Давайте вставим одну инструкцию в основное тело метода. Вот пример:
Теперь основной метод содержит эту единственную инструкцию:
Эта инструкция выведет текст Hello World, Java Program. Если вы запустите свою программу из командной строки, вы увидите вывод в консоли командной строки. Если вы запускаете из IDE, IDE обычно перехватывает весь вывод на консоль и делает его видимым для вас где-то внутри IDE.
Запуск метода main()
Когда вы запускаете программу, вы обычно делаете это через командную строку(консоль). Вы вызываете команду, которая поставляется вместе с JRE, и указываете, какой класс выполнять и какие аргументы передавать методу main(). Затем Java-приложение выполняется внутри JVM. Вот диаграмма, иллюстрирующая это:
Вот пример командной строки:
Передача аргументов
Вы можете передавать аргументы из командной строки в метод main().
Когда JVM выполняет метод main() myjavacode.MyClass, массив String, передаваемый в качестве параметра методу main(), будет содержать две строки: «Hello» и «World».
Метод может получить доступ к аргументам из командной строки следующим образом:
Обратите внимание на ссылки на элемент 0 и элемент 1 в массиве args(args [0] и args [1]). args [0] будет содержать строку(текст) Hello, а args [1] будет содержать мир строки.
В вашем проекте может быть столько классов, сколько вы хотите, с методом main(). Но виртуальной машине можно поручить запускать только один из них одновременно.
public static void main(String[] args) – основной метод Java
public static void main(строковые аргументы[]), основной метод java. Точка входа в java-программу. общедоступные статические пустые аргументы основной строки, аргументы командной строки java
public static void main(String[] args) является наиболее важным методом Java. Когда вы начинаете изучать программирование на Java, это первый метод, с которым вы сталкиваетесь. Помните первую написанную вами программу Java Hello World, которая запускает и печатает “Hello World”?
общедоступная статическая пустота main(строка[] args)
Давайте внимательно рассмотрим основной метод java и попытаемся понять каждую из его частей.
общественный
статический
Когда запускается среда выполнения java, объект класса отсутствует. Вот почему основной метод должен быть статическим, чтобы JVM могла загрузить класс в память и вызвать основной метод. Если основной метод не будет статическим, JVM не сможет его вызвать, потому что в нем нет объекта класса. Давайте посмотрим, что произойдет, когда мы удалим статику из основного метода java.
пустота
Мы получаем ошибку ниже, когда вышеописанная программа компилируется.
главный
Это имя основного метода java. Это исправлено, и когда мы запускаем программу на Java, она ищет основной метод. Например, если у нас есть класс, как показано ниже.
И мы попытаемся запустить эту программу, она выдаст ошибку, что основной метод не найден.
Строка[] args
Метод Java main принимает один аргумент типа String array. Это также называется аргументами командной строки java. Давайте рассмотрим пример использования аргументов командной строки java.
Выше приведена простая программа, в которой мы печатаем аргументы командной строки. Давайте посмотрим, как передавать аргументы командной строки при выполнении вышеуказанной программы.
Аргументы командной строки основного метода Java в Eclipse
На приведенных ниже изображениях показано, как передавать аргументы командной строки при выполнении программы java в Eclipse.
Public static void main что это
Это три совершенно разные вещи:
означает, что метод связан с классом, а не с конкретным экземпляром (объектом) этого класса. Это означает, что вы можете вызвать статический метод, не создавая объект класса.
Комбинация всех трех из них чаще всего рассматривается в методе, который будет включать большинство учебников.
Ключевое слово public — это спецификатор доступа, который позволяет программисту контролировать видимость членов класса. Когда член класса предшествует публике, то к этому члену может обращаться код вне класса, в котором он объявлен. (Противоположность public является частной, что не позволяет члену использоваться кодом, определенным вне его класса.)
В этом случае должен быть объявлен как открытый, так как он должен вызываться кодом вне его класса при запуске программы.
Ключевое слово void просто сообщает компилятору, что не возвращает значение. Как вы увидите, методы также могут возвращать значения.
Это означает три вещи.
Первая означает, что любой другой объект может получить к ней доступ.
означает, что класс, в котором он находится, не должен быть создан первым, прежде чем функция может быть вызвана.
означает, что функция не возвращает значение.
Поскольку вы просто учитесь, не беспокойтесь о первых двух слишком много, пока вы не узнаете о занятиях, а третий не будет иметь большого значения, пока вы не начнете писать функции (кроме основного).
Лучший совет, который я получил, учась программировать, и который я передаю вам, не беспокоится о маленьких деталях, которые вы не понимаете сразу. Получите широкий обзор основных принципов, затем вернитесь и подумайте о деталях. Причина в том, что в ваших первых программах вы должны использовать некоторые вещи (например, ), которые не могут быть хорошо объяснены, но сначала не проинструктируем вас о связке других вещей. Итак, на данный момент, просто примите, что так оно и было, и продолжайте. Вы поймете их в ближайшее время.
1.5 Первая программа Java
Статические классы
В этой статье я хочу рассказать о создании статических классов (не просто классов, в которых всего лишь присутствуют статические сущности, такие как поля, метод, свойства и т.п., об этом я рассказывал в предыдущей статье), а так же об особенностях их использования. Класс считается статическим, если при его создании, перед ключевым словом class указывается ключевое слово static. Определение класса статическим, означает то, что этот класс является набором только статических сущностей (полей, методов, свойств и т.п.), и, внимание, создавать объекты такого класс нельзя!
Кроме этого, на статический класс, накладываются как минимум следующие ограничения:
О перегрузке операций (или операторов, например сложения, вычитания и т.п.) я напишу отдельную статью, или даже цикл статей…
А сейчас я покажу пример создания статического класса. Но для этого, давайте вспомним пример из предыдущей статьи. В ней был рассмотрен класс «Operations», который выглядел так:
Этот класс не имеет никаких не статических методов, полей свойств и прочего, и он отлично подходит для того, чтобы сделать его статическим. Ведь действительно, создавать объекты этого класса практически бессмысленно! Вот так будет выглядеть этот класс, если мы сделаем его статическим:
Обратите внимание, даже не смотря на то что весь класс является статическим, метод «Sum» мы тоже явно сделали статическим! Так требует компилятор…
Вот так вот у меня для Вас информация о статических классах.
Теги: Классы памяти, auto, register, extern, static, объявление переменной, определение переменной, константный инициализатор.
В си определено несколько классов памяти для переменных и функций. Они изменяют область видимости переменных и функций, определяют время жизни объекта и расположение в памяти.
Классы памяти переменных
По умолчанию, локальные переменные имеют класс auto. Такие переменные располагаются на стеке а их область видимости ограничена своим блоком. Запись
Очевидно, что глобальные переменные не могут быть объявлены как auto, потому что располагаются в data-сегменте.
Следующий класс памяти – register. Когда мы определяем регистровую переменную, то мы просим компилятор, чтобы переменная располагалась в регистре, а не в оперативной памяти. Компилятор может сделать переменную регистровой, если позволяют условия (регистры не заняты, и по мнению компилятора это не приведёт к увеличению издержек). Регистровые переменные определяются с помощью служебного слово register перед типом
register int x = 20; register int y = 30;
Так как регистровая переменная не имеет адреса, то к ней не применима операция взятия адреса, это вызовет ошибку во время компиляции. Аргументы функции также могут быть заданы как register. Внутри функции они будут вести себя также, как и регистровые переменные.
Следующий класс памяти – статический. Переменные, объявленные как static, хранятся в data или в bss сегменте. Отличительной чертой является то, что время их жизни совпадает с временем жизни приложения, как и у глобальных переменных. Но в отличие от глобальных переменных, область видимости ограничена только блоком, в котором они определены.
Если бы служебное слово static отсутствовало, то каждый раз при вызове функции локальная переменная counter снова создавалась, инициализировалась и уничтожалась после выхода из функции.
Статическая переменная может иметь только константную инициализацию. Например, она не может быть инициализирована вызовом функции.
… static double x = foo(3); //Ошибка …
Переменная, объявленная как static, должна иметь только один экземпляр в данной области видимости и вне этой области видимости не видна. Глобальная переменная, объявленная как static, видна только в своём файле.
Напротив, переменная, объявленная как extern может быть использована в других файлах при условии, что она была определена.
Объявление и определение переменной.
В глобальном контексте переменная сначала требует объявления. Таким образом, компилятор будет знать её имя и тип. Определение переменной требует выделения под неё памяти и инициализации. Посмотрите следующий код. Он абсолютно легален и должен работать по стандарту
#include #include int Global; //Объявили переменную int Global = 20; //Определили переменную void main()
Теперь, что будет, если одновременно объявить переменную и инициализировать её. Это определение переменной, которое требует её объявления
Следующая программа не скомпилируется
#include #include extern int Global; void main()
Это связано с тем, что отсутствует определение переменной. Если определить переменную внутри main, то это будет уже другой экземпляр переменной, которая будет расположена на стеке. Вообще, при работе с одним файлом использование extern переменных не оправдано. Рассмотрим ситуацию, когда у нас имеются ещё два файла – заголовочный File1.h и File1.c. В заголовочном файле объявим extern переменную Global
#ifndef _FILE1_H_ #define _FILE1_H_ extern int Global; #endif
в файле исходного кода определим её
#include «File1.h» int Global = 100;
После подключения файла File1.h можно использовать эту переменную в файле main.c, при этом гарантировано, что существует только один экземпляр этой переменной для всех файлов проекта
#include #include #include «File1.h» void main()
Если теперь определим функцию, которая изменяет эту переменную, то все функции из всех файлов будут видеть эти изменения.
#ifndef _FILE1_H_ #define _FILE1_H_ #include extern int Global; void changeAndPrint(); #endif #include «File1.h» int Global = 100; void changeAndPrint() < printf(«from File1: Global = %d\n», Global); Global = 1234; printf(«changed to %d\n», Global); >#include #include #include «File1.h» void main()
Класс памяти для функций
Функции по умолчанию определены как extern, это значит, что они видны всем, кто подключит данный файл. То есть, запись
Методы Java — как вызывать и использовать
Другой класс — static, делает функцию видимой только внутри своего модуля.
Рассмотрим пример – у нас будет, как обычно 2 файла, File1.h и File1.c. В первом определим две функции, одну extern, а вторую static
#ifndef _FILE1_H_ #define _FILE1_H_ #include void visible(); static void hidden(); #endif #include «File1.h» void visible() < printf(«Everyone can use me!\n»); hidden(); >void hidden()
Заметьте: мы не сможем вызвать функцию hidden вне файла File1.c, но внутри файла эта функция доступна.
Для функций также, как и для переменных, различают объявление и определение. Объявление обычно прячут в заголовочный файл, также как и объявление переменных. Определения находятся в си файле.
В некоторых случаях желательно определить член класса, который будет использоваться независимо от любого объекта этого класса. Обычно обращение к члену класса должно выполняться только в сочетании с объектом его класса. Однако можно создать член класса, который может использоваться самостоятельно, без ссылки на конкретный экземпляр. Чтобы создать такой член, в начало его объявления нужно поместить ключевое слово static. Когда член класса объявлен как static (статический), он доступен до создания каких-либо объектов его класса и без ссылки на какой-либо объект. Статическими могут быть объявлены как методы, так и переменные. Наиболее распространенный пример статического члена — метод main (). Этот метод объявляют как static, поскольку он должен быть объявлен до создания любых объектов.
Переменные экземпляров, объявленные как static, по существу являются глобальными переменными. При объявлении объектов их класса программа не создает никаких копий переменной static. Вместо этого все экземпляры класса совместно используют одну и ту же статическую переменную.
На методы, объявленные как static, накладывается ряд ограничений.
Если для инициализации переменных типа static нужно выполнить вычисления, можно объявить статический блок, который будет выполняться только один раз при первой загрузке класса. В следующем примере показан класс, который содержит статический метод, несколько статических переменных и статический блок инициализации:
Сразу после загрузки класса UseStatic программа выполняет все операторы static. Вначале значение а устанавливается равным 3, затем программа выполняет блок static, который выводит сообщение, а затем инициализирует переменную b значением а*4, или 12. Затем программа вызывает метод main (), который обращается к методу meth (), передавая параметру х значение 42.
Три оператора println () ссылаются на две статических переменные а и b на локальную переменную х.
Вывод этой программы имеет такой вид:
За пределами класса, в котором они определены, статические методы и переменные могут использоваться независимо от какого-либо объекта. Для этого достаточно указать имя их класса, за которым должна следовать операция точки. Например, если метод типа static нужно вызвать извне его класса, это можно выполнить, используя следующую общую форму:
Здесь имя_класса — имя класса, в котором объявлен метод тип static. Как видите, этот формат аналогичен применяемому для вызова нестатических методов через переменные объектных ссылок. Статическая переменная доступна аналогичным образом — посредством операции точки, следующей за именем класса.
Что означает «public static void» в Java?
Так в Java реализованы управляемые версии глобальных методов и переменных.
Приведем пример. Внутри метода main () обращение к статическому методу callme () и статической переменной b осуществляется посредством имени их класса StaticDemo.
Вывод этой программы выглядит следующим образом: