package com.javarush.test.level18.lesson10.home06;

/* Встречаемость символов
Программа запускается с одним параметром - именем файла, который содержит английский текст.
Посчитать частоту встречания каждого символа.
Отсортировать результат по возрастанию кода ASCII (почитать в инете). Пример: ','=44, 's'=115, 't'=116
Вывести на консоль отсортированный результат:
[символ1]  частота1
[символ2]  частота2
Закрыть потоки

Пример вывода:
, 19
- 7
f 361
*/

import java.io.FileInputStream;
import java.io.IOException;

public class Solution {
    public static void main(String[] args) throws IOException{
        FileInputStream fileInputStream = new FileInputStream(args[0]);
        int[] frq = new int[128];  //массив частот


        while (fileInputStream.available() > 0) {
            int a = fileInputStream.read();
            frq[a]++;
        }
        fileInputStream.close();
        char j = 0;
        for (int i = 0; i < 128; i++) {

            if (frq[i] != 0) System.out.println(j + " " + frq[i]);
            j++;
        }
    }
}
package com.javarush.test.level18.lesson10.home10;

/* Собираем файл
Собираем файл из кусочков
Считывать с консоли имена файлов
Каждый файл имеет имя: [someName].partN. Например, Lion.avi.part1, Lion.avi.part2, ..., Lion.avi.part37.
Имена файлов подаются в произвольном порядке. Ввод заканчивается словом "end"
В папке, где находятся все прочтенные файлы, создать файл без приставки [.partN]. Например, Lion.avi
В него переписать все байты из файлов-частей используя буфер.
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, ..., в конце - последнюю.
Закрыть все потоки ввода-вывода
Темповые файлы создавать нельзя, т.к. на сервере заблокирована возможность создания каких любо файлов
*/

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws IOException
    {
        Scanner scanner = new Scanner(System.in);
        ArrayList<String> parts = new ArrayList<String>();         
        FileInputStream fileInputStream = null;         
        String nextFileName = null;
        //Читаем файлы пока не "end"

        while (true) {
            if ("end".equals(nextFileName = scanner.nextLine())) break;
            else parts.add(nextFileName);
        }
        scanner.close();
        //Сортируем коллекцию

        Collections.sort(parts, new Comparator<String>()
        {
            @Override
            public int compare(String o1, String o2)
            {
                return o1.toString().compareTo(o2.toString());    
            }
        });
        //Выходной файловый поток

        String outputFileName = parts.get(0).split(".part")[0];
        FileOutputStream fileOutputStream = new FileOutputStream(outputFileName);
        //Сливаем файлы

        for (String partsFileNames : parts) {
            fileInputStream = new FileInputStream(partsFileNames);
            byte[] buffer = new byte[fileInputStream.available()];
            fileInputStream.read(buffer);
            fileOutputStream.write(buffer);
            fileInputStream.close();
        }
        fileOutputStream.close();
        System.out.println("Объединение файлов выполнено!");
    }
}
package com.javarush.test.level18.lesson10.bonus01;

/* Шифровка
Придумать механизм шифровки/дешифровки

Программа запускается с одним из следующих наборов параметров:
-e fileName fileOutputName
-d fileName fileOutputName
где
fileName - имя файла, который необходимо зашифровать/расшифровать
fileOutputName - имя файла, куда необходимо записать результат шифрования/дешифрования
-e - ключ указывает, что необходимо зашифровать данные
-d - ключ указывает, что необходимо расшифровать данные
*/

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Solution {
    public static void main(String[] args) throws IOException{
        String key = args[0];
        String fileInputName = args[1];
        String fileOutputName = args[2];
        FileInputStream fileInputStream = new FileInputStream(fileInputName);
        FileOutputStream fileOutputStream = new FileOutputStream(fileOutputName);
        if ("-e".equals(key)) {
            while (fileInputStream.available() > 0) {
                int data = fileInputStream.read();
                if (data == 0xFF) data = 0x00;
                else data++;
                fileOutputStream.write(data);
            }
        }
        else if ("-d".equals(key)) {
            while (fileInputStream.available() > 0) {
                int data = fileInputStream.read();
                if (data == 0x00) data = 0xFF;
                else data--;
                fileOutputStream.write(data);
            }
        }
        fileInputStream.close();
        fileOutputStream.close();
        System.out.println("Выполнено!");
    }
}
package com.javarush.test.level18.lesson10.home09;

