Java Inheritance & Method Overriding: Loop Cha & Con, Super, Abstract Classes, Essays (high school) of Mathematics

The concepts of inheritance and method overriding in Java, focusing on the roles of base and derived classes, super keyword, and abstract classes. It covers the rules of method overriding, the use of super keyword, and the difference between multiple and single inheritance.

Typology: Essays (high school)

2021/2022

Uploaded on 05/24/2022

tran-vuong-quoc-djat
tran-vuong-quoc-djat 🇻🇳

1 document

1 / 17

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
1
Bài 7: Một số kỹ thuật
trong kế thừa
1
1
Mục tiêu
vTrì nh b ày ng uyê n đị nh n ghĩ a lạ i tro ng kế t hừa
vPhân biệt khái niệm đơn kế thừa và đa kế thừa
vGiới thiệu về giao diện, lớp trừu tượng và vai trò
của chúng
vVí dụ và bài tập về các vấn đề trên với ngôn ngữ
lập trình Java
2
2
Nội dung
1. Định nghĩa lại/ghi đè (Overriding)
2. Lớp trừu tượng
3. Đơn kế thừa & Đa kế thừa
4. Giao diện (Interface)
5. Vai tr ò của lớ p trừ u tượ ng gi ao diệ n
6. Ví dụ và bài tập
3
3
Nội dung
1. Định nghĩa lại/ghi đè (Overriding)
2. Lớp trừu tượng
3. Đơn kế thừa & Đa kế thừa
4. Giao diện (Interface)
5. Vai tr ò của lớ p trừ u tượ ng gi ao diệ n
6. Ví dụ và bài tập
4
4
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Partial preview of the text

Download Java Inheritance & Method Overriding: Loop Cha & Con, Super, Abstract Classes and more Essays (high school) Mathematics in PDF only on Docsity!

Bài 7: Một số kỹ thuật

trong kế thừa

1

Mục tiêu

v Trình bày nguyên lý định nghĩa lại trong kế thừa v Phân biệt khái niệm đơn kế thừa và đa kế thừa v Giới thiệu về giao diện, lớp trừu tượng và vai trò của chúng v Ví dụ và bài tập về các vấn đề trên với ngôn ngữ lập trình Java 2

Nội dung

  1. Định nghĩa lại/ghi đè (Overriding)
  2. Lớp trừu tượng
  3. Đơn kế thừa & Đa kế thừa
  4. Giao diện (Interface)
  5. Vai trò của lớp trừu tượng và giao diện
  6. Ví dụ và bài tập 3

Nội dung

1. Định nghĩa lại/ghi đè (Overriding)

  1. Lớp trừu tượng
  2. Đơn kế thừa & Đa kế thừa
  3. Giao diện (Interface)
  4. Vai trò của lớp trừu tượng và giao diện
  5. Ví dụ và bài tập 4

1. Định nghĩa lại/ghi đè (Overriding) v Quan hệ kế thừa (inheritance) § Lớp con là một loại (is-a-kind-of) của lớp cha § Kế thừa các thành phần dữ liệu và các hành vi của lớp cha § Chi Cết hóa cho phù hợp với mục đích sử dụng mới: - Mở rộng lớp cha (Extension): Thêm các thuộc Dnh/hành vi mới - Định nghĩa lại (RedefiniOon): Chỉnh sửa lại các hành vi kế thừa từ lớp cha à Ghi đè (Method Overriding) 5

1. Định nghĩa lại/ghi đè (Overriding) v Phương thức ghi đè sẽ thay thế hoặc làm rõ hơn cho phương thức cùng tên trong lớp cha v Đối tượng của lớp con sẽ hoạt động với phương thức mới phù hợp với nó 6

Shape

**# name: String

  • getName(): String
  • calculateArea(): double**

Circle

  • **radius: double
  • calculateArea(): double**

Square

  • **side: double
  • calculateArea(): double** side * side^ 3.14 * radius * radius

1. Định nghĩa lại/ghi đè (Overriding) v Cú pháp: Phương thức ở lớp con hoàn toàn giống về chữ ký với phương thức kế thừa ở lớp cha § Trùng tên & danh sách tham số § Mục đích: Để thể hiện cùng bản chất công việc v Lớp con có thể định nghĩa phương thức trùng tên với phương thức trong lớp cha: 7 Nếu phương thức mới chỉ trùng tên và khác chữ ký (số lượng hay kiểu dữ liệu của đối số) à Chồng phương thức (Method Overloading) Nếu phương thức mới hoàn toàn giống về giao diện (chữ ký) à Định nghĩa lại hoặc ghi đè phương thức (Method Override)

