Чи super()
використовується для виклику батьківського конструктора? Будь ласка, поясніть super()
.
Чи super()
використовується для виклику батьківського конструктора? Будь ласка, поясніть super()
.
Відповіді:
super()
викликає батьківський конструктор без аргументів.
Він може бути використаний і з аргументами. Тобто super(argument1)
він викличе конструктор, який приймає 1 параметр типу argument1
(якщо він існує).
Також його можна використовувати для виклику методів від батьківського. Тобтоsuper.aMethod()
Більше інформації та підручника тут
super(...)
може використовуватися лише в якості першого твердження в конструкторі.
Деякі факти:
super()
використовується для виклику безпосереднього батька.super()
може використовуватися з членами екземпляра, тобто змінними екземпляра та методами екземплярів.super()
може використовуватися в конструкторі для виклику конструктора батьківського класу.Гаразд, тепер практично реалізуємо ці моменти super()
.
Перевірте різницю між програмою 1 та 2. Тут програма 2 підтверджує наше перше твердження super()
на Java.
Програма 1
class Base
{
int a = 100;
}
class Sup1 extends Base
{
int a = 200;
void Show()
{
System.out.println(a);
System.out.println(a);
}
public static void main(String[] args)
{
new Sup1().Show();
}
}
Вихід:
200
200
Тепер перегляньте програму 2 і спробуйте з'ясувати головну відмінність.
Програма 2
class Base
{
int a = 100;
}
class Sup2 extends Base
{
int a = 200;
void Show()
{
System.out.println(super.a);
System.out.println(a);
}
public static void main(String[] args)
{
new Sup2().Show();
}
}
Вихід:
100
200
У програмі 1 вихід був лише з похідного класу. Він не міг надрукувати змінну ні базового, ні батьківського класу. Але в програмі 2 ми використовували super()
змінну a
під час друку її виводу, і замість того, щоб друкувати значення змінної a
похідного класу, вона друкувала значення змінної a
базового класу. Так це доводить, що super()
використовується для виклику безпосереднього батька.
Гаразд, перевірте різницю між програмою 3 та програмою 4.
Програма 3
class Base
{
int a = 100;
void Show()
{
System.out.println(a);
}
}
class Sup3 extends Base
{
int a = 200;
void Show()
{
System.out.println(a);
}
public static void Main(String[] args)
{
new Sup3().Show();
}
}
Вихід:
200
Тут результат - 200. Коли ми викликали Show()
, Show()
була викликана функція похідного класу. Але що робити, якщо ми хочемо викликати Show()
функцію батьківського класу? Ознайомтеся з програмою 4 рішення.
Програма 4
class Base
{
int a = 100;
void Show()
{
System.out.println(a);
}
}
class Sup4 extends Base
{
int a = 200;
void Show()
{
super.Show();
System.out.println(a);
}
public static void Main(String[] args)
{
new Sup4().Show();
}
}
Вихід:
100
200
Тут ми отримуємо два виходи, 100 і 200. Коли Show()
викликається функція похідного класу, він спочатку викликає Show()
функцію батьківського класу, тому що всередині Show()
функції похідного класу ми називали Show()
функцію батьківського класу, ставлячи super
ключове слово перед ім'ям функції.
super()
не є ключовим словом. Це виклик конструктора. super
є ключовим словом, і №1 і №2 має сенс тільки з цим визначенням.
Стаття джерела: Java: Calling super ()
Так. super(...)
викличе конструктор суперкласу.
Ілюстрація:
class Animal {
public Animal(String arg) {
System.out.println("Constructing an animal: " + arg);
}
}
class Dog extends Animal {
public Dog() {
super("From Dog constructor");
System.out.println("Constructing a dog.");
}
}
public class Test {
public static void main(String[] a) {
new Dog();
}
}
Друкує:
Constructing an animal: From Dog constructor
Constructing a dog.
super()
його зателефонуєте , викличе конструктор суперкласу, який не бере аргументів. Аналогічно, він буде викликати конструктор з 1 аргументом, якщо ви це зробите super(arg1)
тощо.
super()
, не буде дійсним викликом.
Чи використовується super () для виклику батьківського конструктора?
Так.
Поясніть про Super ().
super()
- це особливе використання super
ключового слова, де ви викликаєте батьківський конструктор без параметрів. Загалом, super
ключове слово може використовуватися для виклику перекритих методів, доступу до прихованих полів або виклику конструктора надкласового класу.
super()
використовується для виклику батьківського конструктора, super.myMethod()
використовується для виклику методу, що перекривається.
Виклик суперконструктора без аргументів - це лише витрата простору на екрані та часу програміста. Компілятор генерує абсолютно той самий код, незалежно від того, пишете ви його чи ні.
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
Я бачив усі відповіді. Але всі забули згадати один дуже важливий момент:
super () слід викликати або використовувати в першому рядку конструктора.
Просто супер (); поодинці викличуть конструктор за замовчуванням, якщо він існує в суперкласі класу. Але ви повинні чітко написати конструктор за замовчуванням самостійно. Якщо ви не Java буде генерувати такий для вас без реалізації, збережіть super (); , посилаючись на універсальний об'єкт надкласового класу, і ви не можете його назвати підкласом.
public class Alien{
public Alien(){ //Default constructor is written out by user
/** Implementation not shown…**/
}
}
public class WeirdAlien extends Alien{
public WeirdAlien(){
super(); //calls the default constructor in Alien.
}
}
Я хотів би поділитися з кодами все, що я зрозумів.
Супер ключове слово в java - це посилальна змінна, яка використовується для позначення об'єктів батьківського класу. Він в основному використовується в таких контекстах:
1. Використання супер із змінними:
class Vehicle
{
int maxSpeed = 120;
}
/* sub class Car extending vehicle */
class Car extends Vehicle
{
int maxSpeed = 180;
void display()
{
/* print maxSpeed of base class (vehicle) */
System.out.println("Maximum Speed: " + super.maxSpeed);
}
}
/* Driver program to test */
class Test
{
public static void main(String[] args)
{
Car small = new Car();
small.display();
}
}
Вихід: -
Maximum Speed: 120
/* Base class Person */
class Person
{
void message()
{
System.out.println("This is person class");
}
}
/* Subclass Student */
class Student extends Person
{
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 */
class Test
{
public static void main(String args[])
{
Student s = new Student();
// calling display() of Student
s.display();
}
}
Вихід: -
This is student class
This is person class
3. Використання супер з конструкторами:
class Person
{
Person()
{
System.out.println("Person class Constructor");
}
}
/* subclass Student extending the Person class */
class Student extends Person
{
Student()
{
// invoke or call parent class constructor
super();
System.out.println("Student class Constructor");
}
}
/* Driver program to test*/
class Test
{
public static void main(String[] args)
{
Student s = new Student();
}
}
Вихід: -
Person class Constructor
Student class Constructor
Конструктори
У конструкторі ви можете використовувати його без крапки для виклику іншого конструктора. super
викликає конструктор у надкласі; this
викликає конструктор цього класу:
public MyClass(int a) {
this(a, 5); // Here, I call another one of this class's constructors.
}
public MyClass(int a, int b) {
super(a, b); // Then, I call one of the superclass's constructors.
}
super
є корисним, якщо надкласові необхідно ініціалізувати себе. this
корисно, щоб ви могли записати весь жорсткий код ініціалізації лише один раз в один з конструкторів і викликати його від усіх інших, набагато простіших для запису конструкторів.
Методи
У будь-якому методі ви можете використовувати його з крапкою для виклику іншого методу. super.method()
викликає метод у надкласі; this.method()
називає метод цього класу:
public String 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 () з різними параметрами. Програма виконає конструктор, який відповідає заданим аргументам.
public class Box {
int width;
int height;
int depth;
Box(int w, int h, int d) {
width = w;
height = h;
depth = d;
}
public static void main(String[] args){
HeavyBox heavy = new HeavyBox(12, 32, 23, 13);
}
}
class HeavyBox extends Box {
int weight;
HeavyBox(int w, int h, int d, int m) {
//call the superclass constructor
super(w, h, d);
weight = m;
}
}
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");
}
public static void main(String[] args) {
C c1 = new C();
}
}
Наведене вище:
Constructor A
Constructor B
Constructor C