Lớp dẫn xuất kế thừa mọi thành phần của lớp cơ, điều này dẫn ta đến một hỡnh dung, là lớp dẫn xuất cú cựng giao diện với lớp cơ sở và cú thể cú cỏc thành phần mới bổ sung thờm. nhưng thực tế khụng phải vậy, kế thừa khụng chỉ là sao chộp giao diện của lớp của lớp cơ sở. Khi ta tạo ra một đối tượng của lớp suy dẫn, thỡ nú chứa bờn trong nú một sự vật con của lớp cơ sở, sự vật con này như thể ta
đó tạo ra một sự vật tường minh của lớp cơ sở, thế thỡ lớp cơ sở phải được bảo
đảm khởi đầu đỳng, để thực hiện điều đú trọng java ta làm như sau:
Thực hiện khởi đầu cho lớp cơ sở bằng cỏch gọi cấu tử của lớp cơ sở bờn trong cấu tử của lớp dẫn xuất, nếu bạn khụng làm điều này thỡ java sẽ làm giỳp ban, nghĩa là java luụn tự động thờm lời gọi cấu tử của lớp cơ sở vào cấu tử của lớp dẫn xuất nếu như ta quờn làm điều đú, để cú thể gọi cấu tử của lớp cơ sở ta sử dụng từ khoỏ super
Vớ dụ 1: vớ dụ này khụng gọi cấu tử của lớp cơ sở một cỏch tường minh class B
{
public B () {
System.out.println ( "Ham tao của lop co so" ); } } public class A extends B { public A ()
{// khụng gọi hàm tạo của lớp cơ sở tường minh
System.out.println ( "Ham tao của lop dan xuat" ); }
public static void main ( String arg[] ) {
A thu = new A (); }
}
Kết quả chạy chương trỡnh như sau: Ham tao của lop co so
Ham tao của lop dan xuat
Vớ dụ 2: vớ dụ này sử dụng từ khoỏ super để gọi cấu tử của lớp cơ sở một cỏch tường minh
class B {
public B () {
System.out.println ( "Ham tao của lop co so" ); } } public class A extends B { public A () {
super();// gọi tạo của lớp cơ sở một cỏch tường minh System.out.println ( "Ham tao của lop dan xuat" ); }
public static void main ( String arg[] ) {
A thu = new A (); }
}
khi chạy chưng trỡnh ta thấy kết quả giống hệt như vớ dụ trờn
Chỳ ý 1: nếu gọi tường minh cấu tử của lớp cơ sở, thỡ lời gọi này phải là lệnh đầu
tiờn, nếu vớ dụ trờn đổi thành class B
{
public B () {
System.out.println ( "Ham tao của lop co so" ); }
}
public class A extends B {
public A ()
{// Lời gọi cấu tử của lớp cơ sở khụng phải là lệnh đầu tiờn System.out.println ("Ham tao của lop dan xuat");
super ();
}
public static void main ( String arg[] ) {
A thu = new A (); }
}
nếu biờn dịch đoạn mó này ta sẽ nhõn được một thụng bỏo lỗi như sau: "A.java": call to super must be first statement in constructor at line 15, column 15
Chỳ ý 2: ta chỉ cú thể gọi đến một hàm tạo của lớp cơ sở bờn trong hàm tạo của
lớp dẫn xuất, vớ dụ chỉ ra sau đó bị bỏo lỗi class B
{
public B () {
System.out.println ( "Ham tao của lop co so" ); }
public B ( int i ) {
System.out.println ( "Ham tao của lop co so" ); } } public class A extends B { public A () { super ();
super ( 10 );/ / khụng thể gọi nhiều hơn 1 hàm tạo của lớp cơ sở System.out.println ( "Ham tao của lop dan xuat" );
}
public static void main ( String arg[] ) {
A thu = new A (); }
}
1. Trật tự khởi đầu
Trật tự khởi đầu trong java được thực hiện theo nguyờn tắc sau: java sẽ gọi cấu tử của lớp cơ sở trước sau đú mới đến cấu tử của lớp suy dẫn, điều này cú nghĩa là trong cõy phả hệ thỡ cỏc cấu tử sẽ được gọi theo trật tự từ gốc xuống dần đến lỏ
2. Trật tự dọn dẹp
Mặc dự java khụng cú khỏi niệm huỷ tử như của C++, tuy nhiờn bộ thu rỏc của java vẫn hoạt động theo nguyờn tắc làm việc của cấu tử C++, tức là trật tự thu rỏc thỡ ngược lại so với trật tự khởi đầu.