Нет необходимости помещать super () в конструктор?
разве это не автоматически помещается компилятором, если я не помещаю его в конструктор подкласса?
Это означает, что мне даже не нужно заботиться об этом? В некоторых статьях об этом пишут.
и если у меня есть один конструктор с аргументами, будет ли это конструктор, или он принимает конструктор без списка аргументов?
7 ответов
во-первых с терминологией:
- конструктор No-args: конструктор без параметров;
- доступный конструктор no-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 { }
в выше приведена ошибка компиляции, поскольку Base не имеет конструктора по умолчанию.
public class Base { private Base() { } }
public class Derived extends Base { }
Это также ошибка, потому что конструктор Base no-args является частным.
Если конструктор супер класса не имеет аргументов, Java автоматически вызывает его для вас. Если у него есть аргументы, вы получите ошибку.
src:http://java.sun.com/docs/books/tutorial/java/IandI/super.html
вызов супер конструктора без аргументов - это просто пустая трата пространства экрана и времени программиста. Компилятор генерирует точно такой же код, независимо от того, пишете вы его или нет.
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
родительский конструктор по умолчанию вызывается из дочернего конструктора по умолчанию, даже если вы его не вызываете.
Main
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 (список параметров) вызывается конструктор суперкласса с соответствующим списком параметров.
Примечание: Если конструктор явно не вызывает конструктор суперкласса, Компилятор Java автоматически вставляет вызов конструктора без параметров суперкласса. Если у суперкласса нет конструктора без аргументов, вы получите ошибку времени компиляции. У Object есть такой конструктор, поэтому, если Object является единственным суперклассом, проблем нет.
любой конструктор класса всегда вызывает " super ()", если нет явного вызова super ([arguments]), только мы учитываем доступ конструктора супер класса при программировании... когда мы не расширяем какой-либо конкретный класс, автоматический расширяет java.ленг.Класс объектов
abstract class Book
{
String title;
String author;
Book(String t,String a){
title=t;
author=a;
}
abstract void display();
}
Если супер класс может иметь конструктор No-args .Хорошо иметь конструктор без аргументов, иначе вам придется передать супер конструктор с параметром .
Если у суперкласса нет конструктора 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);
}
}