2012-12-19 10 views
5

mam klasę postaci, która rozciąga się jednostki:Faktyczne argumenty Java nie pasują do formalnych argumentów, ale robią to?

gracza:

public class Player extends Entity { 
    public Player(char initIcon, int initX, int initY) { 
     //empty constructor 
    } 
... 

Podmiot:

public Entity(char initIcon, int initX, int initY) { 
     icon = initIcon; 
     x = initX; 
     y = initY; 
    } 
... 

To jest dość dużo, co można się spodziewać, ale na kompilacji Wystąpił błąd, który brzmi:

Player.java:2: error: constructor Entity in class Entity cannot be applied to the given types: 
    public Player(char initIcon, int initX, int initY) 
required: char,int,int 
found: no arguments 
reason: actual and formal argument lists differ in length 

Ale wyraźnie ma wymagane argumenty. Co tu się dzieje? Dzięki!

+7

Dlaczego nie robisz 'super (czat, int, int)'? – GGrec

Odpowiedz

13

Trzeba zainicjować super klasy przez wywołać jej konstruktora z super

public Player(char initIcon, int initX, int initY) { 
    super(initIcon, initX, initY); 
} 
7

Twój super-klasa konstruktor ma 3 argumenty i nie ma pustego konstruktora. Zatem twój konstruktor podklasy powinien wykonać jawne wywołanie konstruktora klasy super, przekazującego wartości.

public class Player extends Entity { 
    public Player(char initIcon, int initX, int initY) { 
     //empty constructor 
     super(initIcon,initX,initY); 
    } 
... 
2

Trzeba wywołać konstruktor klasy bazowej jawnie od konstruktora klasy rozciągającej. Robisz to tak:

public class Player extends Entity { 
    public Player(char initIcon, int initX, int initY) { 
     super(initIcon, initX, initY); 
     // rest of player-specific constructor 
    } 
2

Nie ma wyraźne wezwanie do super konstruktora (jak pokazano w innych odpowiedzi lub poniżej) więc VM użyje niejawny 0-Arg konstruktora ... ale to konstruktor robi nie istnieje. Więc trzeba zrobić wyraźne wezwanie do ważnego super-konstruktora:

public class Player extends Entity { 
    public Player(char initIcon, int initX, int initY) { 
     super(initIcon,initX,initY); 
    } 
0

Kiedy klasa Dziecko dziedziczy klasa dominująca wówczas domyślnego konstruktora klasy nadrzędnej nazywany jest domyślnie. W powyższym przypadku zdefiniowałeś konstruktora parametrycznego w klasie nadrzędnej, więc domyślna wartość nie jest dostarczana przez maszynę JVM, a twoja klasa podrzędna wywołuje domyślny konstruktor domyślny, który tam nie istnieje. Określ domyślny konstruktor w klasie nadrzędnej lub wywołaj konstruktor parametryczny obiektu nadrzędnego, używając polecenia super.

public class Player extends Entity { 
public Player() 
{} 
public Player(char initIcon, int initX, int initY) { 
    //empty constructor 
} 

LUB

public Player 
(char initIcon, int initX, int initY) { 
super(initIcon, initX, initY); 
}