/* Файлы и исключения
Читайте с консоли имена файлов
Если файла не существует (передано неправильное имя файла), то
перехватить исключение, вывести в консоль переданное неправильное имя файла и завершить работу программы
Не забудьте закрыть все потоки
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) {
        BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in));
        String f = "";
        while(true){
            try
            {
                try
                {
                    f = rdr.readLine();
                    File file = new File(f);
                    if (!file.exists()) throw new FileNotFoundException(f);
                }
                catch (FileNotFoundException e) {
                    System.out.println(f);
                    break;
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
package com.javarush.test.level19.lesson03.task03;

/* Адаптация нескольких интерфейсов
Адаптировать IncomeData к Customer и Contact.
Классом-адаптером является IncomeDataAdapter.
Инициализируйте countries перед началом выполнения программы. Соответствие кода страны и названия:
UA Ukraine
RU Russia
CA Canada
Дополнить телефонный номер нулями до 10 цифр при необходимости
*/

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static Map<String,String> countries = new HashMap<String,String>();

    static {
        countries.put("UA", "Ukraine");
        countries.put("RU", "Russia");
        countries.put("CA", "Canada");
        countries.put("US", "United States");
    }

    public static class IncomeDataAdapter implements Customer, Contact{
        private IncomeData incomeData;

        public IncomeDataAdapter(IncomeData incomeData)
        {
            this.incomeData = incomeData;
        }

        @Override
        public String getName()
        {
            return this.incomeData.getContactLastName() + ", " + this.incomeData.getContactFirstName();
        }

        @Override
        public String getPhoneNumber()
        {
            String clearPhoneNumber = Integer.valueOf(this.incomeData.getPhoneNumber()).toString();
            if (clearPhoneNumber.length() < 10) {
                while (clearPhoneNumber.length() < 10) clearPhoneNumber = "0" + clearPhoneNumber;
            }
            String newPhoneName = "+"
                    + this.incomeData.getCountryPhoneCode() + "(" + clearPhoneNumber.substring(0, 3)
                    + ")" + clearPhoneNumber.substring(3, 6) + "-" + clearPhoneNumber.substring(6,8)
                    + "-" + clearPhoneNumber.substring(8);
            return newPhoneName;
        }

        @Override
        public String getCompanyName()
        {
            return this.incomeData.getCompany();
        }

        @Override
        public String getCountryName()
        {
            String countryName = "";
            for (Map.Entry<String, String> pair : countries.entrySet()){
                if (pair.getKey().equals(this.incomeData.getCountryCode())) countryName = pair.getValue();
            }
            return countryName;
        }
    }

    public static interface IncomeData {
        String getCountryCode();        //example UA

        String getCompany();            //example JavaRush Ltd.

        String getContactFirstName();   //example Ivan

        String getContactLastName();    //example Ivanov

        int getCountryPhoneCode();      //example 38

        int getPhoneNumber();           //example 501234567

    }

    public static interface Customer {
        String getCompanyName();        //example JavaRush Ltd.

        String getCountryName();        //example Ukraine

    }

    public static interface Contact {
        String getName();               //example Ivanov, Ivan

        String getPhoneNumber();        //example +38(050)123-45-67

    }

    //Тестовый main

    public static void main(String[] args)
    {
        class iData implements IncomeData {

            @Override
            public String getCountryCode()
            {
                return "US";
            }

            @Override
            public String getCompany()
            {
                return "Planet Express";
            }

            @Override
            public String getContactFirstName()
            {
                return "Bender";
            }

            @Override
            public String getContactLastName()
            {
                return "Rodriguez";
            }

            @Override
            public int getCountryPhoneCode()
            {
                return 1;
            }

            @Override
            public int getPhoneNumber()
            {
                return 666666;
            }
        }
        IncomeDataAdapter adapter = new IncomeDataAdapter(new iData());
        System.out.println(adapter.getCompanyName());
        System.out.println(adapter.getCountryName());
        System.out.println(adapter.getPhoneNumber());
        System.out.println(adapter.getName());
    }
}

