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

Наследование в Java по смыслу совпадает с наследованием в Python. Рассмотрим на примере с животными.

public class Animal {  // создаём в файле Animal.java
    
    private String name; // у всех животных есть имя
    
    public Animal(String name) {
        this.name = name;
    }
    
    public String getSound() {
        return "wrrrrrrrrrrrrrrrrr"; //усреднённый звук всех животных
    }
    
    public void sayHello() {
        System.out.println("%s! I'm %s!".formatted(getSound(), name));
        //или this.getSound(), this.name
    }
}

Используем так:

public class AnimalsTester { // в файле AnimalsTester.java
    public static void main(Stirng[] args) {
        var a1 = new Animal("Barsik");
        var a2 = new Animal("Tuzik");
        
        a1.sayHello(); // wrrrrrrrrrrrrrrrrr, I'm Barsik
        a2.sayHello(); // wrrrrrrrrrrrrrrrrr, I'm Tuzik.
    }
}

Унаследуем от класса Animal два других класса: Cat и Dog. Чтобы написать, что класс наследует другой, пишем A extends B (дословно: расширяет).

После этого всё содержимое Animal переходит в Cat. Т.е. теперь у Cat есть имя name, есть метод getSound(), есть sayHello. Кроме этого мы можем

public class Cat extends Animal { // в файле Cat.java
    
    //Создание кота подразумевает, что сначала создается «внутренний» класс Animal
    //Для этого есть конструктор Animal(String name), и нам надо его вызвать
    public Cat(String name) {
        super(name); // вызов конструктора базового класса
    }
    
    //конструктор без аргументов
    public Cat() {
        super("Vaska"); //имя для Animal все равно требуется
    }

    // переопределяем метод getSound(), для котов он теперь работает иначе.
    // для переопределения достаточно написать метод с тем же заголовком.
    // рекомендуется дополнтельно дописать @Override в начало
    @Override
    public String getSound() {
        return "mew"; //звук кошек
    }
    
    //особый метод, есть только у котов
    public void catchMouse() {
        System.out.println("nom-nom");
    }
    
}

// собака
public class Dog extends Animal { // в файле Dog.java
    
    public Dog(String name) {
        super(name); // вызов конструктора базового класса
    }

    @Override
    public String getSound() {
        return "woof"; //звук кошек
    }
}

Использование:

Cat c1 = new Cat("Murzik"); // нужен конструктор!! 
Cat c2 = new Cat(); //имя будет Vaska

Dog d1 = new Dog("Sharik");

c1.sayHello(); // "mew, I'm Murzik"
c2.sayHello(); // "mew, I'm Vaska"
d1.sayHello(); // "woof, I'm Sharik"

c1.catchMouse(); //можно
//d1.catchMouse(); //нельзя

Переменным, которые хранят значения типа Animal можно присваивать, на самом деле, не только Animal, но и Cat и Dog:

Animal a1 = new Animal("Burenka");
Animal a2 = new Cat("Barsik");
Animal a3 = new Dog("Tuzik");

//потом можно переделать, a3 = new Cat(...)

System.out.println(a1.getSound()); // "mrrrrrrrrr"
System.out.println(a2.getSound()); // "mew" по реальному содержимому a2
System.out.println(a3.getSound()); // "woof" по реальному содержимому

// или
Animal[] animals = {a1, a2, a3, new Cat()};
for (Animal a : animals) {
    System.out.println(a.getSound());
    a.sayHello();
}

В последнем цикле каждое животное поздоровается по-своему. Кот как кот, собака как собака.

Формат SVG

Формат изображений, распространенный, современный.

Попробуем вручную создать svg файл.

<?xml version="1.0" encoding="UTF-8"?>
<svg width="200" height="200">
    <rect fill="#00FF00" stroke="#FF0000" x="70" y="80" width="100" height="100"/>
    <rect fill="#00FF00" stroke="#FF0000" x="50" y="50" width="100" height="100"/>
</svg>

Напишите это в текстовом редакторе в файле с расширением .svg и просмотрите в просмоторщике изображений.