- PVSM.RU - https://www.pvsm.ru -

Создание простейшего приложения на Java 2

Доброго времени суток.

Прочитав пост VladimirJoy [1] Создание простейшего приложения на Java [2], решил несколько развить начатую тему. Если вы знаете всю теорию ООП, но так и не поняли, с чего же начать писать свои классы с использованием полиморфизма [3] и инкапсуляции [4], или же просто хотите поспорить на тему хорошего тона программирования на Java — прошу под кат.

И да, сразу уточню, я буду писать про написание приложения в текстовом редакторе. Никаких IDE, никаких автоматических сборок и запуска приложения по кнопочке play. Потому что используя IDE сложно понять, как Java запускает ваше приложение. И потому что это круто :)

Итак, давайте начнем с начала.
Надо создать файл с расширением .java. В этих файлах и будет содержаться наш с вами код. На каждый класс — по файлу. И да, уточнение, названием файла должно быть название класса, иначе ничего не заработает.
Ну создадим, для примера, файл с названием MyCoolClass.java, в который поместим код:

public class MyCoolClass{

public MyCoolClass(){
//Конструктор объекта
//Сюда пишем всякие разные присваивания и другие плюшки, которые хотим дать нашему объекту при рождении
}

public void someMethod(){
//Тут прописываем метод объекта. Ну например, можем его попросить вывести нам на экран чего нибудь
System.out.println("MyCoolClass object called a someMethod method!!");
}

public static void someStaticMethod(){
//Статичный метод, вызывается классом, а не его объектами.
}

}

Ну вот как-то так. Эдакие файлы можно группировать по папкам (а классы будут группироваться по package). Скомпилировать один такой фаил можно с помощью команды javac MyCoolClass.java, в результате получим .class фаил, который является байт-кодом. Вот .class то и будут считаны JVM и исполнены.
Уточнение — что бы правильно, со всеми зависимостями, скомпилировать приложение, содержащее в себе несколько packages и классов, можно использовать разные утилиты, например Ant (Google, Habrahabr [5]).

Точка входа в программу — метод main(String[] args){}. С него то вся работа и начинается. Хорошим тоном считается начинать программу так [2](вот собственно и все, VladimirJoy [1], что вы донесли до общественности, кроме, конечно, рекламы и желания увидеть свою статью первой в Google):

public class Application {
    public void init() {
      //Тут наше приложение инициализируется. Создаются все нужные для работы объекты, делаются все проверки, добавляются разные плюшечки
    }

    public void run() {
      //Тут наше приложение начинает свою работу.
    }

    public static void main(String[] args) {
        Application application = new Application();
        application.init();
        application.run();
    }
}

Повторюсь, методы init() и run() — просто хороший тон, и они необязательны. Все то, что вы пишете в них, можно поместить в main, если очень хочется.

Для проверки, опять же, компилируем:

javac Application.java

и запускаем

java Application

Это если у вас нет packages. Если они присутствуют, компиляция с помощью Ant, запуск:

java 'packageName.Application'

Теперь мы знаем, с чего начать. Давайте, например, напишем программу, в которой будет… Скажем, одна вселенная, содержащая 3 планеты, и у одной из планет будет 1 спутник, а у другой — 2 спутника.

Нам нужен класс Вселенной. Создадим файл Universe.java, и поместим в него следующий код:

import java.util.LinkedList;

public class Universe{

private String name;
private LinkedList<Planet> planets; //Список планет, которые есть в нашей вселенной

//Constructor
public Universe(String name){
this.name = name; // Дадим имя нашей вселенной. Просто что бы показать, как давать аргументы конструктору и куда их потом помещать
this.planets = new LinkedList<Planet>();//инициализация списка, он пока пуст
}

//Add planet
public void addPlanet(Planet p){
planets.add(p); //добавляем планету, переданную в аргументе, в наш список
}

//Переопределим метод toString, который возвращает объект типа String 
//Это для того, что бы можно было красиво вывести информацию о вселенной в консоль

@ Override
public String toString(){
String res = "Universe "+name+": "
for(Planet p: planets){
//пробегаем по списку планет и добавляем их к нашему выводу
res+=p.toString()+", "; //так прибавлять одну строку к другой нельзя, это медленно и плохо, но для начало сойдет
}
return res; //возвращаем полученный результат.
}
}

Стоп стоп стоп! У нас же ведь только одна вселенная может существовать (мы же все таки не совсем боги)! Тут мы прибегаем к так называемому Singelton Pattern [6]. Суть его в том, что мы создаем только один объект какого-то класса, и при каждом запросе возвращаем его. (Вообще вот [7] сборище некоторых паттернов, очень занимательное и нужное чтиво). Примерно так его надо реализовывать:

import java.util.LinkedList;