Сегодня я хочу остановиться на двух программах, выполняющих одно и то же действие — сортировку введенного с клавиатуры массива «пузырьковым методом». Однако несмотря на то, что они идентичны по функциональной нагрузке написаны они в двух разных парадигмах программирования. Первая демонстрирует процедурный подход, вторая — объектно ориентированный.  На самом деле это не совсем так, потому что в языке Java невозможно написать программу не используя ни единого класса и ни единого объекта. Раз так, любая программа на Java — объектно-ориентированная. Однако, речь идет о том, что даже создав фиктивный класс в Java, можно продолжать следовать свойственной для таких языков программирования как С, С++, Pascal, Basic и др. процедурной парадигме программирования. Использовать функции (методы), процедуры (методы типа void) и чувствовать себя так, как будто вы пишете не на Java. Именно такой подход рассматривается в первой программе. Во второй программе — во всей красе представлен объектно-ориентированный подход и содержится масса его особенностей.

Итак, первая программа:

package ru.ildwine.u;

import java.util.Scanner;

public class ArrayBubbleSorting {    

    public static void main(String[] args) {        
        int i, j, k;
        int[] a = new int[10];
        Scanner s = new Scanner(System.in);
        for (i = 0; i < 10; i++) {
            System.out.print("Введите " + i + " элемент массива: ");
            a[i] = s.nextInt();            
        }
        OutArray(a);
        for (i = 0; i < 10; i++) {             for (j = 9; j >= i; j--) {
                if (a[j] <= a[i]) {
                    k = a[i];
                    a[i] = a[j];
                    a[j] = k;
                }
            }
        }
        OutArray(a);
    }    

    static void OutArray(int[] b) {
        for (int c = 0; c < 10; c++) {
           System.out.print(b[c] + " "); 
        }
        System.out.println();
    }    
}

Как мы можем видеть программа состоит из одного единственного фиктивного класса с именем ArrayBubbleSorting. Класс содержит всего 2 метода. Первый метод public static void main(String[] args) {…} содержит все объявленные переменные и практически весь код программы, за исключением процедуры вывода массива на экран, которая выполняется во втором методе static void OutArray(int[] b) {…}.

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

Первое, на что хотелось бы обратить внимание, это статичность метода OutArray. Действительно, данный метод инициируется не в конструкторе класса, а в блоке статической инициализации. Статичный метод существует вне зависимости от того, создан ли хоть один экземпляр класса (вызовом конструктора класса). Таким образом, в данном примере мы обошлись использованием фиктивного класса и использованием двух его статичных методов ( OutArray и main).

Второе, на что я хочу обратить внимание, это отсутствие полей класса. Все переменные определены как локальные для метода main. В метод  OutArray, предназначенный для вывода нам приходится передавать массив как параметр. Это необходимо, так как метод  OutArray, не имеет доступа к локальным переменным метода main. Вы спросите, а почему бы не задать все переменные как поля класса, и тогда не будет необходимости в передаче параметров между методами? Вот! Именно поэтому мы рассмотрим вторую программу, в которой это реализовано. И увидим преимущество. А если рассмотреть этот пример, то создав в данном классе поля мы столкнемся с кучей проблем. Компилятор будет выдавать ошибки. Дело в том, что мы пытаемся получить доступ к нестатичным элементам класса. Поля класса у нас объявлены, но не инициализированны. Объект данного класса не создается вызовом конструктора. Альтернативный вариант, решающий эти трудности рассмотрен в нашей второй программе.

А теперь рассмотрим вторую программу:

package ru.ildwine.u;
import java.util.Scanner;

