So che la formulazione è un po 'confusa e strana, ma abbiate pazienza con me, non ho idea di come si possa esprimere una frase più breve.In Java, è possibile chiamare il costruttore della superclasse di una classe genitore tramite il costruttore della classe figlio della classe genitore?
Diciamo che avete una classe chiamata SuperBlah
, e si ereditato in una classe denominata Blah
allora avete ereditato Blah
in una classe chiamata ChildBlah
(So SuperBlah-Blah-ChildBlah
). La parola chiave super();
utilizzata nel costruttore ChildBlah
è chiamata costruttore di SuperBlah
se Blah
non ha un costruttore?
Per quelli di voi che hanno detto no, allora perché funziona? Abbiamo una classe chiamata BlusterBug che estende la classe Critter e chiama il super nel costruttore di BlusterBug. Critter non ha un costruttore, ma la classe che Critter estende ha un costruttore. (I volutamente omesso il resto del codice sulle classi)
public class BlusterCritter extends Critter {
// instance vaiables
private int courageFactor;
private static final double DARKENING_FACTOR = 0.05;
// create a constructor(include what is necesary for parent)
public BlusterCritter(int c)
{
super();
courageFactor = c;
}
Poi nella classe Critter, non ha alcun costruttore!
public class Critter extends Actor// omitted all the code
{
/**
* A critter acts by getting a list of other actors, processing that list,
* getting locations to move to, selecting one of them, and moving to the
* selected location.
*/
public void act()
{
if (getGrid() == null)
return;
ArrayList<Actor> actors = getActors();
processActors(actors);
ArrayList<Location> moveLocs = getMoveLocations();
Location loc = selectMoveLocation(moveLocs);
makeMove(loc);
}
Ma poi la classe attore ha un costruttore!
public class Actor
{
private Grid<Actor> grid;
private Location location;
private int direction;
private Color color;
/**
* Constructs a blue actor that is facing north.
*/
public Actor()
{
color = Color.BLUE;
direction = Location.NORTH;
grid = null;
location = null;
}
E la parte più strana? Il programma funziona perfettamente e il compilatore non rileva errori! Come sta succedendo?
Questo tipo di domanda è davvero la risposta migliore solo scrivendo le classi con le dichiarazioni di stampa e test. Penso che potresti ottenere la tua risposta in meno di 30 righe di codice e potresti imparare molti dettagli. – merlin2011
** Ogni ** classe Java ha almeno un costruttore. Se non dichiara un costruttore, ha un costruttore predefinito che non accetta parametri e contiene solo una chiamata 'super();'. –