2012-12-19 11 views
5

Tôi có một cầu thủ đẳng cấp mà kéo dài Entity:Java đối số thực tế không phù hợp với lập luận chính thức, nhưng họ làm gì?

Player:

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

Entity:

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

này là khá nhiều những gì bạn mong muốn, nhưng trên biên dịch Tôi gặp lỗi khi đọc

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 

Nhưng rõ ràng là có các đối số bắt buộc. Những gì đang xảy ra ở đây? Cảm ơn!

+7

Tại sao bạn không làm 'siêu (chat, int, int)'? – GGrec

Trả lời

13

Bạn cần phải khởi tạo siêu lớp bằng gọi constructor của nó với super

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

Trình tạo lớp siêu của bạn có 3 đối số và dường như không có hàm tạo trống. Vì vậy, constructor subclass của bạn nên thực hiện một cuộc gọi rõ ràng đến constructor super class truyền các giá trị.

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

Bạn cần phải gọi constructor của lớp cơ sở explicitely từ constructor của lớp mở rộng. Bạn làm điều đó như thế:

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

Không có cuộc gọi rõ ràng để một constructor siêu (như trong câu trả lời khác hoặc thấp hơn) để VM sẽ sử dụng một constructor ngầm 0-arg ... nhưng constructor này không không tồn tại. Vì vậy, bạn phải thực hiện cuộc gọi rõ ràng tới một nhà xây dựng siêu hợp lệ:

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

Khi lớp con kế thừa lớp cha, thì hàm tạo mặc định của lớp cha được gọi theo mặc định. Trong trường hợp trên bạn đã xác định hàm tạo tham số trong lớp cha mẹ nên mặc định không được JVM cung cấp và lớp con của bạn đang gọi hàm dựng mặc định gốc không tồn tại ở đó. Hoặc chỉ định hàm tạo mặc định trong lớp cha hoặc gọi hàm tạo tham số của cha mẹ bằng cách sử dụng siêu.

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

HOẶC

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