Заведём джаву. Внеурочная заметка №4. Сумма цифр трёхзначного числа.

Во внеурочных заметках я стараюсь размещать наиболее интересные решения популярных задач. В этот раз мы сосчитаем сумму цифр трехзначного числа. К примеру есть число 321 — сумма его чисел 6. Как же сказать об этом программе?

public class test3 {

    public static void main(String[] args) {
        System.out.println(sumnum(321));
    }

    public static int sumnum(int number) {
       
    }


}

Простейший класс, метод main, в котором мы выводим на экран значение, которое вернёт метод sumnum, если передать ему число 546, собственно и сам статический метод sumnum. Статический — дабы нам не создавать объект — сделаем в процедурном стиле.

Итак есть число 321, логично, что каждую цифру нужно «загнать» в массив.

[0] = 3;

[1] = 2;

[2] = 1;

То есть что-то вроде:

 

public int[] chislo = {"3", "2", "1"}; 

Ага — подумали мы. Как же сказать программе, что это у нас массив?

Во-первых можно перевести число 321  в строку 321. Для этого можно воспользоваться методом valueOf.

Позволю себе немного «копипасты».

Читать дальше …

Заведём джаву. Внеурочная заметка №3. Функция RANDOM (случайное число) в Java

Как-то рассказывал детишкам понятие класс, поля класса, объект, метод в Java, то есть самые базовые понятия в ООП. В качестве примера создавали мы объект крыса (так детишки предложили), а в качестве метода… по предложению моих любимых детишек-студентов крыса должна была укусить случайного студента. И вот тут возник вопрос, а как реализовать метод случайного значения (random)? Вопрос далеко не праздный, как оказывается — не всё так просто.  Но обо всём по порядку. Сначала мы создали класс kriska.

public class kriska {

    

}

Потом мы добавили поля класса, такие, как имя крыски, её цвет и вес.

public class kriska {

public String name = "Кевин Дэ Хомячков";

public int ves = 100;

public String cvet = "Зелёная";

}

 

Да да вот так зовут нашу животинку — Кевин Дэ Хомячков и весит она у нас 100 кг.  Тоже студенты придумали :).

 

Добавим массив студентов.

 

public String[] students = {"Вася", "Петя", "Коля"};


Ну что ж, создадим метод ykysi?

 

public void ykysi(){

    System.out.println(cvet + " крыса " + name + " весом " + ves + " кг"+ " укусила Васю. " );


}

 

Ну и конечно же метод main. Также обратите внимание на то, что метод ykysi не имеет ключевого слова статик, а значит для вызова этого метода нужно будет создать объект.

 

public class kriska {

    public String name = "Кевин Дэ Хомячков";

    public int ves = 100;

    public String cvet = "Зелёная";

    public String[] students = {"Вася", "Петя", "Коля"};

    public void ykysi(){

        System.out.println(cvet + " крыса " + name + " весом " + ves + " кг"+ " укусила Васю. " );


    }

    public static void main (String args[]) {

        kriska kevin = new kriska();

        kevin.ykysi();

    }
}

 

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

System.out.println(cvet + " крыса " + name + " весом " + ves + " кг"+ " укусила " + students[тут случайное число от 0 до 2] );

Для генерации случайного числа в java есть метод Math.random();, вот только генерирует он числа от 0 до 1!
То есть имеет тип double.

 

Читать дальше …

Заведём джаву. Внеурочная заметка №2. Сортировка чисел по возрастанию.

ЗАМЕТКА НЕДООФОРМЛЕНА. ЧУТЬ ПОЗЖЕ ИЗМЕНЮ.

 

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


public class array {

    public static void main(String[] args) throws Exception
    {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int[] a = new int[5];
        for (int i = 0; i < 5; i++){
            a[i] = Integer.parseInt(reader.readLine());
        }

        for (int i = 0; i < a.length; i++){
            int min = a[i];
            int minIndex = i;
            for (int j = i + 1; j < a.length; j++){
                if (a[j] < min){
                    min = a[j];
                    minIndex = j;
                }
            }
            if (i != minIndex){
                int temp = a[i];
                a[i] = a[minIndex];
                a[minIndex] = temp;
            }
            System.out.println(a[i]);
        }
    }
}


Наш класс называется Array — то есть массив. По-научному массив — это конечная последовательность упорядоченных элементов одного типа, доступ к каждому элементу в которой осуществляется по его индексу.

Объявляется так: тип[] имя;
тип имя[];