Ví dụ (1) class Shape { protected String name; Shape(String n) { name = n; } public String getName() { return name; } public double calculateArea() { return 0.0; } } class Circle extends Shape { private double radius; Circle(String n, double r){ super (n); radius = r; } public double calculateArea() { double area = ( double ) (3.14 * radius * radius); return area; } } 8

Quy định trong ghi đè v Phương thức ghi đè trong lớp con phải § Có danh sách tham số giống hệt phương thức kế thừa trong lớp cha. § Có cùng kiểu trả về với phương thức kế thừa trong lớp cha § Có chỉ định truy cập không giới hạn chặt hơn phương thức trong lớp cha. Ví dụ, nếu ghi đè một phương thức protected, thì phương thức mới có thể là protected hoặc public, mà không được là private 13

Ví dụ

class Parent {

public void doSomething() {}

protected int doSomething2() {

return 0;

class Child extends Parent {

protected void doSomething() {}

protected void doSomething2() {}

14 cannot override: attempting to use incompatible return type cannot override: attempting to assign weaker access privileges; was public

Quy định trong ghi đè v Không được phép ghi đè: § Các phương thức staCc trong lớp cha § Các phương thức private trong lớp cha § Các phương thức hằng (final) trong lớp cha 15

Hạn chế ghi đè – Từ khoá final v Đôi lúc ta muốn hạn chế việc định nghĩa lại vì các lý do sau: § Tính đúng đắn: Định nghĩa lại một phương thức trong lớp dẫn xuất có thể làm sai lạc ý nghĩa của nó § Tính hiệu quả: Cơ chế kết nối động không hiệu quả về mặt thời gian bằng kết nối wnh v Nếu biết trước sẽ không định nghĩa lại phương thức của lớp cơ sở thì nên dùng từ khóa final đi với phương thức. Ví dụ:

public final String baseName () {

return “Person”;

16

Hạn chế ghi đè – Từ khoá final v Các phương thức được khai báo là final không thể ghi đè class A { final void method(){ } } class B extends A{ void method(){ // Báo lỗi!!! } } 17

Hạn chế ghi đè – Từ khoá final v Từ khóa final được dùng khi khai báo lớp: § Lớp được khai báo là lớp hằng (không thay đổi), lớp này không có lớp con thừa kế § Được sử dụng để hạn chế việc thừa kế và ngăn chặn việc sửa đổi một lớp public final class A { //... } 18

this và super v this và super có thể sử dụng cho các phương thức/thuộc tính non-static và phương thức khởi tạo

§ this : tìm kiếm phương thức/thuộc tính trong lớp

hiện tại

§ super : tìm kiếm phương thức/thuộc tính trong lớp

cha trực tiếp

v Từ khóa super cho phép tái sử dụng các đoạn mã của lớp cha trong lớp con 19

Bài tập 1 v Cho đoạn mã dưới đây:

**1. class BaseClass {

  1. private float x = 1.0f;
  2. float getVar() { return x; }
  3. }
  4. class SubClass extends BaseClass {
  5. private float x = 2.0f;
  6. // insert code here
  7. }** v Lựa chọn nào có thể chèn tại dòng 7? **1. public double getVar() { return x; }
  8. public float getVar(float f){ return f; }
  9. float getVar() { return x; }
  10. public float getVar() { return x; }
  11. private float getVar() { return x; }** 20

2. Lớp trừu tượng v Phương thức trừu tượng § Là các phương thức “không rõ ràng” / chưa hoàn thiện, khó đưa ra cách cài đặt cụ thể § Chỉ có chữ ký mà không có cài đặt cụ thể § Các lớp dẫn xuất có thể làm rõ - định nghĩa lại (overriding) các phương thức trừu tượng này 25

Từ khoá abstract v Lớp trừu tượng § Khai báo với từ khóa abstract public abstract class Shape { // Nội dung lớp } v Phương thức trừu tượng § Khai báo với từ khóa abstract public abstract float calculateArea(); 26

Shape = new Shape(); //Compile error

Ví dụ Lớp trừu tượng abstract class Shape { protected String name; Shape(String n) { name = n; } public String getName() { return name; } public abstract double calculateArea(); } class Circle extends Shape { private double radius; Circle(String n, double r){ super(n); radius = r; } public double calculateArea() { double area = (double) (3.14 * radius * radius); return area; } } 27 Lớp con bắt buộc phải override tất cả các phương thức abstract của lớp cha

2. Lớp trừu tượng v Nếu một lớp có một hay nhiều phương thức trừu tượng thì nó phải là lớp trừu tượng v Lớp con khi kế thừa phải cài đặt cụ thể cho các phương thức trừu tượng của lớp cha § Nếu không ghi đè các phương thức này thì lớp con cũng trở thành một lớp trừu tượng à Phương thức trừu tượng không thể khai báo là final hoặc staCc 28 Kết hợp cho phép abstract public abstract protected Kết hợp KHÔNG cho phép abstract private abstract static abstract final

Ví dụ lớp trừu tượng 29

abstract class Point {

private int x, y;

public Point( int x, int y) {

this .x = x; this .y = y;

public void move( int dx, int dy) {

x += dx; y += dy;

plot();

public abstract void plot();

// phương thức trừu tượng không có

// phần code thực hiện

Ví dụ Lớp trừu tượng abstract class ColoredPoint extends Point { int color; public ColoredPoint( int x, int y, int color) { super (x, y); this .color = color; } } class SimpleColoredPoint extends ColoredPoint { public SimpleColoredPoint( int x, int y, int color) { super (x, y, color); } @Override public void plot() { ... } // code to plot a SimplePoint } 30

2. Lớp trừu tượng v Biểu diễn trong UML § Lớp trừu tượng (không thể tạo đối tượng cụ thể) - Chứa phương thức trừu tượng - Tên lớp / tên phương thức: Chữ nghiêng 31 Lion Tiger _Animal

  • communicate ()_
  • communicate ()^ + communicate () Tất cả các đối tượng là sư tử hoặc hổ Lớp trừu tượng Phương thức trừu tượng

Bài tập 3 v 1. Đoạn mã dưới đây có lỗi gì không? abstract class ABC { void firstMethod() { System.out.println("First Method"); } void secondMethod() { System.out.println("Second Method"); } } v 2. Lớp nào là lớp trừu tượng, lớp nào có thể tạo đối tượng? abstract class A { } class B extends A { 32

Nội dung

  1. Định nghĩa lại/ghi đè (Overriding)
  2. Lớp trừu tượng
  3. Đơn kế thừa & Đa kế thừa 4. Giao diện (Interface)
  4. Vai trò của lớp trừu tượng và giao diện
  5. Ví dụ và bài tập 37

4. Giao diện v Giao diện (interface) § Là kiểu dữ liệu trừu tượng, được dùng để đặc tả các hành vi mà các lớp phải thực thi § Tương tự như giao thức (protocols) § Chứa các chữ ký phương thức (Mọi phương thức đều là phương thức trừu tượng) và các hằng § Giải quyết bài toán đa thừa kế, tránh các rắc rối nhập nhằng ngữ nghĩa v Giao diện trong Java § Một cấu trúc lập trình của Java được định nghĩa với từ khóa interface § Từ Java 8: có thêm phương thức default, staCc. Từ Java 9, có thêm phương thức private và private staCc 38

4. Giao diện v Sử dụng từ khóa interface để định nghĩa § Một giao diện chỉ được bao gồm: - Chữ ký các phương thức (method signature) - Các thuộc Dnh khai báo hằng (staOc & final) § Không có thể hiện § Chỉ được thực thi và mở rộng v Cú pháp khai báo giao diện trên Java interface <Tên giao diện> { } <Giao diện con> extends <Giao diện cha> { } v Ví dụ public interface DoiXung {…} public interface Can extends DoiXung {…} public interface DiChuyen {…} 39

4. Giao diện v Lớp thực thi giao diện § Hoặc là lớp trừu tượng (abstract class) § Hoặc là bắt buộc phải cài đặt chi Cết toàn bộ các phương thức trong giao diện nếu là lớp cụ thể v Một lớp có thể thực thi nhiều giao diện <Lớp con> [ extends <Lớp cha>] implements <Danh sách giao diện> v Ví dụ: public class HinhVuong extends TuGiac implements DoiXung, DiChuyen { } 40

41 Circle

- radius: float +calculateArea():float +moveTo(Graphics,int, int):void +fill(Graphics):void Action #x: int #y: int +moveTo(Graphics,int, int):void +fill(Graphics): void Shape #name: String +getName():String +calculateArea():float **Circle

  • radius:float +calculateArea():float +moveTo(Graphics,int,int):void +fill(Graphics):void <> Actable +moveTo(Graphics,int, int):void +fill(Graphics):void** Shape #name: String #x:int #y:int +getName():String +calculateArea():float extends extends extends implements

4. Ví dụ giao diện import java.awt.Graphics; abstract class Shape { protected String name; protected int x, y; Shape(String n, int x, int y) { name = n; this.x = x; this.y = y; } public String getName() { return name; } public abstract float calculateArea(); } interface Actable { public void moveTo(Graphics g, int x1, int y1); public void fill(Graphics g); } 42

**class Circle extends Shape implements Actable { private int radius; public Circle(String n, int x, int y, int r) { super(n, x, y); radius = r; } public float calculateArea() { float area = (float) (3.14 * radius * radius); return area; } public void draw(Graphics g) { System.out.println("Draw circle at ("

  • x + “," + y + ")"); g.drawOval(x-radius,y-radius,2radius,2radius); } public void moveTo(Graphics g, int x1, int y1) { x = x1; y = y1; draw(g); } public void fill(Graphics g) { System.out.println(“Fill circle at ("
  • x + “," + y + ")"); // paint the region with color... } }** 43

4. Giao diện v Giao diện có thể được sử dụng như một kiểu dữ liệu v Các đối tượng gán cho biến tham chiếu giao diện phải thuộc lớp thực thi giao diện v Ví dụ: public interface I {} public class A implements I {} public class B {} A a = new A(); B b = new B(); I i1 = new A(); // ok I i2 = new B(); // lỗi 44

Bài tập 4 v 1. Khai báo nào là hợp lệ trong một interface? a.public static int answer = 42; b.int answer; c.final static int answer = 42; d.public int answer = 42; e.private final static int answer = 42; v 2. Một lớp có thể kế thừa chính bản thân nó không? v 3. Chuyện gì xảy ra nếu lớp cha và lớp con đều có thuộc ‘nh trùng tên? v 4. Phát biểu “Các phương thức khởi tạo cũng được thừa kế xuống các lớp con” là đúng hay sai? v 5. Có thể xây dựng các phương thức khởi tạo cho lớp trừu tượng không? v 6. Có thể khai báo phương thức protected trong một giao diện không? 49

Nội dung

  1. Định nghĩa lại/ghi đè (Overriding)
  2. Lớp trừu tượng
  3. Đơn kế thừa & Đa kế thừa
  4. Giao diện (Interface) 5. Vai trò của lớp trừu tượng và giao diện
  5. Ví dụ và bài tập 50

5. Lớp trừu tượng & Giao diện v Khi nào nên cho một lớp là lớp độc lập, lớp con, lớp trừu tượng, hay nên biến nó thành interface? § Một lớp nên là lớp độc lập, nghĩa là nó không thừa kế lớp nào (ngoại trừ Object) nếu nó không thỏa mãn quan hệ IS-A đối với bất cứ loại nào khác § Một lớp nên là lớp con nếu cần cho nó làm một phiên bản chuyên biệt hơn của một lớp khác và cần ghi đè hành vi có sẵn hoặc bổ sung hành vi mới 51

5. Lớp trừu tượng & Giao diện v Khi nào nên cho một lớp là lớp độc lập, lớp con, lớp trừu tượng, hay nên biến nó thành interface? § Một lớp nên là lớp cha nếu muốn định nghĩa một khuôn mẫu cho một nhóm các lớp con, và có mã cài đặt mà tất cả các lớp con kia có thể sử dụng - Cho lớp đó làm lớp trừu tượng nếu muốn đảm bảo rằng không ai được tạo đối tượng thuộc lớp đó § Dùng một interface nếu muốn định nghĩa một vai trò mà các lớp khác có thể nhận, bất kể các lớp đó thuộc cây thừa kế nào 52

Mở rộng v Khái niệm giao diện trong các phiên bản của Java 53

  • Chữ ký các phương thức (method signature)
  • Các thuộc tính khai báo hằng (static & final) - Chữ ký các phương thức (method signature) - Các thuộc tính khai báo hằng (static & final) - Phương thức mặc định (default method) - Phương thức tĩnh (Static method) - Chữ ký các phương thức (method signature) - Các thuộc tính khai báo hằng (static & final) - Phương thức mặc định (default method) - Phương thức tĩnh (Static method) - Private methods

JAVA 7 JAVA 8 JAVA 9

Ví dụ Java 8 Interface – default methods h†ps://gpcoder.com/3854-interface-trong-java- 8 - default-method-va-sta€c-method/ 54 public interface Shape { void draw(); default void setColor(String color) { System. out .println("Draw shape with color " + color); } }

Đa thừa kế 55 interface Interface1 { default void doSomething() { System. out .println("doSomething1"); } } interface Interface2 { default void doSomething() { System. out .println("doSomething2"); } } public class MultiInheritance implements Interface1, Interface2 { @Override public void doSomething() { Interface1. super .doSomething(); } }

Đa thừa kế 56 interface Interface3 { default void doSomething() { System. out .println("Execute in Interface3"); } } class Parent { public void doSomething() { System. out .println("Execute in Parent"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); m.doSomething(); // Execute in Parent } }

Ví dụ với static method 61 interface Interface3 { default void doSomething() { System. out .println("Execute in Interface3"); } public static void test() { System. out .println("test"); } } abstract class Parent { public void doSomething() { System. out .println("Execute in Parent"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); m. test (); // ERROR!!! } }

Ví dụ với static method 62 interface Interface3 { default void doSomething() { System. out .println("Execute in Interface3"); } public static void test() { System. out .println("test"); } } abstract class Parent { public void doSomething() { System. out .println("Execute in Parent"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); MultiInheritance2. test (); // ERROR!!! } }

Tổng kết v Ghi đè § Các phương thức ở lớp con có cùng chữ ký và danh sách tham số với phương thức ở lớp cha, được tạo ra để định nghĩa lại các hành vi ở lớp con v Lớp trừu tượng § Các lớp không được khởi tạo đối tượng, được tạo ra làm lớp cơ sở cho các lớp con định nghĩa rõ hơn § Có ít nhất một phương thức trừu tượng v Giao diện § Định nghĩa các phương thức mà lớp thực thi phải cài đặt § Giải quyết vấn đề đa kế thừa 63

Nội dung

  1. Định nghĩa lại/ghi đè (Overriding)
  2. Lớp trừu tượng
  3. Đơn kế thừa & Đa kế thừa
  4. Giao diện (Interface)
  5. Vai trò của lớp trừu tượng và giao diện 6. Ví dụ và bài tập 64

Bài tập 5 v Sửa lại lớp NhanVien: § 3 thuộc ‘nh không hằng của NhanVien kế thừa lại cho lớp TruongPhong v Viết mã nguồn của lớp TruongPhong như hình vẽ § Viết các phương thức khởi tạo cần thiết để khởi tạo các thuộc ‘nh của lớp TruongPhong § Lương của trưởng phòng = Lương Cơ bản * hệ số lương + phụ cấp 65

NhanVien

#tenNhanVien:String #heSoLuong:double +LUONG_CO_BAN:double=750. +LUONG_MAX:double=20.000. +tangLuong(double):boolean +tinhLuong():double +inTTin()

TruongPhong

**- phuCap:double

  • soNamDuongChuc:double +tinhLuong():double +inTTin()**

Bài tập 6

v Viết lớp GiamDoc

cài đặt giao diện

QuanLy

§ Hoa hồng của giám đốc được tính bằng 5% lợi nhuận công ty § Lương giám đốc = lương cơ bản * hệ số lương + phụ cấp + hoa hồng § Tương tự, xây dựng lớp CanBo QuanLy kế thừa lớp NhanVien và thực thi giao diện QuanLy § Hoa hồng được tính bằng 0.2% lợi nhuận công ty § CanBoQuanLy không có phụ cấp NhanVien

  • tenNhanVien: String
  • luongCoBan: double
  • heSoLuong: double
  • LUONG_MAX: double
  • tangHeSoLuong(double): boolean
  • tinhLuong(): double
  • inTTin() GiamDoc
  • phuCap: double
  • loiNhuanCongTy: double
  • tinhLuong(): double
  • inTTin() <> QuanLy
  • tinhHoaHong(): double

Bài tập 7 v Xây dựng các lớp theo sơ đồ lớp 67

68