2015-11-21 17 views
7

Tôi tò mò muốn biết điều gì thực sự xảy ra đằng sau hậu trường khi bạn sử dụng super() để gọi một hàm tạo của lớp siêu. Khi một đối tượng được khởi tạo từ lớp con, lớp con có kế thừa đối tượng lớp siêu không? hoặc nó hoạt động như thế nào?Điều gì đang xảy ra phía sau hậu trường khi bạn sử dụng siêu()

Đây là mã của tôi để tham khảo:

public class Bicycle { 
//Declaring bicycles states 
public int movSpeed = 0; 
public int cadence = 0; 
public int curGear = 0; 

//Class constructor 
public Bicycle(){ 
} 

//Class constructor with params 
public Bicycle(int movSpeed, int cadence, int curGear) { 
    this.movSpeed = movSpeed; 
    this.cadence = cadence; 
    this.curGear = curGear; 
} 

Subclass:

public class mountainBike extends Bicycle { 
//Declare mountainBikes states 
public int frontTravel = 0; 
public int rearTravel = 0; 
public int gearMult = 0; 

//Class constructor 
public mountainBike(){ 
} 

//Class constructor with params 
public mountainBike(int movSpeed, int cadence, int curGear, int frontTravel, int rearTravel,int gearMult){ 
    super(movSpeed,cadence,curGear); 
    this.frontTravel = frontTravel; 
    this.rearTravel = rearTravel; 
    this.gearMult = gearMult; 
} 
+0

Về mặt kỹ thuật 'mountainBike' của bạn (vui lòng sử dụng [UpperCamelCase] ​​(https://en.wikipedia.org/wiki/CamelCase) cho lớp) là một 'Xe đạp', gọi' siêu (args ...) ' cho bạn biết rằng hàm tạo cụ thể được gọi. Nếu bạn không gọi 'super()' có hoặc không có args thì hàm khởi tạo mặc định sẽ được gọi. – Emz

+1

Tôi cho rằng bạn khá mới đối với Java nên tôi cũng muốn chỉ ra [giá trị mặc định nguyên thủy] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html), không có lý do thực sự để đặt giá trị của 'frontTravel',' rearTravel' thành '0', vì điều đó được thực hiện tự động. – Emz

+0

Kiểm tra _Head Java_ đầu tiên để tham khảo (chương 9, ["Vai trò của các nhà xây dựng siêu lớp trong cuộc sống của đối tượng"] (http://tinyurl.com/usingSuper)). – Eugene

Trả lời

5

Không có đối tượng và lớp con siêu đối tượng. Chỉ cần một đối tượng với các trường được khai báo trong lớp con ngoài các trường có thể được kế thừa từ lớp cha.

Khi super được gọi, JVM gọi hàm khởi tạo của lớp cha để khởi tạo các trường được kế thừa từ lớp cha. Phía sau hậu trường, hàm khởi tạo dịch sang lệnh JVM có tên là <init> gán giá trị cho các trường.

Vì vậy, bằng trực giác bạn bạn có thể nghĩ về nó như một cái gì đó như:

public mountainBike(int movSpeed, int cadence, int curGear, int frontTravel, int rearTravel,int gearMult) { 
    // an object is created here 
    // call the super constructor special method <init> 
    // which initializes the inherited fields movSpeed, cadence, and curGear 
    // initialize the below fields 
    this.frontTravel = frontTravel; 
    this.rearTravel = rearTravel; 
    this.gearMult = gearMult; 
} 
0

Cảm ơn câu trả lời! Tôi chỉ muốn rời khỏi một số resource Tôi đã xem qua điều này khá tốt cho bất kỳ ai xem câu hỏi này.

Chúng tôi đã thấy rằng một đối tượng thuộc loại dữ liệu của lớp từ mà nó được khởi tạo. Ví dụ: nếu chúng tôi viết

công khai MountainBike myBike = new MountainBike(); sau đó myBike là của loại MountainBike.

MountainBike là hậu duệ của xe đạp và vật thể. Do đó, MountainBike là Xe đạp và cũng là một đối tượng, và nó có thể được sử dụng bất cứ nơi nào xe đạp hoặc đối tượng đối tượng được gọi cho.

Điều ngược lại không nhất thiết phải đúng: Xe đạp có thể là MountainBike, nhưng không nhất thiết phải như vậy. Tương tự, một đối tượng có thể là Xe đạp hoặc MountainBike, nhưng không nhất thiết phải như vậy.

Các vấn đề liên quan