Где тип — это тип элементов массива, а имя — уникальный (незанятый другими переменными или объектами в этой части программы) идентификатор, начинающийся с буквы.

Пример: String[] kotiki = new String[5]; Мы объявили массив kotiki типа String (строка), который будет содержать 5 значений.

Пример:


String[] kotiki = new String[5];

kotiki[0] = "Пусь";

kotiki[1] = "Мурчик";

kotiki[2] = "Барсик";

kotiki[3] = "Мурзик";

kotiki[4] = "Китякет";

System.out.println(kotiki[2]);

Читать дальше …

Вне урока. Пишем простые гонки на java часть 1.

Не планировал переходить к публикации заметок о создании конкретных приложений, пока мы не выложу все лекции по ключевым моментам в java. Однако по просьбам трудящихся. Люди просят, значит приступим. Честно признаюсь — лекции лишь адаптации видеоуроков, которые записаны не мной. Ну что поехали. Задача сделать простое 2D гонки.

Открываем Netbeans, нажимаем Файл — Создать проект. В группе «категории» выбираем Java, а в группе «проекты» пункт Приложение java.

В строке Имя проекта введём, например, Gonki.

 

Убираем комментарии, чтобы у нас остался следующий код в файле gonki.java

 

package gonki;

public class Gonki {
   
    public static void main(String[] args) {
       
    }  
}

Теперь создадим папку для ресурсов игры. Для этого нажмём ПКМ (Правая Кнопка Мыши) по пакету gonki и выберем Новыйпапка. В открывшемся окне в строке Имя папки напишем res, после чего нажмём Готово.

В папке res будут храниться следующие изображения:

1) Дорога (1200×600)

2) Машинка игрока, когда она «едет прямо» и когда она поворачивает вправо и влево.

3) Машинка противников.

Графика не моя, я её скачал.

Отправить изображения в папку res очень просто. Cохраняем их в какую-либо папку, выделяем, нажимаем ПКМ — копировать. Теперь жмём ПКМ по папке res и выбираем Вставить.

Теперь создадим игровое окно. Но перед этим необходим импортировать библиотеку javax.swing. Для этого в файле gonki.java ниже строки объявления пакета пишем

 import javax.swing.*;

Далее в методе main пишем


 JFrame window = new JFrame ("Простые гоночки на Java");

То есть мы создали ссылочную переменную window типа JFrame, которая указывает на объект JFrame, конструктор которого принимает в данном случае заголовок окна («Простые гоночки на Java»).

Ниже пропишем следующее


window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Мы вызвали метод объекта window setDefaultCloseOperation с константой JFrame.EXIT_ON_CLOSE. Это необходимо для того, чтобы окно с игрой можно было закрыт нажатием Левой Кнопкой Мыши (ЛКМ).

Соответственно код файла gonki.java выглядит так:

package gonki;

import javax.swing.*;

public class Gonki {
   
    public static void main(String[] args) {
       
        JFrame window = new JFrame ("Простые гоночки на Java");
        
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }  
}

Далее устанавливаем размеры окна. Пишем ниже:

window.setSize(1100, 600);

Метод setSize принимает ширину и высоту окна программы. Однако если мы сейчас запустим программу, то ничего не произойдёт. Потому что нужно сделать наш фрейм видимым. Для этого ниже прописываем:

window.setVisible(true);

Попробуем запустить программу и получим окно заданных размеров. Код файла gonki.java покавыглядит так:


package gonki;

import javax.swing.*;

public class Gonki {
   
    public static void main(String[] args) {
       
        JFrame window = new JFrame ("Простые гоночки на Java");
        
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        window.setSize(1100, 600);
        
        window.setVisible(true);
    }  
    
}

Теперь помимо того, что мы скопировали наши файлы с графикой в папку res, давайте снова выделим рисунки, нажмём копировать и перейдём в папку с нашим проектом. Как правило NetBeans хранит файлы проектов в папке «мои документы» — NetBeansProjects. В папке NetBeansProjects находим название нашего проекта — gonki, а в папке gonki папку res — туда тоже копируем графические файлы.

Пришло время создать фрейм с фоном дороги.

Теперь в папке gonki создадим файл road.java (дорога) с вот таким кодом


package gonki;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.swing.*;

public class Road extends JPanel {
    
    Image img = new ImageIcon("res/doroga.png").getImage();
    
    public void paint(Graphics g) {
        
        g = (Graphics2D) g;
        g.drawImage(img, 0, 0, null);
        
    } 
    
}


