Tôi biết từ ngữ hơi khó hiểu và kỳ lạ, nhưng phải chịu đựng tôi, tôi không biết làm sao để cụm từ ngắn hơn.Trong Java, bạn có thể gọi hàm tạo siêu lớp của lớp cha thông qua hàm tạo của lớp con của lớp cha không?
Giả sử bạn có một lớp được gọi là SuperBlah
, và bạn thừa hưởng nó trong một lớp được gọi là Blah
sau đó bạn thừa hưởng Blah
thành một lớp được gọi là ChildBlah
(Vì vậy SuperBlah-Blah-ChildBlah
). Sẽ từ khóa super();
sử dụng trong ChildBlah
'constructor s gọi là SuperBlah
' constructor s nếu Blah
không có một constructor?
Đối với những người bạn nói không, thì tại sao điều này lại hiệu quả? Chúng ta có một lớp được gọi là BlusterBug mở rộng lớp Critter và gọi siêu trong trình xây dựng của BlusterBug. Critter không có một hàm tạo, nhưng lớp mà Critter mở rộng không có một hàm tạo. (Tôi cố tình bỏ qua phần còn lại của mã trên các lớp học)
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;
}
Sau đó, trong lớp Critter, nó không có bất kỳ nhà thầu nào!
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);
}
Nhưng sau đó lớp diễn viên có hàm tạo!
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;
}
Và phần lạ nhất? Chương trình làm việc hoàn toàn tốt đẹp và trình biên dịch không làm bắt bất kỳ lỗi! Làm thế nào điều này xảy ra?
Loại câu hỏi này thực sự được trả lời tốt nhất bằng cách chỉ viết các lớp với các câu lệnh in và kiểm tra. Tôi nghĩ rằng bạn có thể nhận được câu trả lời của bạn trong ít hơn 30 dòng mã, và bạn có thể tìm hiểu rất nhiều chi tiết. – merlin2011
** Mọi lớp Java đều có ít nhất một hàm tạo. Nếu nó không khai báo một hàm tạo, nó có một hàm tạo mặc định không nhận tham số và chỉ chứa một lệnh gọi 'super();'. –