public class Universe{

private String name;
private LinkedList<Planet> planets; //Список планет, которые есть в нашей вселенной

private static Universe instance = null; //Единственный объект этого класса, который и будет возвращен всем жаждующим

//Метод, который теперь будет вызываться, если нам понвдобится вселенная. Возвращает единственны существующий объект класса. Статичный.

public Universe getInstanceOf(){
 if(instance==null)
  instance=new Universe("My Universe");
 return instance;
}

//Constructor
//Заметили? Конструктор стал private!
private Universe(String name){
this.name = name; // Дадим имя нашей вселенной. Просто что бы показать, как давать аргументы конструктору и куда их потом помещать
this.planets = new LinkedList<Planet>();//инициализация списка, он пока пуст
}

//Add planet
public void addPlanet(Planet p){
planets.add(p); //добавляем планету, переданную в аргументе, в наш список
}

//Переопределим метод toString, который возвращает объект типа String 
//Это для того, что бы можно было красиво вывести информацию о вселенной в консоль

@ Override
public String toString(){
String res = "Universe "+name+": "
for(Planet p: planets){
//пробегаем по списку планет и добавляем их к нашему выводу
res+=p.toString()+", "; //так прибавлять одну строку к другой нельзя, это медленно и плохо, но для начало сойдет
}
return res; //возвращаем полученный результат.
}
}

Вот. Со вселенной закончили. Дальше нам нужны планеты. Также создадим файл Planet.java

import java.util.LinkedList;

public class Planet{

protected int radius;//Радиус планеты, protected потому что будет доступен подклассам
protected int orbitDistance;//Радиус орбиты
protected String name; //Название планеты
private LinkedList<Satellite> satellites;//список спутников планеты

public Planet(String name, int radius, int orbitDistance){
this.radius=radius;
this.orbitDistance=orbitDistance;
this.name=name;
satellites=new LinkedList<Satellite>();
}

public void addSatellite(Satellite s){
satellites.add(s);
}

@ Override
public String toString(){
String res="Planet "+name+", radius="+radius+", orbit distance="+orbitDistance;
}
}

И еще нам нужны спутники. Спутники будут подклассами планет, что бы показать, как работает наследование. Файл: Satelite.java:

//Extends значит что это подкласс планет. И все protected поля в Planet доступны и тут.
public class Satellite extends Planet{

public Satellite(String name, int radius, int orbitDistance){
super(name, radius, orbitDistance);//Просто вызываем конструктор класса Planet, который запихивает нужные значения в нужные переменные
}

//Переопределим метод toString. без этого переопределения будет вызван toString из класса Planet
@ Override
public String toString(){
return "Satellite "+super.toString(); //некрасивый вывод, зато видно, как можно использовать методы супер-классов. Здесь мы вызываем метод toString из класса Planet, и к строке, которую он возвращает, добавляем Satellite
}
}

С классами закончили. Осталось написать main, и запустить!

Итак, метод main поместим в класс Application. Файл Application.java:

public class Application{

private Universe universe;

private Planet pandoraPlanet;
private Planet deadStarPlanet;
private Planet terraPlanet;

private Satellite luneSatellite;
private Satellite cookieSatellite;
private Satellite iHaveNoMoreAboutForNamesSatellite;

public void init(){
universe=Universe.getInstanceOf();

pandoraPlanet=new Planet("Pandora", 15, 200);
deadStarPlanet=new Planet("DeadStar", 40, 500);
terraPlanet=new Planer("Terra", 36, 475);

luneSatellite = new Satellite("Lune", 2, 24);
cookieSatellite = new Satellite("Cookie", 3, 28);
iHaveNoMoreIdeasAboutNamesSatellite = new Satellite("I have no more ideas about names", 1, 87);
}

public void run(){
deadStarPlanet.addSatellite(cookieSatellite);
terraPlanet.addSatellite(luneSatellite);
terraPlanet.addSatellite(iHaveNoMoreAboutForNamesSatellite);

universe.addPlanet(deadStarPlanet);
universe.addPlanet(terraPlanet);
universe.addPlanet(pandoraPlanet);

System.out.println(universe);
}

public static void main(String[] args){
Application app = new Application();
app.init();
app.run();
}
}

Компилируем:

javac *.java

И запускаем:

java Application

Вот и все! Первое приложение готово и запущено. А дальше… Только ваша фантазия. И гугл вам в помощь.

Автор: Mgrin


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/8330

Ссылки в тексте:

[1] VladimirJoy: http://habrahabr.ru/users/vladimirjoy/

[2] Создание простейшего приложения на Java: http://habrahabr.ru/post/144617/

[3] полиморфизма: http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

[4] инкапсуляции: http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

[5] Habrahabr: http://habrahabr.ru/post/99394/

[6] Singelton Pattern: http://en.wikipedia.org/wiki/Singleton_pattern

[7] вот: http://habrahabr.ru/post/49365/