Ключевое слово extends обозначает Наследование. Класс Road расширяет Jpanel. Дорога занимает всю область главного фрейма. Image img = new ImageIcon(«res/doroga.png»).getImage(); — конструктор объекта класса ImageIcon принимает путь к изображению, после чего вызывается метод getImage(), который и возвращает нам Image.

Опишу я его позже.

А файл gonki.java изменим следующим образом:


package gonki;
 
import javax.swing.*;
 
public class Gonki {
    
    public static void main(String[] args) {
        
        JFrame window = new JFrame ("Простые гоночки на Java");
         
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        window.setSize(1100, 600);
        
        
        window.add(new Road());
         
        window.setVisible(true);
        
        
    }  
     
}

Дописывается….

Заведём жабу? Часть 12. Ключевое слово static

Ключевое слово static

Давайте рассмотрим схему.

Допустим у нас есть класс. В нашем случае класс Computer. Класс является как бы шаблоном для создания конкретного экземпляра класса. Класс Computer имеет методы on(); off(); load();, которые делают какие-то манипуляции с объектом. И переменные ram; и hdd;, которые будут характеризовать созданный объект. Методы и переменные не статичные. Во время выполнения программы создаются объекты на основе этого класса и тут важно помнить, что для каждого объекта Computer создаются отдельные методы on(); off(); и load(); и эти методы привязаны к конкретному экземпляру класса.

ТО ЕСТЬ БЕЗ ОБРАЩЕНИЯ К ОБЪЕКТУ МЫ НЕ СМОЖЕМ ВЫЗВАТЬ МЕТОД. Также и переменные класса. Для каждого объекта создаются свои переменные класса, которые привязаны к объекту и которые характеризуют состояние данного объекта. В нашем случае для первого, второго и третьего объекта методы on(); off(); load(); будут индивидуальны для каждого объекта, а также переменные ram; hdd; будут индивидуальны. В наших примера в Netbeans мы «через точку» вызывали методы, используя переменную со ссылкой на объект.

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

В классе Computer наиболее подходящий претендент на статичный метод является метод print. Он не работает с переменными объекта, а просто выводит на экран строку и он может быть не привязан к объекту. Следовательно желательно сделать его статичным. Итак на схеме появился новый статичный метод print. При создании статичного элемента выделяет область памяти, которая помечена как область, связанная с классом Computer и в нём как раз находится метод print. Но эта область памяти, помеченная как Computer — это не экземпляр класса, а просто специальная область. Она не создана ключевым словом new, как мы это делали раньше, она создана загрузчиком классов виртуальной машины Java и там находятся все статичные элементы и мы МОЖЕМ ОБРАЩАТЬСЯ К МЕТОДУ БЕЗ СОЗДАНИЯ ОБЪЕКТА! Просто указав название класса и через точку метод print.

То есть как мы видим данный метод не привязан к конкретному экземпляру класса. Почему у объектов также отображается метод print? В объекте 1, в объекте 2, в объекте 3, если этот метод к ним не привязан? Потому что через ссылку на объект мы тоже можем обратиться к статичному методу, но по факту для любого объекта мы будем обращаться к одному и тому же методу, который находится в специальной области памяти.

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

Статичные переменные часто являются константами — то есть неизменяемыми значениями в программе. А также статичные переменные могут использоваться как некий аналог глобальных переменных, которые будут видны из любого места программы. То есть все объекты могут изменять какое-то одно значение, которое будет доступно для всех. Например какой-нибудь глобальный счетчик для всей программы.

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

Статичный метод не имеет права изменять свойство объекта, так как этот метод не привязан к конкретному объекту. Если мы попытаемся обратиться из статичного метода к переменной класса, которая не является статичной, то компилятор нам укажет на ошибку. Потому что не статичные элементы НЕЛЬЗЯ использовать в статичном методе.

Статичные элементы не манипулируют свойствами объекта и не привязаны к конкретному объекту.

Статичные методы и свойства можно вызывать:
1. Через имя класса. Если статичный элемент находится том же классе, откуда мы его вызываем — то название класса можно не писать — можно сразу указывать название статичного элемента. Именно это мы использовали, когда делали простейшую программку для подсчета госпошлины. Также это использовалось с вызовом метода doSmth — мы не писали название класса, а просто сразу начали вызывать этот метод.
2. Через ссылку на экземпляр класса.

Чаще используется первый вариант:

