Trong bài viết này, chúng tôi thảo luận về các khái niệm kế thừa và tính đa hình phổ biến trong ngữ cảnh của Java.

Bạn đang xem : kế thừa và đa hình java

Java là một ngôn ngữ lập trình hướng đối tượng vì nó cung cấp cho các nhà phát triển Java khả năng triển khai các đối tượng như các thực thể trong cuộc sống thực . OOP (lập trình hướng đối tượng) là một mô hình lập trình được xây dựng xung quanh các đối tượng và các thuộc tính (thuộc tính) và hành vi (phương thức) của chúng. Vì vậy, nhìn chung, thiết kế phần mềm sử dụng các nguyên tắc hướng đối tượng tập trung vào các đối tượng và hoạt động. Trong số nhiều đặc điểm của lập trình hướng đối tượng là nó khuyến khích khả năng tái sử dụng và khả năng mở rộng mã. Chúng tôi sẽ giải thích chi tiết hai thuật ngữ này ở phần sau. Tuy nhiên, trước tiên, bài viết này sẽ giải thích hai nguyên tắc OOP cốt lõi trong tính kế thừa và tính đa hình.

Điều kiện tiên quyết

Người đọc nên có:

  • Hiểu biết cơ bản về lập trình Java
  • Java được cài đặt trên máy tính của bạn
  • IDE do bạn chọn

Mục tiêu

Ở phần cuối của hướng dẫn này, người đọc sẽ hiểu:

  • Kế thừa là gì
  • Nhiều thừa kế
  • Hệ thống phân cấp kế thừa
  • Tính đa hình là gì
  • Tầm quan trọng của tính đa hình và tính kế thừa
  • Thực hiện kế thừa và đa hình trong Java

Để bắt đầu, hãy đọc bài viết này để hiểu cách tạo đối tượng từ các lớp.

Kế thừa là gì?

Hãy tưởng tượng thiết kế một lớp để tạo các đối tượng Car chẳng hạn như Toyota, Benz, Rolls Royce, v.v. Tất cả các đối tượng ô tô đều có các thuộc tính và hành vi giống nhau. Ví dụ, tất cả các ô tô có thể di chuyển (lái), bấm còi, tăng tốc và chúng đều có tên và số động cơ. Thay vì tạo các lớp này riêng lẻ, một lớp ô tô chung (superclass) với tất cả các thuộc tính và hành vi của ô tô có thể được sử dụng để tạo mô hình cho tất cả các đối tượng ô tô. Các lớp khác sau đó kế thừa hoặc được tạo dựa trên các thuộc tính và phương thức của lớp cha. Tóm lại, kế thừa cho phép bạn xây dựng các lớp dựa trên các lớp khác và tránh trùng lặp và lặp lại mã. Đây là một số đoạn mã để giải thích cho hình minh họa trên:

  

// Khai báo lớp siêu xe

công cộng

đẳng cấp

Xe ô tô

{

riêng tư

int

speed

;

riêng tư

Tên chuỗi

;

riêng tư

Màu chuỗi

;

riêng tư

int

enginePower

;

công cộng

Xe ô tô

()

{

}

công khai

vô hiệu

tăng tốc

()

{

Hệ thống

.

ra

.

println

(

"Xe đang tăng tốc… "

);

}

public

void

setSpeed ​​

(

int

speed

)

< p> {

Hệ thống

.

ra

.

println

(

"Chiếc xe là" < / p>

+

tốc độ

);

}

công khai

int

getSpeed ​​

()

{

trả về

tốc độ

;

}

}

// Khai báo một lớp xe con

công khai

đẳng cấp

Toyota

mở rộng

Xe hơi

​​{

riêng tư

int

registerNumber

;

private

int

engineNumber

;

công khai

Toyota

()

{

// Hàm tạo Toyota gọi hàm tạo của lớp cha

siêu

();

}

}

Từ khóa extension ngụ ý rằng lớp Toyota kế thừa và là con của lớp Car . Lớp Toyota có cả thuộc tính và phương thức của lớp Car và của riêng nó. Đây là nguyên tắc cốt lõi của sự kế thừa; nó hỗ trợ khái niệm về khả năng tái sử dụng mã. Đoạn mã bên dưới cho thấy cách đối tượng Toyota có thể truy cập cả thuộc tính và phương thức trong lớp cha Car :

  

