Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_02.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
278.09 Кб
Скачать

21 Спадкування класів й інтерфейсів. Особливості й синтаксис.

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

class BaseClass {

      private String msg = "Test message";

      public String getMessage() {

             returnmsg;

       }

      

       public void setMessage(String str) {

             msg += str;

       }

}

public class ChildrenClass extends BaseClass {

      

public static void main( String[] args )

    {

       ChildrenClass cc = new ChildrenClass();

      

cc.setMessage(" children class.");

System.out.println(cc.getMessage() );

}

}

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

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

Так же в Java есть возможность переопределять методы базовых классов, при условии, что они не имеют модификатора final,который запрещает переопределение метода. Если модификатор final стоит перед названием класса, то данный класс не может наследоваться.

И так, в дочернем классе можно переопределять реализацию методов базового класса. Это позволяет писать довольно гибкий код. Пример:

class BaseClass {

      

       private static final String MESSAGE = "Test message";

       private static String msg;

      

       public String getMessage() {

             return msg;

       }

       public void setMessage(String str) {

             msg = MESSAGE + str;

       }

      

       public void setNewMessage(String str) {

             setMessage(": "+ str);

       }

}

public class ChildrenClass extends BaseClass {

      

       // переопределение базового класса

public void setNewMessage(String str) {

            

             setMessage(" - " + str);

       }

      

    public static void main( String[] args ) {

       ChildrenClass cc = new ChildrenClass();

      

       cc.setMessage(" children class.");

        System.out.println( cc.getMessage() );

       

        // вызывается переопределенный метод базового класса

        cc.setNewMessage(" children new method.");

        System.out.println(cc.getMessage());

       

        // вызывается метод базового класса

        BaseClass bc = new BaseClass();

        bc.setNewMessage(" base new method.");

        System.out.println(cc.getMessage());

       

    }

}

Инициализация классов

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

class One {

      

       One() {

             System.out.println("Construct One.");

       }

}

class Two extends One {

      

       Two() {

             System.out.println("Construct Two.");

       }

}

public class Three extends Two {

      

       public Three() {

             System.out.println("Construct Three");

       }

    public static void main( String[] args ) {

       Three three = new Three();

       

    }

}

Ключевое слово super() должно быть первой командой в конструкторе дочернего класса.

Это вызвано тем, что Java автоматически, конструкторы с аргументами, не создает. Если вы не вызовите конструктор базового класса, с передачей ему аргументов, компилятор вернет ошибку.

class One {

       One( String str ) {

             System.out.println("Construct One. Argument: " + str);

       }

}

class Two extends One {

      

       Two( String str ) {

             super( str );

             System.out.println("Construct Two. Argument: " + str);

       }

}

public class Three extends Two {

       public Three( String str ) {

             super( str );

             System.out.println("Construct Three. Argument: " + str);

       }

    public static void main( String[] args ) {

       Three three = new Three("running");

       

    }

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]