НазваниеКласса.статичный_элемент

Статичный элемент связан не с объектом, а с классом.

Посмотрим как это выглядит в программном коде.

Откроем Netbeans и перейдём в класс Computer. В классе Computer нас интересует метод print();


      protected void print (String str){
    
      System.out.println(str);
}

Для того, чтобы сделать print статичным методом, нам необходимо прописать ключевое слово static. К примеру сделаем так:


   public static void print (String str){
    
      System.out.println(str);
}

Заметьте, что после того, как мы прописали ключевое слово static — название метода Netbeans отобразил курсивом. Это сделано для визуального отличия статичного метода от не статичного. Также в навигаторе Netbeans метод отображается особым образом — кружочек и по середине палочка.

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

Будем вызывать двумя способами:

1) Через ссылку на класс.

2) Через ссылку на экземпляр класса.

Закомментируем всё, что есть внутри класса main. Для начала вызовем метод при помощи ссылки на класс. Можно просто написать Computer. (вот так с точкой) и Netbeans нам покажет, что метод print нам уже доступен.


public static void main(String[] args) {
        
       Computer.print("Test String");
}

Запустим программу и увидим, что программа выполнилась.

run:
Test String
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

Теперь давайте создадим экземпляр класса. Удалим строку Computer.print(«Test String»); и напишем:

Computer comp = new Computer();

При создании будем использовать конструктор без параметров. Возможно, компилятор Netbeans посоветует создать такой конструктор в классе Computer (поскольку у нас там уже были конструкторы с параметрами), сделаем это.


public Computer() {
        
    }

Напишем в классе MyFirstProgram в методе main, comp. поставим точку — Netbeans отобразит доступный метод print. То есть метод print также доступен через ссылку на экземпляр класса. Вызывается один и тот же метод, который находится в определённой области памяти.

Computer comp = new Computer();
comp.print("Test String");

Данный метод также выполнится, однако Netbeans «делает» замечание, что мы делаем доступ к статичному методу print. То есть он «говорит,» что мы бессмысленно создавали объект для того, чтобы сделать доступ к методу print, потому что к методу print мы можем обратиться и без создания объекта. Netbeans «подсказывает,» что мы делаем лишние действия, создаём лишний объект.

Важный момент. Мы можем не создавать объект, а написать вот так:

 Computer comp = null;
comp.print("Test String");

то есть у нас нет ссылки на объект какой-либо, у нас есть просто переменная comp типа Computer. И в этом случае статичный метод тоже выполнится, поскольку статичный метод не привязан к экземпляру класса и может вызываться даже без ссылки на экземпляр класса. Достаточно иметь переменную просто нужного типа.

Также следует знать, что в отличие от методов объекта, от обычных методов, которые «живут» вместе с объектом, статичные элементы доступны на протяжении всей программы. То есть уборщик мусора даже если очистит память от каких-либо объектов, статичные элементы останутся.

Статичный метод выполняет какой-либо функционал без привязки к классу, то есть он не манипулирует свойствами объекта и никак не задействован в самом объекте. Просто это как бы вспомогательный метод. Поскольку для каждого объекта Computer не будет создаваться метод print, используя статический метод print мы немного сохраним память.

Заведём жабу? Часть 11. Абстрактные классы и интерфейсы.

Абстрактные классы и интерфейсы.

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

Нельзя создать просто ноутбук — это бессмысленно. Фирма-производитель всегда создаёт какую-то конкретную модель. Потому что ноутбук — это абстрактное понятие. Или другой пример — машина. Заводы не производят просто машины — они производят конкретные модели машин. Каждая со своими характеристиками. Но основа у всех одна — машина. То есть поведение, действия у всех машин одинаковые. Машины могут ездить, сигналить, поворачивать и так далее. Но каждая модель делает это по своему, плюс добавляет какие-то свои удобства.

Можно сказать, что все машины используют какую-то одну модель поведения, то есть они должны уметь выполнять определённые действия, характерные для машины. Но как именно выполнять — это уже на усмотрение каждой модели. И здесь мы подошли к понятию абстрактного класса.

Абстрактный класс нужен для того, чтобы задать поведение для всех дочерних объектов или, можно сказать, задать модель поведения. Например абстрактное понятие ноутбук может задать модель поведения, которая будет характерна для всех ноутбуков. Но каждая конкретная модель будет реализовывать её по своему. Рассмотрим схему.

Читать дальше …

Заведём джаву. Внеурочная заметка №1.