công khai

lớp

Chính

{

public

static

void

main

(

Chuỗi

​​[]

args

)

{

// Đây là phương thức setSpeed ​​() và speed () trong lớp Xe đang được truy cập bởi đối tượng Toyota.

Toyota myToyota

=

mới

Toyota

();

myToyota

.

setSpeed ​​

(

3

);

myToyota

.

tăng tốc

();

}

}

Đúng ra khi nói rằng một lớp con là một phiên bản chuyên biệt của lớp cha. Là một cách tiếp cận lập trình Java được chấp nhận chung, trước khi chúng ta tạo một đối tượng, nó phải được khai báo là một kiểu đã cho: lớp mà đối tượng là một thể hiện của nó. Kế thừa thay đổi điều này thông qua nguyên tắc thay thế đa hình. Nguyên tắc thay thế đa hình nói rằng bất cứ nơi nào cần một đối tượng của một kiểu nhất định trong một biểu thức, nó có thể được thay thế cho một đối tượng là một lớp con của kiểu đã cho. Dưới đây là đoạn mã để minh họa nguyên tắc thay thế đa hình:

  Car myToyota 

=

new

Car

();

// Một đối tượng kiểu Xe được gán cho một biến kiểu Xe hoặc

Xe myToyota1

=

mới

Toyota

();

Một đối tượng kiểu Toyota được gán cho một biến kiểu Car . Điều này là có thể bởi vì Toyota là một lớp con hoặc một hậu duệ của Xe hơi. Thật không may, nguyên tắc thay thế đa hình không thể giữ theo hướng ngược lại. Do đó, một đối tượng ô tô không thể được sử dụng thay cho một đối tượng Toyota. Ví dụ: đoạn mã dưới đây sẽ gây ra lỗi biên dịch:

  Toyota myToyota 

=

mới

Xe

();

/ * Mọi chiếc Toyota đều là Xe hơi nhưng không phải mọi chiếc xe đều là Toyota * /

Bây giờ đã đến lúc xem xét các loại kế thừa nhưng trước đó, hãy để tôi làm rõ một điểm. Khi một phương thức trong lớp cha bị ghi đè trong lớp con, phương thức lớp cha có thể truy cập được trong lớp cơ sở bằng cách sử dụng từ khóa super theo sau là dấu chấm. Đoạn mã dưới đây minh họa điều này:

  

công cộng

lớp

Toyota

mở rộng

Xe hơi

​​{

công khai

vô hiệu

tăng tốc

()

{

siêu

.

tăng tốc

();

Hệ thống

.

ra

.

println

(

"Toyota đang tăng tốc" < / p>

);

}

}

Các loại kế thừa

Đây là các loại kế thừa:

  1. Thừa kế Đơn lẻ
  2. Đa kế thừa
  3. Kế thừa nhiều cấp
  4. Kế thừa phân cấp

Một thừa kế

Lớp con chỉ kế thừa các thuộc tính và phương thức từ một lớp cha duy nhất trong kiểu kế thừa này. Lớp con cũng có thể thêm nhiều tính năng hơn vào mã hiện có. Ví dụ dưới đây minh họa kế thừa đơn:

  

public

class

SectionStudent

{

// Khai báo các biến phiên bản và phương thức của bạn tại đây

}

công khai

lớp

SectionInheritance

mở rộng

SectionStudent

{

// Khai báo các biến phiên bản và phương thức của bạn tại đây

}

Trong kế thừa đơn, lớp SectionInheritance chỉ kế thừa từ SectionStudent .

Đa kế thừa

Trong Java, không cho phép nhiều thừa kế, mặc dù chúng có thể được triển khai thông qua các giao diện. Nhiều giao diện có thể được triển khai trong Java, nhưng chỉ có thể mở rộng một lớp.

Kế thừa nhiều cấp