public class ArrayBubbleSorting2 {  

    final int n = 10;
    int i, j, k;
    int[] a;
    Scanner s;

    ArrayBubbleSorting2() {
        s = new Scanner(System.in);
        a = new int[n];
    }    

    void BubbleSorting() {
        for (i = 0; i < n; i++) {             for (j = n - 1; j >= i; j--) {
                if (a[j] <= a[i]) {
                    k = a[i];
                    a[i] = a[j];
                    a[j] = k;
                }
            }
        }
    }

    void InArray() {
        for (i = 0; i < n; i++) {
            System.out.print("Введите " + i + " элемент массива: ");
            a[i] = s.nextInt();            
        }
    }

    void OutArray() {
        for (i = 0; i < n; i++) {
           System.out.print(a[i] + " "); 
        }
        System.out.println();
    }

    public static void main(String[] args) {
        ArrayBubbleSorting2 z = new ArrayBubbleSorting2();        
        z.InArray();
        z.OutArray();
        z.BubbleSorting();
        z.OutArray();        
    }
}

Вторая программа построена по принципам объектно-ориентированного программирования. В программе определен главный класс ArrayBubbleSorting2. И вот здесь мы можем видеть новшества. Первое, что мы можем видеть — это блок описания полей класса:

final int n = 10;
int i, j, k;
int[] a;
Scanner s;

Здесь описаны поля, которые мы будем использовать в объектах нашего класса. Первое поле — это константа, как известно в Java константы определяются именно с помощью ключевого слова final перед типом данных. Вторая строчка объявляет 3 переменных типа int, необходимых для индексации и сортировки массива. Третья строчка объявляет массив, с которым мы будем работать. Ну и в последней строке мы объявляем переменную для работы с объектом класса Scanner, нужного нам для ввода значений с клавиатуры.

Далее мы видим описание методов класса. И в первую очередь конструктор класса:

ArrayBubbleSorting2() {
        s = new Scanner(System.in);
        a = new int[n];
}

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

Далее идет описание метода отвечающего за сортировку массива методом «пузырька»:

void BubbleSorting() {
        for (i = 0; i < n; i++) {             for (j = n - 1; j >= i; j--) {
                if (a[j] <= a[i]) {
                    k = a[i];
                    a[i] = a[j];
                    a[j] = k;
                }
            }
        }
    }

Мы не будем рассматривать алгоритм сортировки. Желающие могут найти его здесь. Мы остановимся на особенностях языка Java. Как мы видим метод имеет тип void. То есть не возвращает никакого значения. Также метод не принимает никаких входных параметров, о чём свидетельствуют пустые скобки после его названия. Это всё связано с тем, что метод работает с полями собственного класса (точнее объекта!). Все поля доступны всем методам внутри данного класса.

Далее описывается метод, отвечающий за ввод данных в массив:

void InArray() {
        for (i = 0; i < n; i++) {
            System.out.print("Введите " + i + " элемент массива: ");
            a[i] = s.nextInt();            
        }
}

Как мы можем видеть, данный метод также не принимает и не возвращает параметров. Данный метод в цикле выводит сообщение «Введите (i-й) элемент массива: « и ждет при этом ввода числа с клавиатуры, после чего, введенное значение присваивается элементу массива с индексом [i].

Метод вывода массива:

void OutArray() {
        for (i = 0; i < n; i++) {
           System.out.print(a[i] + " "); 
        }
        System.out.println();
}

Данный метод выводит содержимое массива на экран. Так же в цикле.

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

public static void main(String[] args) {
        ArrayBubbleSorting2 z = new ArrayBubbleSorting2();        
        z.InArray();
        z.OutArray();
        z.BubbleSorting();
        z.OutArray();        
}

Именно с этого метода запускается наша программа. В первой строке мы создаем объект z нашего текущего класса. И в последующих строках вызываем методы нашего объекта в следующем порядке : ввод, вывод, сортировка и снова вывод. Мы дважды вызываем метод OutArray, чтобы дважды вывести наш массив (до и после сортировки).

