English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом курсе мы будем изучать ключевое слово super в Java с помощью примеров.
Ключевое слово super в Java используется в подклассе для доступа к членам родительского класса (свойствам, конструкторам и методам).
Прежде чем изучать ключевое слово super, убедитесь, что вы уже знаетеJava наследование.
Вызов переписанного метода родительского класса в подклассе.
Если у суперкласса (superclass) и подкласса (subclass) есть свойства с одинаковыми именами, то доступ к свойствам суперкласса (полю).
Прямой вызов неопределенного или параметризованного конструктора суперкласса из конструктора подкласса.
Давайте рассмотрим все эти用途.
Если в суперклассе и подклассе определен одинаковый метод, то метод в подклассе перекрывает метод в суперклассе. Это называетсяПерепись методов.
class Animal { // Метод public void display(){ System.out.println("I am an animal"); } } class Dog extends Animal { // Переписанный метод @Override public void display(){ System.out.println("Я собака"); } public void printMessage(){ display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printMessage(); } }
Результат вывода
Я собака
В этом примере, создав объект класса Dog dog1, мы можем вызвать его метод printMessage(), после чего этот метод выполняет команду display().
Поскольку display() определен в обоих классах, метод класса Dog перекрывает метод класса Animal. Поэтому вызывается метод класса Dog.
Что делать, если нужно вызвать переписанный метод суперкласса?
Если нужно вызвать перегруженный метод display() суперкласса Animal, используйте super.display().
class Animal { // Метод public void display(){ System.out.println("I am an animal"); } } class Dog extends Animal { // Переписанный метод @Override public void display(){ System.out.println("Я собака"); } public void printMessage(){ // Это вызывает переписанный метод display(); // Это вызывает метод родительского класса super.display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printMessage(); } }
Результат вывода
Я собака I am an animal
Вот как работает этот вышеупомянутый код.
Суперкласс и подкласс могут иметь свойства с одинаковыми именами. Мы используем ключевое слово super для доступа к свойствам суперкласса.
class Animal { protected String type="Животное"; } class Dog extends Animal { public String type="Млекопитающие"; public void printType() { System.out.println("Я " + type); System.out.println("Я是一只 " + super.type); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printType(); } }
Вывод:
Я млекопитающее Я животное
В этом примере мы определяем одинаковые типы полей экземпляра в суперклассе Animal и подклассе Dog.
затем мы создаем объект класса Dog dog1. Затем, используя этот объект, мы вызываем метод printType().
внутри функции printType()
type - это свойство подкласса Dog.
super.type - это свойство суперкласса Animal.
Таким образом, System.out.println("Я " + type);вывод "Я млекопитающее"и, System.out.println("Я животное " + super.type); выводитсявывод "Я животное".
Всем известно, что при создании объекта класса автоматически вызывается его default конструктор.
Чтобы явно вызвать конструктор суперкласса из конструктора подкласса, мы используем super(). Это особая форма ключевого слова super.
Внимание: super() может использоваться только в конструкторе подкласса и должно быть первым выражением.
class Animal { //default или параметризованный конструктор класса Animal Animal() { System.out.println("I am an animal"); } } class Dog extends Animal { //default или параметризованный конструктор класса Dog Dog() { //вызов по умолчанию суперкласса super(); System.out.println("Я собака"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); } }
Результат вывода
I am an animal Я собака
здесь, когда объект класса Dog dog1 создается, он автоматически вызывает его default или параметризованный конструктор.
в конструкторе подкласса, команда super() вызывает конструктор суперкласса и выполняет инструкции в нем. Таким образом, мы получаем результат"I am an animal".
затем поток программы возвращается в конструктор подкласса и выполняет оставшиеся инструкции. Таким образом, выводится "I am a dog".
но не обязательно использовать super(). Даже если super() не используется в конструкторе подкласса, компилятор автоматически вызовет默认ный конструктор суперкласса.
тогда, если компилятор автоматически вызывает super(), почему нужно явно его использовать и писать избыточный код?
если необходимо вызвать конструктор суперкласса из конструктора подклассапараметризованный конструктор (конструктор с параметрами)тогда, если компилятор автоматически вызывает super(), почему нужно явно его использовать и писать избыточный код?
с параметрами super()должно всегда бытьтело конструктора подклассав которомпервый语句в противном случае, возникнет компиляторная ошибка.
class Animal { //默认或无参数的构造函数 Animal() { System.out.println("I am an animal"); } //参数化构造函数 Animal(String type) { System.out.println("Тип: " + type);}} } } class Dog extends Animal { // По умолчанию конструктор Dog() { // Вызов параметризованного конструктора суперкласса super("Animal"); System.out.println("Я собака"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); } }
Результат вывода
Тип: Animal Я собака
Компилятор может автоматически вызывать безparameterный конструктор. Но он не может вызывать параметризованный конструктор.
Если необходимо вызвать параметризованный конструктор,则需要 явно определить его в конструкторе подкласса, как в приведенном выше коде:
super("Animal");
Обратите внимание, что в приведенном выше примере мы использовали super("Animal") для явного вызова параметризованного конструктора. В этом случае компилятор не вызовет по умолчанию конструктор суперкласса.