Trong kế thừa đa cấp, một lớp con cũng đóng vai trò là lớp cơ sở cho một lớp con khác. Ví dụ: giả sử một lớp xe đóng vai trò là lớp cha cho mọi máy chuyển động, bao gồm cả ô tô và ô tô cũng đóng vai trò là lớp cha cho các loại ô tô cụ thể như Toyota, Benz, v.v. Đây là khái niệm về sự kế thừa đa cấp. Đoạn mã dưới đây minh họa điều này:

  

hạng công cộng

Xe

{

// Làm gì đó

}

hạng công khai

Ô tô

mở rộng

Xe

{

// Làm gì đó

// Tại thời điểm này, Ô tô là một lớp phụ của Xe

}

công cộng

đẳng cấp

Benz

mở rộng

Xe hơi

​​{

// Đây là ô tô bây giờ là một lớp siêu cấp

}

Kế thừa phân cấp

Loại kế thừa này trong đó nhiều hơn một lớp dựa trên một lớp cha. Ví dụ: lớp Benz kế thừa từ Car , lớp Toyota kế thừa từ Car và danh sách tiếp tục. Nói một cách đơn giản hơn, kế thừa phân cấp là loại kế thừa trong đó các lớp khác nhau kế thừa lớp cha:

  

hạng công khai

Xe ô tô

{

// Viết các phương thức của bạn tại đây

}

công cộng

đẳng cấp

Benz

mở rộng

Xe hơi

​​{

// Viết các phương thức của bạn tại đây

}

công cộng

đẳng cấp

Porsche

mở rộng

Xe hơi

​​{

// Viết các phương thức của bạn tại đây

}

Lưu ý về kế thừa

  1. Các trình tạo không được kế thừa
  2. Các thành viên riêng của một lớp không được kế thừa
  3. Các phương thức cuối cùng được kế thừa nhưng không thể bị ghi đè
  4. Tất cả các thành viên và trường công khai và được bảo vệ đều được kế thừa

Chúng tôi có thể giải thích về kế thừa và hệ thống phân cấp kế thừa. Bây giờ chúng ta hãy tập trung vào tính đa hình.

Đa hình và triển khai nó

Như tên của nó, đa hình là khả năng có nhiều dạng hoặc nhiều hình dạng. Đa hình là một khái niệm lập trình hướng đối tượng cho phép bạn xử lý các đối tượng chia sẻ cùng một lớp cha, dù trực tiếp hay gián tiếp, như thể chúng là các đối tượng của lớp cha. Ví dụ: chúng tôi kế thừa các phương thức của lớp cha trong kế thừa, trong khi tính đa hình sử dụng các phương thức ở các dạng khác nhau.

Giả sử chúng ta tạo một chương trình bắt chước chuyển động của động vật. Ví dụ: các lớp Dog , Fish , Bird Snake , di chuyển khác nhau mặc dù tất cả chúng đều triển khai < phương thức code> move trong lớp con. Đoạn mã dưới đây cung cấp một minh họa sống động cho tuyên bố trên:

  

công khai

lớp

Động vật

{

public

void

animalMove

()

{

Hệ thống

.

ra

.

println

(

"Động vật di chuyển"

);

}

}

công khai

lớp học

Chó

mở rộng

Động vật

{

public

void

animalMove

()

{

Hệ thống

.

ra

.

println

(

"Con chó đang chạy" < / p>

);

}

}

công khai

lớp học

mở rộng

Động vật

{

public

void

animalMove

()

{

Hệ thống

.

ra

.

println

(

"Cá đang bơi" < / p>

);

}

}

công khai

lớp học

Chim

mở rộng

Động vật

{

public

void

animalMove

()

{

Hệ thống

.

ra

.

println

(

"Con chim đang bay" < / p>

);

}

}

công khai

lớp học

Rắn

mở rộng

Động vật

{

public

void

animalMove

()

{

Hệ thống

.

ra

.

println

(

"Rắn đang bò" < / p>

);

}

}

Để kiểm tra xem mã trên có áp dụng đa hình hay không, hãy sử dụng phương pháp chính để kiểm tra.

  

public

static

void

main

(< / p> Chuỗi

​​[]

args

)

{

Động vật

=

mới

Động vật

();

động vật

.

animalMove

();

Chó động vật

=

mới

Chó

();

con chó

.

animalMove

();

Cá động vật

=

mới

();

.

animalMove

();

Chim thú

=

mới

Chim

();

chim

.

animalMove

();

Rắn động vật

=

mới

Rắn

();

rắn

.

animalMove

();

}