Вывод. Вывод только один. Использование языка программирования Java должно быть тесно связано с использованием основной парадигмы программирования которой придерживается язык — объектно-ориентированное программирование.  ООП — это стиль работы с сущностями. Это возможность оперировать данными и кодом как законченными и обособленными объектами, имеющими своё внутреннее строение, внешние интерфейсы и ведущие себя как единой целое. В данной статье мы рассмотрели всего один объект одного класса, но в дальнейшем мы продолжим рассматривать ООП как технологию с огромными преимуществами.

Продолжение следует

Лексика языка Java состоит из следующих элементов: ключевые слова, разделители, идентификаторы, литералы, комментарии, операторы  и пробелы.

Ключевые слова

В настоящее время зарезервировано 50 ключевых слов. Эти слова, в сочетании с синтаксисом операторов и разделителями, образуют основу языка Java. Их нельзя использовать ни в качестве идентификаторов, ни для имен переменных, классов или методов.

 abstract continue for new switch
 assert default goto * package synchronized
boolean do if private this
 break  double implements  protected throw
 byte  else import public throws
case enum instanceof return  transient
catch  extends int short try
 char final interface static void
class finally long strictfp volatile
 const *  float native super while

* Ключевые слова goto и const зарезервированы, но не используются. Кроме того зарезервированы слова true, false и null. Их также нельзя использовать в качестве идентификаторов и т.д.

Разделители

В языке Java есть символы, которые используются как разделители. Чаще всего используется символ точка с запятой. Однако он не единственный.

() круглые скобки Используются для передачи списков параметров в определениях и вызовах методов. Их применяют также для определения приоритета в выражениях, выражений в управляющих операторах и преобразовании типов
 {} фигурные скобки Используются для указания значений автоматически инициализируемых массивов. Их применяют также для определения блоков кода, классов, методов и локальных областей видимости
[] квадратные скобки Используются для объявления типов массивов, а также при обращении к элементам массивов
; Точка с запятой Завершает операторы
, Запятая Разделяет последовательные идентификаторы в объявлениях переменных. Этот символ также используется для создания цепочек операторов внутри оператора for
. Точка Используется для отделения имен пактов от имен вложенных пакетов и классов, а также для отделения переменной или метода от ссылочной переменной

Идентификаторы

Идентификаторы используются для именования классов, методов и переменных. Идентификатором может служить любая последовательность строчных и прописных букв, цифр или символов подчеркивания (_) или доллара ($). Для общего использования символ доллара не предназначается. Идентификаторы не должны начинаться с цифры. Язык Java чувствителен к регистру символов, поэтому идентификаторы FIRST и First — являются различными. Стоит также отметить, что поскольку в Java в полной мере применяется Unicode, то в качестве «буквы» может использоваться также символ из армянского, корейского, грузинского, индийского и практически любого алфавита.

Литералы

В Java постоянное значение задается его литеральным представлением. Например:

100 896.34 ‘Y’ «Привет, мир!»

Первый литерал задает целочисленное значение, второй литерал задает значение с плавающей точкой, третий литерал — символьную константу, четвертый — строковое значение. Литерал можно использовать везде, где допустимо использование значений данного типа.

Комментарии

В Java есть 3 типа комментариев

1. Однострочные комментарии. Начинаются с символов // и длятся до конца строки.

// Это - однострочный комментарий

2. Многострочные комментарии. Начинаются символами /* и заканчиваются символами */. Например:

/* Это - многострочный
комментарий*/

3. Комментарии документации:

/** Это - комментарий 
документации Java*/

Комментарии данного типа используются для создания файла HTML документации программы.

Отступы

Java — язык свободной формы. При написании программы не нужно следовать никаким специальным правилам в отношении отступов. Единственное обязательное требование — наличие, по меньшей мере, одного пробела между лексемами, которые не разграничены оператором или разделителем. В Java отступами являются символы пробела, табуляции или символа новой строки.

