super() вызывает родительский конструктор без аргументов.
Может использоваться и с аргументами. Т.е. super(argument1)и он будет вызывать конструктор, который принимает 1 параметр типа argument1(если существует).
Также его можно использовать для вызова методов родителя. Т.е.super.aMethod()
ПРИМЕЧАНИЕ: в первом случае родительский класс должен иметь конструктор без аргументов, в противном случае возникнет ошибка компиляции.
KNU
Nit: Родительская / дочерняя терминология не очень хороша для иерархии классов. (Ребенок не отец.)
aioobe
Существуют ли какие-либо ограничения на использование Super?
Аарон Франке
2
@VivekChavda, конечно, ребенок может быть родителем, точно так же, как ученик может быть учителем и т. Д. Но я думаю, вы понимаете разницу по сравнению с Animal -> Dog например. Собака обязательно животное. Родитель / ребенок, как правило, имеет отношения («Родитель имеет ребенка»), в то время как животное / собака является отношением «является» . См. Aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe
2
@AaronFranke, "Есть ли какие-нибудь ограничения на использование super?" - Да, super(...)может использоваться только как первый оператор в конструкторе.
aioobe
154
Некоторые факты:
super() используется для вызова непосредственного родителя.
super() может использоваться с членами экземпляра, т.е. переменными экземпляра и методами экземпляра.
super() может использоваться в конструкторе для вызова конструктора родительского класса.
Хорошо, теперь давайте практически реализовать эти пункты super().
Обратите внимание на разницу между программой 1 и 2. Здесь программа 2 подтверждает наше первое утверждение super()в Java.
Программа 1
classBase{int a =100;}classSup1extendsBase{int a =200;voidShow(){System.out.println(a);System.out.println(a);}publicstaticvoid main(String[] args){newSup1().Show();}}
Вывод:
200
200
Теперь проверьте программу 2 и попытайтесь выяснить основное отличие.
Программа 2
classBase{int a =100;}classSup2extendsBase{int a =200;voidShow(){System.out.println(super.a);System.out.println(a);}publicstaticvoid main(String[] args){newSup2().Show();}}
Вывод:
100
200
В программе 1 вывод был только производного класса. Не удалось вывести переменную ни базового класса, ни родительского класса. Но в программе 2 мы использовали super()переменную aпри печати ее вывода, и вместо того, чтобы печатать значение переменной aпроизводного класса, она печатала значение переменной aбазового класса. Таким образом, это доказывает, что super()используется для вызова непосредственного родителя.
Хорошо, теперь проверьте разницу между программой 3 и программой 4.
Программа 3
classBase{int a =100;voidShow(){System.out.println(a);}}classSup3extendsBase{int a =200;voidShow(){System.out.println(a);}publicstaticvoidMain(String[] args){newSup3().Show();}}
Вывод:
200
Здесь вывод равен 200. Когда мы вызывали Show(), вызывалась Show()функция производного класса. Но что нам делать, если мы хотим вызвать Show()функцию родительского класса? Проверьте программу 4 для решения.
Программа 4
classBase{int a =100;voidShow(){System.out.println(a);}}classSup4extendsBase{int a =200;voidShow(){super.Show();System.out.println(a);}publicstaticvoidMain(String[] args){newSup4().Show();}}
Вывод:
100
200
Здесь мы получаем два вывода, 100 и 200. Когда Show()вызывается функция производного класса, она сначала вызывает Show()функцию родительского класса, потому что внутри Show()функции производного класса мы вызывали Show()функцию родительского класса, помещая superключевое слово перед именем функции.
Почему вы не сделали отступ в своих примерах исходного кода? Есть ли конкретная причина?
erikbwork
НЕТ Эрикб, я хочу знать, как использовать super (). В дальнейшем только я собираюсь
Мохан
В моем базовом классе я перегружаю конструктор одним, двумя, ... аргументами
Мохан
но в моем производном классе я использую super () без каких-либо аргументов. что произойдет, если он автоматически вызывает конструктор по умолчанию для базового класса
Мохан
2
super()это не ключевое слово. Это вызов конструктора. superявляется ключевым словом, и # 1 и # 2 имеют смысл только с этим определением.
classAnimal{publicAnimal(String arg){System.out.println("Constructing an animal: "+ arg);}}classDogextendsAnimal{publicDog(){super("From Dog constructor");System.out.println("Constructing a dog.");}}publicclassTest{publicstaticvoid main(String[] a){newDog();}}
Печать:
Constructing an animal:FromDog constructor
Constructing a dog.
В моем базовом классе я перегружаю конструктор одним, двумя, ... аргументами, в моем производном классе я использую super () без каких-либо аргументов. что произойдет, если он автоматически вызывает конструктор по умолчанию для базового класса
Мохан
Да. Если вы вызовете super()его, то вызовете конструктор суперкласса, который не принимает аргументов. Точно так же он вызовет конструктор с 1 аргументом, если вы это сделаете super(arg1), и так далее.
2010 года
если в базовом классе не было конструктора без каких-либо аргументов, то что происходит, если производный класс вызывает super ().
Мохан
1
Ничего. Это не скомпилируется. Если вы предоставите конструктор самостоятельно, автоматический / default / no-аргумент-конструктор не будет сгенерирован, поэтому super()не будет допустимым вызовом.
aioobe
29
Это super () используется для вызова родительского конструктора?
Да.
Просьба объяснить про Супер ().
super()это специальное использование superключевого слова, где вы вызываете родительский конструктор без параметров. В общем, superключевое слово может использоваться для вызова переопределенных методов, доступа к скрытым полям или вызова конструктора суперкласса.
super()используется для вызова родительского конструктора, super.myMethod()используется для вызова переопределенного метода.
Шон Патрик Флойд
2
@seanizer или любой другой метод суперкласса (включая статику), если он находится в области видимости. Супер это просто ссылка на ваш базовый класс.
Атаманроман
3
Я не думаю, что super () используется для вызова методов базового класса. Вы можете использовать super.method (), хотя.
Дхирадж Джоши
@seanizer, @Dheeraj: Спасибо за ваш отзыв, я адаптировал свой ответ.
Хайнци
7
Вызов супер-конструктора без аргументов - просто трата экранного пространства и времени программиста. Компилятор генерирует точно такой же код, независимо от того, пишете вы его или нет.
Просто супер (); один вызовет конструктор по умолчанию, если он существует из суперкласса класса. Но вы должны явно написать конструктор по умолчанию самостоятельно. Если у вас нет Java, сгенерируйте его для вас без реализаций, сохраните super (); , ссылаясь на универсальный объект суперкласса, и вы не можете вызвать его в подклассе.
publicclassAlien{publicAlien(){//Default constructor is written out by user/** Implementation not shown…**/}}publicclassWeirdAlienextendsAlien{publicWeirdAlien(){super();//calls the default constructor in Alien.}}
Ключевое слово super в java - это ссылочная переменная, которая используется для ссылки на объекты родительского класса. Он в основном используется в следующих контекстах:
1. Использование супер с переменными:
classVehicle{int maxSpeed =120;}/* sub class Car extending vehicle */classCarextendsVehicle{int maxSpeed =180;void display(){/* print maxSpeed of base class (vehicle) */System.out.println("Maximum Speed: "+super.maxSpeed);}}/* Driver program to test */classTest{publicstaticvoid main(String[] args){Car small =newCar();
small.display();}}
Вывод:-
MaximumSpeed:120
Использование супер с методами:
/* Base class Person */classPerson{void message(){System.out.println("This is person class");}}/* Subclass Student */classStudentextendsPerson{void message(){System.out.println("This is student class");}// Note that display() is only in Student class void display(){// will invoke or call current class message() method
message();// will invoke or call parent class message() method super.message();}}/* Driver program to test */classTest{publicstaticvoid main(String args[]){Student s =newStudent();// calling display() of Student
s.display();}}
Вывод:-
This is student classThis is person class
3. Использование супер с конструкторами:
classPerson{Person(){System.out.println("Person class Constructor");}}/* subclass Student extending the Person class */classStudentextendsPerson{Student(){// invoke or call parent class constructor super();System.out.println("Student class Constructor");}}/* Driver program to test*/classTest{publicstaticvoid main(String[] args){Student s =newStudent();}}
Конструкторы
В конструкторе вы можете использовать его без точки для вызова другого конструктора. superвызывает конструктор в суперклассе; thisвызывает конструктор в этом классе:
publicMyClass(int a){this(a,5);// Here, I call another one of this class's constructors.}publicMyClass(int a,int b){super(a, b);// Then, I call one of the superclass's constructors.}
superполезно, если суперкласс должен инициализировать себя. thisполезно, чтобы вы могли писать весь жесткий код инициализации только один раз в одном из конструкторов и вызывать его из всех других, гораздо более простых в написании конструкторов.
Методы
В любом методе вы можете использовать его с точкой для вызова другого метода. super.method()вызывает метод в суперклассе; this.method()вызывает метод в этом классе:
publicString toString(){int hp =this.hitpoints();// Calls the hitpoints method in this class// for this object.String name =super.name();// Calls the name method in the superclass// for this object.return"["+ name +": "+ hp +" HP]";}
superполезно в определенном сценарии: если ваш класс имеет тот же метод, что и ваш суперкласс, Java предполагает, что вы хотите использовать тот же класс в своем классе; superпозволяет вместо этого запросить метод суперкласса. thisполезен только как способ сделать ваш код более читабельным.
Супер можно использовать ключевое слово для вызова конструктора суперкласса и обратиться к члену суперкласса
Когда вы вызываете super () с правильными аргументами, мы фактически вызываем конструктор Box , который инициализирует переменные ширины , высоты и глубины , на которые ссылаются, используя значения соответствующих параметров. Вам остается только инициализировать его добавленную стоимость. При необходимости вы можете теперь делать переменные класса Box как приватные . Заполните поля приватного модификатора класса Box и убедитесь, что вы можете получить к ним доступ без проблем.
У суперкласса может быть несколько перегруженных конструкторов версий, поэтому вы можете вызывать метод super () с разными параметрами. Программа выполнит конструктор, который соответствует указанным аргументам.
супер это ключевое слово. Он используется внутри определения метода подкласса для вызова метода, определенного в суперклассе. Частные методы суперкласса не могут быть вызваны. Только ключевое слово super может вызывать только открытые и защищенные методы. Он также используется конструкторами классов для вызова конструкторов его родительского класса.
Как уже говорилось, внутри конструктора по умолчанию есть неявный super (), вызываемый в первой строке конструктора.
Это super () автоматически вызывает цепочку конструкторов, начиная с верхней части иерархии классов, и перемещается вниз по иерархии.
Если бы в иерархии классов программы было более двух классов, сначала вызывался бы конструктор высшего класса по умолчанию .
Вот пример этого:
class A {
A(){System.out.println("Constructor A");}}class B extends A{public B(){System.out.println("Constructor B");}}class C extends B{public C(){System.out.println("Constructor C");}publicstaticvoid main(String[] args){
C c1 =new C();}}
Ответы:
super()
вызывает родительский конструктор без аргументов.Может использоваться и с аргументами. Т.е.
super(argument1)
и он будет вызывать конструктор, который принимает 1 параметр типаargument1
(если существует).Также его можно использовать для вызова методов родителя. Т.е.
super.aMethod()
Больше информации и учебник здесь
источник
super(...)
может использоваться только как первый оператор в конструкторе.Некоторые факты:
super()
используется для вызова непосредственного родителя.super()
может использоваться с членами экземпляра, т.е. переменными экземпляра и методами экземпляра.super()
может использоваться в конструкторе для вызова конструктора родительского класса.Хорошо, теперь давайте практически реализовать эти пункты
super()
.Обратите внимание на разницу между программой 1 и 2. Здесь программа 2 подтверждает наше первое утверждение
super()
в Java.Программа 1
Вывод:
Теперь проверьте программу 2 и попытайтесь выяснить основное отличие.
Программа 2
Вывод:
В программе 1 вывод был только производного класса. Не удалось вывести переменную ни базового класса, ни родительского класса. Но в программе 2 мы использовали
super()
переменнуюa
при печати ее вывода, и вместо того, чтобы печатать значение переменнойa
производного класса, она печатала значение переменнойa
базового класса. Таким образом, это доказывает, чтоsuper()
используется для вызова непосредственного родителя.Хорошо, теперь проверьте разницу между программой 3 и программой 4.
Программа 3
Вывод:
Здесь вывод равен 200. Когда мы вызывали
Show()
, вызываласьShow()
функция производного класса. Но что нам делать, если мы хотим вызватьShow()
функцию родительского класса? Проверьте программу 4 для решения.Программа 4
Вывод:
Здесь мы получаем два вывода, 100 и 200. Когда
Show()
вызывается функция производного класса, она сначала вызываетShow()
функцию родительского класса, потому что внутриShow()
функции производного класса мы вызывалиShow()
функцию родительского класса, помещаяsuper
ключевое слово перед именем функции.источник
super()
это не ключевое слово. Это вызов конструктора.super
является ключевым словом, и # 1 и # 2 имеют смысл только с этим определением.Исходная статья: Java: Вызов super ()
Да.
super(...)
вызовет конструктор суперкласса.Иллюстрация:
Автономный пример:
Печать:
источник
super()
его, то вызовете конструктор суперкласса, который не принимает аргументов. Точно так же он вызовет конструктор с 1 аргументом, если вы это сделаетеsuper(arg1)
, и так далее.super()
не будет допустимым вызовом.Да.
super()
это специальное использованиеsuper
ключевого слова, где вы вызываете родительский конструктор без параметров. В общем,super
ключевое слово может использоваться для вызова переопределенных методов, доступа к скрытым полям или вызова конструктора суперкласса.Вот официальный учебник
источник
super()
используется для вызова родительского конструктора,super.myMethod()
используется для вызова переопределенного метода.Вызов супер-конструктора без аргументов - просто трата экранного пространства и времени программиста. Компилятор генерирует точно такой же код, независимо от того, пишете вы его или нет.
источник
Да,
super()
(нижний регистр) вызывает конструктор родительского класса. Вы можете включить аргументы:super(foo, bar)
Существует также
super
ключевое слово, которое вы можете использовать в методах для вызова метода суперкласса.Быстрый Google для "Java Super" приводит к этому
источник
Это верно. Super используется для вызова родительского конструктора. Итак, предположим, у вас есть блок кода, как это
Затем вы можете присвоить значение переменной-члену n.
источник
Я видел все ответы. Но все забыли упомянуть один очень важный момент:
super () должен вызываться или использоваться в первой строке конструктора.
источник
Просто супер (); один вызовет конструктор по умолчанию, если он существует из суперкласса класса. Но вы должны явно написать конструктор по умолчанию самостоятельно. Если у вас нет Java, сгенерируйте его для вас без реализаций, сохраните super (); , ссылаясь на универсальный объект суперкласса, и вы не можете вызвать его в подклассе.
источник
Например, в автоматизации селена у вас есть PageObject, который может использовать конструктор своего родителя следующим образом:
источник
Я хотел бы поделиться с кодами, что я понял.
Ключевое слово super в java - это ссылочная переменная, которая используется для ссылки на объекты родительского класса. Он в основном используется в следующих контекстах:
1. Использование супер с переменными:
Вывод:-
Вывод:-
3. Использование супер с конструкторами:
Вывод:-
источник
Конструкторы
В конструкторе вы можете использовать его без точки для вызова другого конструктора.
super
вызывает конструктор в суперклассе;this
вызывает конструктор в этом классе:super
полезно, если суперкласс должен инициализировать себя.this
полезно, чтобы вы могли писать весь жесткий код инициализации только один раз в одном из конструкторов и вызывать его из всех других, гораздо более простых в написании конструкторов.Методы
В любом методе вы можете использовать его с точкой для вызова другого метода.
super.method()
вызывает метод в суперклассе;this.method()
вызывает метод в этом классе:super
полезно в определенном сценарии: если ваш класс имеет тот же метод, что и ваш суперкласс, Java предполагает, что вы хотите использовать тот же класс в своем классе;super
позволяет вместо этого запросить метод суперкласса.this
полезен только как способ сделать ваш код более читабельным.источник
Супер можно использовать ключевое слово для вызова конструктора суперкласса и обратиться к члену суперкласса
Когда вы вызываете super () с правильными аргументами, мы фактически вызываем конструктор Box , который инициализирует переменные ширины , высоты и глубины , на которые ссылаются, используя значения соответствующих параметров. Вам остается только инициализировать его добавленную стоимость. При необходимости вы можете теперь делать переменные класса Box как приватные . Заполните поля приватного модификатора класса Box и убедитесь, что вы можете получить к ним доступ без проблем.
У суперкласса может быть несколько перегруженных конструкторов версий, поэтому вы можете вызывать метод super () с разными параметрами. Программа выполнит конструктор, который соответствует указанным аргументам.
источник
супер это ключевое слово. Он используется внутри определения метода подкласса для вызова метода, определенного в суперклассе. Частные методы суперкласса не могут быть вызваны. Только ключевое слово super может вызывать только открытые и защищенные методы. Он также используется конструкторами классов для вызова конструкторов его родительского класса.
Проверьте здесь для дальнейшего объяснения.
источник
Как уже говорилось, внутри конструктора по умолчанию есть неявный super (), вызываемый в первой строке конструктора.
Это super () автоматически вызывает цепочку конструкторов, начиная с верхней части иерархии классов, и перемещается вниз по иерархии.
Если бы в иерархии классов программы было более двух классов, сначала вызывался бы конструктор высшего класса по умолчанию .
Вот пример этого:
Выше будет выводить:
источник