Thông tin sau sẽ được in ra trên bảng điều khiển của chúng tôi khi chúng tôi chạy ứng dụng này:

  Động vật di chuyển
Con chó đang chạy
Cá đang bơi
Chim đang bay
Rắn đang bò
 

Các loại đa hình

Có hai loại đa hình và chúng được liệt kê bên dưới:

  1. Tính đa hình thời gian biên dịch
  2. Đa hình thời gian chạy

Tính đa hình thời gian biên dịch

Khi trình biên dịch gặp một lệnh gọi phương thức, nó sẽ kiểm tra kiểu của đối tượng để xác định xem nó có thể thực hiện lệnh gọi đó hay không. Chương trình được biên dịch nếu lớp chứa phương thức hoặc kế thừa một phương thức. Một ứng dụng chính của tính đa hình thời gian biên dịch là nạp chồng phương thức của Java.

Quá tải phương thức

Đây là một khái niệm trong đó các phương thức được khai báo với cùng một tên nhưng với các kiểu tham số khác nhau. Phương thức được xác định tại thời điểm biên dịch do đó có các từ thời gian biên dịch trong tên. Đây là một ví dụ:

  

lớp công khai

MathAddition

{

public

int

sum

(

int

a

,

< p> int

b

,

int

c

)

{

trả về

a

+

b

+

c

;

}

công khai

int

sum

(

int

x

,

< p> int

y

)

{

trả lại

x

+

y

;

}

}

Phương thức sum được khai báo hai lần từ đoạn mã trên. Giả sử sum được gọi bởi một đối tượng thuộc loại MathAddition, bạn nghĩ cái nào sẽ được gọi? Câu trả lời rất đơn giản, phương thức được gọi được xác định bởi số lượng đối số được truyền vào thời gian biên dịch, như được hiển thị bên dưới:

  

public

static

void

main

(< / p> Chuỗi

​​[]

args

) {

Phép bổ sung MathAddition

=

mới

MathAddition

();

Hệ thống

.

ra

.

println

(

bổ sung

.

tổng

(

3

,

3

,

3

));

}

Kết quả của lệnh gọi phương thức trên sẽ là 9 . Hãy nhớ rằng, chúng ta có hai phương thức có cùng tên và các tham số khác nhau. Tuy nhiên, khi gọi, ba đối số đã được truyền vào phương thức để thực thi phương thức với ba tham số. Đây là tính đa hình thời gian biên dịch.

Đa hình thời gian chạy

Đây là loại đa hình xảy ra trong thời gian chạy. Trong đa hình thời gian chạy, hai phương thức có cùng tên tồn tại ở hai lớp khác nhau, không giống như đa hình thời gian biên dịch, trong đó cả hai phương thức đều tồn tại trong cùng một lớp. Trong tính đa hình thời gian chạy, một lớp là lớp cha và lớp khác là lớp con. Một ứng dụng hoàn hảo của tính đa hình thời gian chạy được nhìn thấy trong ghi đè phương thức.

Ghi đè phương thức

Đây là một khái niệm trong đó một phương thức được khai báo trong lớp cha được thực hiện khác trong lớp con. Trong thời gian chạy, phương thức được gọi được xác định bởi đối tượng được tạo chứ không phải bởi kiểu tham chiếu. Đoạn mã này minh họa ghi đè phương thức:

  

công khai

lớp

Động vật

{

công khai

void

animalRun

()

{

Hệ thống

.

ra

.

println

(

"Động vật đang chạy" < / p>

);

}

}

công khai

lớp học

Chim

mở rộng

Động vật

{

công khai

void

animalRun

()

{

Hệ thống

.

ra

.

println

(

Bird đang chạy

);

}

}

công khai

lớp học

Chính

{

public

static

void

main

(

Chuỗi

​​[]

args

)

{

// Điều này sẽ gọi phương thức trong lớp cha Animal

Động vật mớiAnimal

=

mới

Động vật

();

newAnimal

.

animalRun

();

// Điều này sẽ gọi phương thức trong lớp con Bird

Chim động vậtAnimal

=

mới

Chim

();

birdAnimal

.

animalRun

();

}

}