Продолжение: Шаг 7. Две программы
Начало: Шаг 5. Объектно-ориентированное программирование «на пальцах»

Приведем простейший пример, на котором видно, как вообще осуществляется работа с классами и объектами в Java. Создалим программу BoxDemo. Она будет включать в себя два класса. В первом классе Box мы определим структуру коробки, определим поля этого класса и его методы. А во втором классе BoxDemo мы создадим несколько объектов класса Box и попытаемся увидеть, как с ними можно работать.


//Файл BoxDemo.java
package boxdemo;

//Создаем новый класс Box, который будет описывать коробку
class Box {
    //Поля класса
    //тип double - это тип, который позволяет хранить дробные числа
    double width; //ширина (переменная width будет хранить значение ширины)
    double height; //высота
    double depth; //глубина
    
    // Методы класса
    // Конструктор - это метод для создания объекта класса
    // Конструктор не имеет возвращаемого типа данных (даже void не пишется),
    // а имя конструктора совпадает с именем класса.
    // Конструкторов может быть несколько. Мы пока сделаем два. Один будет получать
    // 1 параметр. Второй будет получать 3 параметра. Первый будет делать куб,
    // а второй - коробку произвольных пропорций. При вызове, если мы вызовем
    // конструктор и передадим ему 1 параметр, то автоматически выберется первый конструктор, 
    // а если параметров будет 3 - то вызовется второй конструктор
    
    //Первый коструктор
    Box(double size) {
        width = size;
        height = size;
        depth = size;
    }
    //Второй конструктор
    Box(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }
    //В конструкторах мы присваиваем значениям полей класса значений параметров,
    //которые передаем им при вызове
    
    //Ну и определим еще 1 метод, который подсчитывает объем коробки.
    //Он будет возвращать такой же дробный тип double, поскольку 
    //перемножает 3 дробных числа. Параметры мы ему не передаем (), он сам будет брать
    //значения полей.
    double volume() {
        double v;
        v= width * height * depth;
        return v;
    }
}

//А вот наш главный класс, с него запускается программа
public class BoxDemo {
    //C этого метода    
    public static void main(String[] args) {
        //Создадим переменную для объема
        double vol=0;
        //Создадим первую коробку, используя первый тип конструктора с 1 параметром        
        Box FirstBox = new Box(4); 
        //Объект с именем FirstBox класса Box создается выделением памяти (new) и
        //вызовом конструктора Box(4), где 4 - это параметр size.
        //Вызов метода сопровождается указанием объекта, 
        //и отделяется от его имени оператором точка "."
        vol = FirstBox.volume(); // тут мы вызвали для объекта FirstBox 
        //метод, который ему достался от порождающего его класса Box;
        //Выведем объем на экран
        System.out.println(vol);//объем равен 64
        //а теперь, изменим один из паказателей height нашего куба
        FirstBox.height=5;
        vol = FirstBox.volume(); // снова считаем объем, только уже 4*5*4=80
        System.out.println(vol); //вывод объема 80
        //Создадим новую коробку вторым конструктором
        Box SecondBox = new Box(2, 4, 6); //2 4 6 то подставится вместо w h d
        vol = SecondBox.volume(); //объем второй коробки
        System.out.println(vol); //вывод объема 48
        //Можно не пользоваться переменной vol, написать так
        System.out.println(SecondBox.volume()); //вывод объема        
    }
}

Результат выполнения программы будет следующим:
вывод программы BoxDemo
Каждое из чисел — результат выполнения инструкций System.out.println(); В зависимости от текущего значения переменной vol (а в последнем случае мы сразу подставили возвращаемое значение метода SecondBox.volume()), команда вывода печатает разные значения.

Продолжение: Шаг 5. Объектно-ориентированное программирование «на пальцах»
Начало: Шаг 3. Подробное рассмотрение программы FirstProgram

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

 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package firstprogram;

/**
 *
 * @author Андрей
 */
public class FirstProgram {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("Привет, мир!");        
    }
}

Рассмотрим каждую часть программы подробно.

 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