Маленькая внеурочная заметка. Вызвана она, прежде всего, вопросами студентов, а зачем нам учить эту «джаву,» мы же будущие юристы, а не программисты. Где нам это пригодится?

Специально для группы ЮП-31 и публикую данную статью. Давайте рассмотрим простейший пример того, как же программирование может автоматизировать профессиональную деятельность юриста.

Вот такой случай: один человек просит у другого в долг деньги под расписку на определённое время. По окончании срока возвращать сумму не собирается, при этом является собственником гараж и автомобиля. Добросовестному заимодавцу ничего не остаётся, как подать исковое заявление в суд с тем, чтобы не деньгами, так автомобилем вернуть долг. Возникает спор имущественного характера, подлежащий оценки.

И тут, внезапно, заимодавец узнаёт, что подать исковое заявление — это не так просто. Нужно заплатить государственную пошлину. Эту самую пошлину впоследствии можно будет взыскать с должника, но чтобы подать иск изволь выложить здесь и сейчас. И если сумма займа была большой, то и пошлина будет не маленькой.

Размеры государственной пошлины по делам, рассматриваемым Верховным Судом Российской Федерации, судами общей юрисдикции, мировыми судьями регламентируются ст. 333.19 НК РФ:

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

1) при подаче искового заявления имущественного характера, административного искового заявления имущественного характера, подлежащего оценке, при цене иска:

до 20 000 рублей — 4 процента цены иска, но не менее 400 рублей;

от 20 001 рубля до 100 000 рублей — 800 рублей плюс 3 процента суммы, превышающей 20 000 рублей;

от 100 001 рубля до 200 000 рублей — 3 200 рублей плюс 2 процента суммы, превышающей 100 000 рублей;

от 200 001 рубля до 1 000 000 рублей — 5 200 рублей плюс 1 процент суммы, превышающей 200 000 рублей;

свыше 1 000 000 рублей — 13 200 рублей плюс 0,5 процента суммы, превышающей 1 000 000 рублей, но не более 60 000 рублей;

Подсчитать — ничего сложного, когда таких исков 2 или 3. А когда их десятки? Вот этот процесс мы и автоматизируем, написав прооостенькую консольную программку на java.

Читать дальше …

Заведём жабу? Часть 10. Полиморфизм.

Полиморфизм

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

Рассмотрим на примере. Открываем Netbeans, файл MyFirstProgram. Для начала внесём изменения. В файле Computer.java изменим модификаторы доступа переменных с public на protected, чтобы получать к ним доступ из класса Notebook.

Изменим первый конструктор в классе Computer следующим образом:

public Computer(String name) {

this.name = name;

}

Класс Notebook переделаем следующим образом:

package testobject;

public class Notebook extends Computer{

public Notebook(String name) {

super(name);
}

public Notebook (String name, int ram, int hdd, double weight) {

super(name, ram, hdd, weight);
}

@Override
public void on(){

print("Notebook. Я включился. Моя модель " + getName());

}

@Override
public void load() {

}
}


Ключевое слово super говорит нам о том, что мы будем использовать переменные из родительского класса Computer. В общем наши файлы могут выглядеть примерно так:

Читать дальше …

Заведём жабу? Часть 9. Наследование.

Наследование.

Прежде, чем приступить к практике наследования следует повторить знния по модификаторам доступа. Всего существует 4 модификатора доступа.

public — доступ с любого места. Чаще всего используется для внешнего интерфейса.

protected — доступ внутри пакета и в дочерних классах. Чаще всего используется при наследовании.

без указания (или по умолчанию) — доступ внутри пакет. Такой вариант использовать нежелательно. Лучше указывать явно модификатор доступа.

private — доступ только внутри класса. Чаще всего используется для скрытия реализации (инкапсуляции). То есть для каких-либо служебных методов, которые должны работать только внутри класса.

Список представлен в порядке уменьшения области видимости (сверху-вниз).

Давайте попробуем использовать наследование в программном коде.

Наш файл MyFirstProgram.java выглядит примерно так:


package myfirstprogram;
 
import testobject.Computer;
 
public class MyFirstProgram {
 
    public static void main(String[] args) {
       
      Computer comp = new Computer("IBM", 2048, 320, 2);
       
//     comp.setName("IBM");
//       
//      comp.setRam(2048);
//      
//      comp.setHdd(320);
       
      comp.on();
       
      comp.load();
       
      comp.off();
       
    }
     
}

Читать дальше …