This repository has been archived on 2024-08-23. You can view files and clone it, but cannot push or open issues or pull requests.
lessons/Java/Java.md
2023-10-08 18:00:42 +00:00

9.6 KiB
Raw Blame History

Java

Функция main

package org.example;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

Сокращения InteliJ

  • psvm - public static void main
  • sout - Sytem.out.println()
  • serr - System.err.println()
  • I - for(Object object: ){}
  • fori - for (int i = 0; i< ; i++) {}
  • shift + shift - поиск по проекту
  • ctrl + alt + t - сниппеты для блоков кода (циклы, if, switch, try-catch)
  • alt + insert - сниппеты для класса

Строки

Строки неизменяемые (immutable) и не могут иметь наследников (final). Для изменения копии

// foo и bar - 1 объект в Pool (аля static)
String foo = "foo";
String bar = "foo";
// baz - объект в куче
String baz = new String("baz");

StringBuffer и StringBuilder

Данные типы - изменяемые строки с изменениями на месте. StringBuffer синхронизирует методы, поэтому медленее, но можно работать в многопотоке. StringBuilder быстрее, но методы не синхронизирует

// Можно передать строку в инициализатор, но не обязательно
StringBuffer sb = new StringBuffer(); 

sb.append("foo");
sb.append(5);

Методы StringBuffer и StringBuilder

  • append (смотреть выше)
  • delete(int start, int end)
  • insert(int offeset, String str)
  • replace(int start, int end, String str)
  • reverse()
  • substring(int start, int end) - создаст новую строку
  • toString - перевести в строку

RegEx

RegEx - щаблон для поиска строки в тексте

Примеры RegEx

  • "java" - только слово java подойдёт
  • "\d{3}" - 3 цифры

Pattern для RegEx

Pattern - скомпилированный RegEx

Pattern p = Pattern.compile("java");
p = Pattern.compile("java", Pattern.CASE_INSENSETIVE);

Var

Var выбирает тип по типу данных, который мы присваеваем. Нужно инициализировать при объявлении

var x = 5;

Константы

В Java константы объявляются словом final

final int LIMIT = 5;

Массивы

Объявлять массивы можно разными способами

int nums[] = new int[] {10, 20};
int[] nums = {10, 20, 30};

Многомерный массив

int[][] nums = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

Параметры переменной длины

static void sum(int ...nums) {
    int result = 0;
    for(int n: nums) {
        result += n;
    }
    System.out.println(result);
}

Все обязательные параметры до параметрвов переменной длины

Значения по умолчанию для параметров

Их нету!!!

Перегрузка методов

Перегрузка позволяет определять функции с одинаковым именем, но с разными типами и/или кол-вом параметров.

static int sum(int a, int b) {
    return a + b;
}

static double sum(double a, double b) {
    return a + b;
}

Если отличается только выходной тип, то останется только последняя имплементация

// Эту версию не получится вызвать
static int sum(int a, int b) {
    return a + b;
}

// Будет вызываться эта версия
static double sum(int a, int b) {
    return a + b;
}

Обработка ошибок

try-catch-finally

try {
    int[] a = new int[3];
    a[4] = 5;
} catch (Exception e) {
    e.printStackTrace();
} finally {
    System.out.println("Will always print this");
}

throw

throw new Exception("Very important exception! Don't you dare not handle it");

throws

Позволяет кинуть ошибку вверх по стаку

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

OOP

OOP - бяка, Java - OOP => Java - бяка

public class Foo {
    int bar;
    string baz;

    void fooBar() {
        System.out.println("FooBaz");
    }
}

Модификаторы доступа

  • public - везде
  • private - только внутри класса
  • protected - подклассы и сам класс

Если не указан, то применяется модификатор по умолчанию. Он делает переменную public в пределах данного пакета

Конструктор и инициализатор

public class Test {
    int age;
    int age2;
    int age3;

    // Блок - инициализатор
    {
        age = 5
    }

    // Конструктор
    public Test(int age2, int age3_input) {
        this.age2 = age2;
        age3 = age3_input; // Такое не делать, ибо не красиво
    }
}

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

public class Foo {}

public class Bar extends Foo {}

Множественное наследование низя. Приватное не наследуется

Override

class Foo  {
    int foo() {
        return 5;
    }
}

class Bar extends Foo {
    @Override
    int foo() {
        return 6;
    }
}

Уровень видимости при Override не может понижаться. У переопределённого метода должен быть такой же интерфейс, как и у родителя

super

super позволяет обратиться к методам родительского класса

class Foo  {
    int foo() {
        return 5;
    }
}

class Bar extends Foo {
    @Override
    int foo() {
        return super.foo();
    }
}

final при наследовании

final запрещает наследование

Наследование конструктора

class Foo {
    int a, b;

    Foo(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

class Bar extends Foo {
    int c;

    Bar(int a, int b, int c) {
        // Тут super должен быть сверху, иначе ошибка
        super(a, b);
        this.c = c;
    }
}

instanceof

Позволяет проверить, создан ли объект на основе какого-то класса

class Foo {
    int a, b;

    Foo(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

class Bar extends Foo {
    int c;

    Bar(int a, int b, int c) {
        // Тут super должен быть сверху, иначе ошибка
        super(a, b);
        this.c = c;
    }
}

class Main {
    public static void main() {
        Bar bar = new Bar();
        System.out.println(bar instanceof Foo);
    }
}

Абстрактные классы

Абстрактные классы могут иметь абстрактные методы (без имплементации), но от них низя создать объект.

abstract class Car {
    int speed;

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    abstract int brake();
}

class Sedan extends Car {
    @Override
    int brake() {
        return 5;
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car(); // Низя. Класс абстрактный
        Sedan sedan = new Sedan();
    }
}

Интерфейсы

Абстрактные классы для классов, которые имеют много общего, имеют близкую связть, а интерфейсы используются для тех, которые не имеют связи:

  • Bird - абстрактный класс
  • Flyable - интерфейс. Его могут имплементировать и птицы, и самолёты, и Карлсон

Отличия от классов:

  • Нельзя создать экземпляр
  • Не содержатся конструкторы
  • Все методы абстрактные
  • Все поля и static и final
  • Интерфейс не расширяется классом, а реализуется
  • Интерфейс может расширить множество интерфейсов
public interface Swimmable {
    public void swim();
}

class Duck implements Swimmable {
    public void swim() {
        System.out.println("A duck is swimming");
    }
}

Классы обёртки

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

Автораспаковка, автоупаковка

int x = 5;
Integer y = x; // Автоупаковка
x = y; // Автораспаковка

Автоупаковка и автораспаковка не работает для массивов

Коллекции

Основные виды:

  • Set
    • HashSet
    • TreeSet
    • SortedSet
  • List
    • ArrayList
    • LinkedList
    • Vector
    • Stack
  • Map
    • HashMap
    • TreeMap
    • SortedMap
    • Hashtable