Нет ли необходимости ставить super () в конструктор?


разве это не автоматически помещается компилятором, если я не помещаю его в конструктор подкласса?

Это означает, что мне даже не нужно заботиться об этом? В некоторых статьях они его потушили.

и если у меня есть один конструктор с аргументами, будет ли это конструктор, или он принимает конструктор без списка аргументов?

7 143

7 ответов:

во-первых с терминологией:

  • никакой-args конструктор: конструктор без параметров;
  • доступный конструктор без аргументов: конструктор no-args в суперклассе, видимом для подкласса. Это означает, что он либо общедоступен, либо защищен, либо, если оба класса находятся в одном пакете, доступ к пакету; и
  • конструктор по умолчанию: публичный конструктор no-args, добавленный компилятором, когда нет явный конструктор в классе.

так что все классы имеют по крайней мере один конструктор.

подклассы конструкторы мая укажите как первое, что они делают, какой конструктор в суперклассе вызывать перед выполнением кода в конструкторе подкласса.

если конструктор подкласса не указывает, какой конструктор суперкласса вызывать, то компилятор автоматически вызовет доступный конструктор no-args в надкласс.

если суперкласс не имеет конструктора no-arg или он недоступен, то не указание вызываемого конструктора суперкласса (в конструкторе подкласса) является ошибкой компилятора, поэтому он должны быть указаны.

например:

public class Base { }
public class Derived extends Base { }

это нормально, потому что если вы не добавляете конструктор явно Java помещает в открытый конструктор по умолчанию для вас.

public class Base { }
public class Derived extends Base { public Derived(int i) { } }

тоже нормально.

public class Base { public Base(String s) { } }
public class Derived extends Base { }

в выше - ошибка компиляции, поскольку база не имеет конструктора по умолчанию.

public class Base { private Base() { } }
public class Derived extends Base { }

Это также ошибка, потому что конструктор No-args базы является частным.

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

src:http://java.sun.com/docs/books/tutorial/java/IandI/super.html

вызов супер конструктора без аргументов - это просто пустая трата пространства экрана и времени программиста. Компилятор генерирует точно такой же код, независимо от того, пишете вы его или нет.

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}

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

Главная

public class Main {

    public static void main(String[] args) {
        A a = new B();
    }
}

A

public class A {

    public A() {
        System.out.println("A");
    }
}

B

public class B extends A {

    public B() {
        System.out.println("B");
    }
}

печать

A
B

Если ваш метод переопределяет один из методов своего суперкласса, вы можете вызвать переопределенный метод с помощью ключевого слова Super.

синтаксис вызова конструктора суперкласса

super();  
--or--
super(parameter list);

С помощью super () вызывается конструктор без аргументов суперкласса. С помощью super (parameter list) вызывается конструктор суперкласса с соответствующим списком параметров.

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

любой конструктор класса всегда вызывает " super ()", если явно не вызывается super ([аргументы]), только мы учитываем доступ конструктора суперкласса при программировании... когда мы не расширяем какой-либо конкретный класс автоматически расширяет java.ленг.Класс объекта

abstract class Book
 {
String title;
String author;
Book(String t,String a){
    title=t;
    author=a;
}
abstract void display();

}    

Если суперкласс может иметь конструктор без аргументов. хорошо иметь конструктор без аргументов, иначе вам нужно передать супер конструктор с параметром .

Если суперкласс не имеет конструктора no-arg или он недоступен, то не указание вызываемого конструктора суперкласса (в конструкторе подкласса) является ошибкой компилятора, поэтому он должен быть указан

class MyBook extends Book{   
int price ;
public  MyBook(String t,String a,int price){
     super(t,a);
    this.price=price;
}

public void display(){
    System.out.println("Title: "+title);
 System.out.println("Author: "+author); 
System.out.println("Price: "+price);

}

}