Trong thời gian chạy, đối tượng birdAnimal sẽ gọi phương thức animalRun () trong lớp con Bird kể từ đối tượng được tạo thuộc loại Bird .

Bây giờ chúng ta đã nói đầy đủ về tính thừa kế, tính đa hình và các kiểu của chúng, chúng ta hãy tiếp tục và nói về sự khác biệt giữa chúng.

Sự khác biệt giữa kế thừa và đa hình

Trong kế thừa, chúng tôi tạo các lớp mới kế thừa các tính năng của lớp cha trong khi tính đa hình quyết định dạng phương thức nào sẽ thực thi. Tính kế thừa áp dụng cho các lớp, trong khi tính đa hình áp dụng cho các phương thức.

Tầm quan trọng của tính đa hình và kế thừa

Dưới đây là một số lý do tại sao đa hình và kế thừa là những khái niệm OOP cần thiết:

  • Sự kế thừa khuyến khích phân cấp lớp
  • Tính kế thừa khuyến khích khả năng tái sử dụng mã
  • Tính đa hình tạo nên sự đơn giản
  • Tính đa hình khuyến khích khả năng mở rộng mã

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu về khái niệm kế thừa và tính đa hình. Chúng ta đã nói về các kiểu kế thừa và đa hình cũng như cách triển khai của chúng. Chúng tôi cũng đã nói về sự khác biệt của họ.

Chúc bạn viết mã vui vẻ!

Tài liệu tham khảo

  • Java – Cách lập trình Phiên bản Ed-Early Object thứ 10- Deitel
  • OOP trong Java – Bắt đầu với Tóm tắt và Đóng gói

Đóng góp Đánh giá ngang hàng của: John Amiscaray


Xem thêm những thông tin liên quan đến chủ đề kế thừa và đa hình java

[HỌC LẬP TRÌNH JAVA] LÀM VIỆC VỚI KẾ THỪA, ĐA HÌNH VÀ INTERFACE TRONG JAVA

  • Tác giả: Stanford – Dạy kinh nghiệm thực tế
  • Ngày đăng: 2017-01-05
  • Đánh giá: 4 ⭐ ( 3622 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Bài giảng hướng dẫn các bạn học lập trình java nắm chắc các kiến thức về kế thừa, đa hình và interface sử dụng trong lập trình Java.

Tính đa hình trong java

  • Tác giả: viettuts.vn
  • Đánh giá: 3 ⭐ ( 9281 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Đa hình trong java (Polymorphism) là một khái niệm mà chúng ta có thể thực hiện một hành động bằng nhiều cách khác nhau. Có hai kiểu của đa hình trong java.

Kế thừa & đa hình trong lập trình hướng đối tượng

  • Tác giả: cppdeveloper.com
  • Đánh giá: 5 ⭐ ( 1348 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Một trong những đặc tính quan trọng nhất của OOP là kế thừa. Ưu điểm của đặc tính kế thừa: sử dụng lại các đoạn code đã có trong chương trình 1 cách hiệu quả…

Tính đa hình thời gian chạy của Java với kế thừa đa cấp

  • Tác giả: vn.wsxdn.com
  • Đánh giá: 3 ⭐ ( 3913 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Java: Bài tập phần Thừa kế & Đa hình

  • Tác giả: www.v1study.com
  • Đánh giá: 5 ⭐ ( 6034 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tạo lớp Person chứa thông tin: Tên, Giới tính, Ngày sinh, Địa chỉ với đầy đủ hàm get set, constructor không tham số, constructor đầy đủ tham số

[Tự học Java] Tính kế thừa(Inheritance) trong Java

  • Tác giả: cafedev.vn
  • Đánh giá: 5 ⭐ ( 6806 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu về tính kế thừa trong Java bằng vài ví dụ trợ giúp.

Thừa kế và đa hình trong Java

  • Tác giả: openplanning.net
  • Đánh giá: 5 ⭐ ( 5861 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Thuộc tính lớp Python: Hướng dẫn kỹ lưỡng - thuộc tính của một lớp

By ads_php