Данная часть кода — комментарий. Подобно большинству других языков программирования, Java позволяет включать примечания в исходный текст программы. Они нужны для того, чтобы программисту было легче ориентироваться в текстах большого проекта, выделять логически законченные фрагменты программы, а также, для того, чтобы программу написанную одним человеком, мог понять другой программист.
Комментарии в Java бывают трёх видов. В данном случае применён комментарий заключённый между между /* и */. Как только компилятор встречает связку символов /*, он игнорирует все символы пока не встретит */. Приемущество такого коментария: он может располагаться в произвольном количестве строк. Второй тип комментария в языке программирования Java — это комментарий, начинающийся с символов // и продолжается до конца строки. Третий тип комментария — это комментарии документирования, про которые нам знать пока необязательно. Однако, они по форме похожи на комментарии первого типа, за исключением того, что в них используются связки символов /** и */. Кстати данный комментарий присутствует в нашей программе:

/**
 *
 * @author Андрей
 */

Далее по тексту программы мы видим строку:

package firstprogram;

В этой строке показывается, что данный исходный файл программы включён в пакет с названием firstprogram. Пока мы не будем задаваться вопросами о пакетах. Придет время и мы узнаем для чего они нужны, а пока нам достаточно знать, что в начале каждого исходного файла как правило указывается его принадлежность к пакету.
Итак, мы дошли до самого интересного. Следующая строка кода имеет такой вид.

public class FirstProgram {

В этой строке ключевое слово class используется для объявления о том, что выполняется определение нового класса. Модификатор доступа public показывает, что определяемый класс будет доступен для любого кода: как классов этого же проекта, так и любых других. В частности, поскольку этот класс главный, то при запуске программы среда исполнения Java получит доступ к этому классу. FirstProgram — это идентификатор, являющийся именем класса. Поскольку наша программа имеет всего один класс, то его имя, как легко заметить, совпадает с именем проекта и главное файла FirstProgram.java. Далее по тексту программы мы видим открывающую фигурную скобку «{«. Она является началом тела класса. Всё, что находится до закрывающей скобки «}» является телом класса. Мы рассмотрим классы, объекты и объектно-ориентированный подход позже, но сейчас нам достаточно знать, что классы обычно содержат поля и методы. Поля задают типы данных, которые содержит класс, а методы (функции-члены в других языках программирования) — представляют собой фрагменты управляющих конструкций, которые позволяют выполнять какие-либо действия.
Следующие строки выглядят так.

        public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("Привет, мир!");        
    }

Они представляют собой метод main. Модификатор доступа public показывает, что определяемый метод будет доступен для любого кода. Модификатор static показывает, что метод является статическим, то есть доступным для исполнения даже в классе, объекты которого не созданны. Позже мы уясним, что работа с классом осуществляется путем создания конкретных реализаций этого класса — объектов или экземпляров класса. Однако, в нашей простейшей программе, мы не создаем объекты класса FirstProgram. Мы используем лишь его единственный статический метод, в котором выполняются все действия программы.
Все переменные и/или поля классов обязательно имеют типы данных. Целочисленные типы, логические и т.д. Так же и методы, являясь по сути функциями имеют тип возвращаемого значения. Если метод не возвращает никакого значения, применяется ключевое слово «void«.
В скобках после имени метода () мы видим список параметров, которые может принять метод от вызывающего его объекта. В нашем случае, метод main будет вызываться средой исполнения Java. В качестве параметров он может принимать аргументы командной строки, разделённые пробелом, для чего указан массив типа String (Строковый тип данных) и именем args. В данной программе, да и в большинстве других, мы не будем использовать аргументы командной строки, однако форма есть форма. Далее между открывающей и закрывающей фигурными скобками располагается тело метода.

        System.out.println("Привет, мир!");       

Наша программа состоит из одной единственной строки. Эта строка выводит на экран строку текста «Привет, мир!«, за которой следует новая строка. В действительности вывод выполняется встроенным методом println(). Как будет показано, этот метод можно применять для отображения и других типов информации. Строка начинается с идентификатора потока System.out. Хотя он слишком сложный, чтобы его можно было подробно пояснить на данном этапе, достаточно пока сказать, что System — это предопределенный класс, который предрставляет доступ к системе, а его переменная-член out — выходной поток, связанный с консолью.

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

Продолжение: Шаг 4. Пример работы с классами и объектами
Начало: Шаг 2. Первый пример простейшей программы

Рассмотрим простейшую программу на языке Java. Исходные коды программ на языке Java оформляются в виде текстовых файлов с расширением *.java. Каждый текстовый файл может содержать один или более классов. Мы подробно рассмотрим правила оформления каждого файла *.java позже. В общем случае: создание, редактирование и другие действия с файлами *.java производятся, используя любой текстовый редактор, позволяющий сохранять неформатированный текст, например Блокнот или Notepad++. В нашем случае, мы используем среду NetBeans, поэтому файлы в ней будут создаваться автоматически.
Начнем с создания проекта в среде NetBeans. Запустим среду NetBeans и выберем пункт меню «Файл->Создать проект…»
2.создать проект
В открывшемся окне выберем тип проекта «Приложение Java»» и нажмём кнопку «Далее»
2.выбор типа проекта
В следующем окне укажем в качестве имени проекта «FirstProgram», установим флажок на пунктах «Использовать отдельную папку для хранения библиотек» и «Создать главный класс». Остальные параметры — оставляем как есть. Нажимаем кнопку «Готово».
2.параметры проекта
Итак проект создан. В левой части программы отображается структура проекта. Мы можем видеть, что файл FirstProgram.java входит в пакет firstprogram. Для чего нужны пакеты мы узнаем позже, а пока перейдем к правой части окна, где уже создан главный класс FirstProgram и в нем определен метод main, с выполнения которого всегда начинается выполнение программы на Java.
2.текст программы созданный автоматически
Изменим код программы добавив строку «System.out.println(«Привет, мир!»);» (без кавычек!) в тело метода main. Полный код программы приведён ниже.

 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package firstprogram;

/**
 *
 * @author Андрей
 */
public class FirstProgram {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("Привет, мир!");        
    }
}

Теперь, программа в главном окне приняла следующий вид:
2.измененный вариант
Запустим написанную программу. При этом, проект автоматически сохраняется и происходит компиляция программы в байт-код, который, в последствии, исполняется на любой платформе с установленной средой исполнеия Java (JRE). В нашем случае, в папке проекта создастся файл FirstProgram.class. Результат работы программы мы увидим сразу в нижней части основного окна среды NetBeans.
2.запуск
2.результат
Как можно видеть, программа выводит в консоль фразу «Привет, мир!».
Подробное рассмотрение данной программы произведем в следующей статье.

Продолжение: Шаг 3. Подробное рассмотрение программы FirstProgram
Начало: Шаг 1. Установка среды разработки NetBeans + JDK

Начнем изучение языка программирования Java с установки интегрированной среды разработки NetBeans и комплекта разработчика приложений на языке Java (JDK).

Проект NetBeans IDE поддерживается и спонсируется компанией Oracle, однако разработка NetBeans ведется независимым сообществом разработчиков-энтузиастов (NetBeans Community) и компанией NetBeans Org.

  1. Для получения дистрибутива Oracle NetBeans необходимо перейти по ссылке. Выбираем и скачиваем «JDK 7 + NetBeans«. Рекомендуется использовать 32-разрядную версию продукта.
  2. После этого запускаем скачанный файл (в моём случае файл имеет имя jdk-7u21-nb-7_3-windows-i586.exe, однако версии продукта меняются достаточно быстро и в вашем случае название может меняться).
  3. Следуем инструкциям программы установки:

01

02

03

04

05

06

07

После этого мы имеем установленную среду разработки NetBeans и Java Development Kit (JDK) — бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE).

В следующей статье мы создадим свой первый проект на Java в среде NetBeans.

Продолжение: Шаг 2. Первый пример простейшей программы

Lady Java