2.huong Doi Tuong Java.pdf

  • Uploaded by: Cường Khổm
  • 0
  • 0
  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View 2.huong Doi Tuong Java.pdf as PDF for free.

More details

  • Words: 5,391
  • Pages: 72
Chương 2

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG JAVA

Câu hỏi thảo luận

Khác nhau giữa C++ và Java về hướng đối tượng?

Các khái niệm cơ bản  Đối tượng (object): trong thế giới thực khái niệm đối tượng có thể xem như một thực thể: người, vật, bảng dữ liệu,…  Đối tượng giúp hiểu rõ thế giới thực

 Cơ sở cho việc cài đặt trên máy tính  Mỗi đối tượng có định danh, thuộc tính, hành vi

Ví dụ: đối tượng sinh viên MSSV: “TH0701001”; Tên sinh viên: “Nguyễn Văn A”  Hệ thống các đối tượng: là 1 tập hợp các đối tượng  Mỗi đối tượng đảm trách 1 công việc  Các đối tượng có thể quan hệ với nhau  Các đối tượng có thể trao đổi thông tin với nhau  Các đối tượng có thể xử lý song song, hay phân tán

Các khái niệm cơ bản  Lớp (class): là khuôn mẫu (template) để sinh ra đối tượng. Lớp là sự trừu tượng hóa của tập các đối tượng có các thuộc tính, hành vi tương tự nhau, và được gom chung lại thành 1 lớp.

Ví dụ: lớp các đối tượng Sinhviên Sinh viên “Nguyễn Văn A”, mã số TH0701001  1 đối tượng thuộc lớp Sinhviên Sinh viên “Nguyễn Văn B”, mã số TH0701002  là 1 đối tượng thuộc lớp Sinhviên  Đối tượng (object) của lớp: một đối tượng cụ thể thuộc 1 lớp là 1 thể hiện cụ thể của 1 lớp đó.

Lớp và đối tượng trong java

 Khai báo lớp

class { }

Lớp và đối tượng trong java  Thuộc tính: các đặc điểm mang giá trị của đối tượng, là vùng dữ liệu được khai báo bên trong lớp

class { <Tiền tố> ; } Kiểm soát truy cập đối với thuộc tính * public: có thể truy xuất từ bất kỳ 1 lớp khác. * protected: có thể truy xuất được từ những lớp con. * private: không thể truy xuất từ 1 lớp khác. * static: dùng chung cho mọi thể hiện của lớp. * final: hằng * default: (không phải từ khóa) có thể truy cập từ các class trong cùng gói Có thể gán giá trị cho các thuộc tính?

Lớp và đối tượng trong java  Phương thức: chức năng xử lý, hành vi của các đối tượng. class { … <Tiền tố> (){ … } }

Lớp và đối tượng trong java * public: có thể truy cập được từ bên ngoài lớp khai báo. * protected: có thể truy cập được từ lớp khai báo và các lớp dẫn xuất (lớp con). * private: chỉ được truy cập bên trong lớp khai báo.

* static: phương thức lớp dùng chung cho tất cả các thể hiện của lớp, có thể được thực hiện kể cả khi không có đối tượng của lớp * final: không được khai báo chồng ớ các lớp dẫn xuất. * abstract: không có phần source code, sẽ được cài đặt trong các lớp dẫn xuất. * synchoronized: dùng để ngăn những tác động của các đối tượng khác lên đối tượng đang xét trong khi đang đồng bộ hóa. Dùng trong lập trình miltithreads.

Lớp và đối tượng trong java Ví dụ 1: class Sinhvien { // Danh sách thuộc tính String maSv, tenSv, dcLienlac; int tuoi; … // Danh sách các khởi tạo Sinhvien(){} Sinhvien (…) { …} … // Danh sách các phương thức public void capnhatSV (…) {…} public void xemThongTinSV() {…} … }

Lớp và đối tượng trong java … // Tạo đối tượng mới thuộc lớp Sinhvien Sinhvien sv = new Sinhvien(); … // Gán giá trị cho thuộc tính của đối tượng sv.maSv = “TH0601001” ; sv.tenSv = “Nguyen Van A”; sv.tuoi = “20”; sv.dcLienlac = “KP6, Linh Trung, Thu Duc”; … // Gọi thực hiện phương thức sv.xemThongTinSV();

Lớp và đối tượng trong java Ví dụ 2: class Sinhvien { // Danh sách thuộc tính private String maSv; String tenSv, dcLienlac; int tuoi; … } … Sinhvien sv = new Sinhvien(); sv.maSv = “TH0601001”; /* Lỗi truy cập thuộc tính private từ bên ngoài lớp khai báo */ Sv.tenSv = “Nguyen Van A”; …

Lớp và đối tượng trong java  Khởi tạo (constructor): là một loại phương thức đặc biệt của lớp, dùng để khởi tạo một đối tượng.  Dùng để khởi tạo giá trị cho các thuộc tính của đối tượng.  Cùng tên với lớp.  Không có giá trị trả về.  Tự động thi hành khi tạo ra đối tượng (new) Có thể có tham số hoặc không.  Lưu ý: Mỗi lớp sẽ có 1 constructor mặc định (nếu ta không khai báo constructor nào). Ngược lại nếu ta có khai báo 1 constructor khác thì constructor mặc định chỉ dùng được khi khai báo tường minh. Khởi tạo này có thể gọi khởi tạo khác trong cùng lớp?

Có code nào được gọi trước phương thức khởi tạo?

Lớp và đối tượng trong java • Ví dụ 1 class Sinhvien { …

// Không có định nghĩa constructor nào } … // Dùng constructor mặc định

Sinhvien sv = new Sinhvien();

Bài tập

Khai báo lớp PhanSo có các thuộc tính: tử số, mẫu số (số nguyên) và các phương thức: constructor (0, 2 args), nhập, xuất, rút gọn, cộng, trừ, nhân, chia, so sánh (với một phân số khác). Sau đó viết chương trình cho phép nhập vào dãy n phân số, xuất ra: • Các phân số vừa nhập • Tổng các phân số • Xuất danh sách phân số theo thứ tự tăng

Lớp và đối tượng trong java Ví dụ 2: class Sinhvien

class Sinhvien

{

{ …



// không có constructor mặc định

// khai báo constructor mặc định

Sinhvien() {…}

Sinhvien(){} Sinhvien() {…}

}

}





Sinhvien sv = new Sinhvien();

Sinhvien sv = new Sinhvien();

// lỗi biên dịch

Lớp và đối tượng trong java  Overloading method: Việc khai báo trong một lớp nhiều phương thức có cùng tên nhưng khác tham số (khác kiểu dữ liệu, khác số lượng tham số) gọi là khai báo chồng phương thức. Ví dụ:

class Sinhvien { …

public void xemThongTinSV() { … } public void xemThongTinSV(String psMaSv) { … } }

Lớp và đối tượng trong java  Tham chiếu this: là một biến ẩn tồn tại trong tất cả các lớp, this được sử dụng trong khi chạy và tham khảo đến bản thân lớp chứa nó. Ví dụ:

class Sinhvien

{

String

maSv, tenSv, dcLienlac;

int

tuoi;

… public void xemThongTinSV() { System.out.println(this.maSv); System.out.println(this.tenSv); … } }

Nested Classes

Phân loại  Non-static   

Inner Local method Anonymous

 Static

Inner class

Inner class

Inner class

Local Method public class LocalMethodTest { static void printLine() { class MethodInnerClass { void print() { System.out.println("Hello World"); } } MethodInnerClass inner = new MethodInnerClass(); inner.print(); } public static void main(String[] args) { printLine(); } }

Anonymous inner class abstract class AbstractClass { abstract void print(); } public class AnonymousClassTest { public static void main(String[] args) { AbstractClass ac = new AbstractClass(){ void print() { System.out.println("Test Anonymous class"); } }; ac.print(); } }

Anonymous inner class là tham số abstract class Message { abstract String getMessage(); } public class MyClass { void displayLine(Message ac) { System.out.println(ac.getMessage()); } public static void main(String[] args) { MyClass mc = new MyClass(); mc.displayLine(new Message(){ String getMessage() { return "Hello"; } }); }

Static nested class public class StaticInnerTest { static class Inner { void print() { System.out.println("Hello"); } } public static void main(String[] args) { StaticInnerTest.Inner in = new StaticInnerTest.Inner(); in.print(); } }

Tính đóng gói  Đóng gói: nhóm những gì có liên quan với nhau vào thành một và có thể sử dụng một cái tên để gọi.

Ví dụ:  Các phương thức đóng gói các câu lệnh.  Đối tượng đóng gói dữ liệu và các hành vi/phương thức liên quan. (Đối tượng = Dữ liệu + Hành vi/Phương thức)

Tính đóng gói  Đóng gói: dùng để che dấu một phần hoặc tất cả thông tin, chi tiết cài đặt bên trong với bên ngoài. • Ví dụ: khai báo các lớp thuộc cùng gói trong java package ; // khai báo trước khi khai báo lớp

class { … }

Tính kế thừa Đối tượng hình học

Hình 2d

Tròn

E-líp

Vuông Chữ nhật

Hình 3d

Cầu

Lập phương …

• Thừa hưởng các thuộc tính và phương thức đã có • Bổ sung, chi tiết hóa cho phù hợp với mục đích sử dụng mới  Thuộc tính: thêm mới  Phương thức: thêm mới hay hiệu chỉnh

Trụ

Tính kế thừa  Lớp dẫn xuất hay lớp con (SubClass)  Lớp cơ sở hay lớp cha (SuperClass)  Lớp con có thể kế thừa tất cả hay một phần các thành phần dữ liệu (thuộc tính), phương thức của lớp cha (public, protected, default)

 Dùng từ khóa extends.

Ví dụ: class nguoi { … } class sinhvien extends nguoi { … } Phạm vi kế thừa? Gọi khởi tạo lớp cha?

Tính kế thừa  Overriding Method - Được định nghĩa trong lớp con - Có tên, kiểu trả về & các đối số giống với phương thức của lớp cha

- Có kiểu, phạm vi truy cập ko “nhỏ hơn” phương thức trong lớp cha

private

default

protected

public

Tính kế thừa •Ví dụ: class Hinhhoc { … public float tinhdientich() { return 0; } … } class HinhVuong extends Hinhhoc { private int canh; public float tinhdientich() { return canh*canh; } … }

Chỉ có thể public do phương thức tinhdientich() của lớp cha là public

Tính kế thừa class HinhChuNhat extends HinhVuong {

private int cd; private int cr; public float tinhdientich() { return cd*cr;

} … }

Chỉ có thể public do phương thức tinhdientich() của lớp cha là public

Lớp Object Cây kế thừa trong Java chỉ có 1 gốc.

Mọi lớp đều kế thừa trực tiếp hoặc gián tiếp từ lớp Object. Phương thức của lớp Object clone equals finalize getClass hashCode notify, notifyAll, wait toString

Từ khóa super Gọi constructor của lớp cha

Nếu gọi tường minh thì phải là câu lệnh đầu tiên Constructor cuối cùng được gọi là của lớp Object Truy cập đến thuộc tính bị che ở lớp cha

36

CommissionEmployee.java 1

// Fig. 9.15: CommissionEmployee4.java

2 3

// CommissionEmployee4 class represents a commission employee.

4 5 6

public class CommissionEmployee { private String firstName;

7

private String lastName;

8 9 10 11

private String socialSecurityNumber; private double grossSales; // gross weekly sales private double commissionRate; // commission percentage

12

// five-argument constructor

13

public CommissionEmployee( String first, String last, String ssn,

14 15 16

double sales, double rate ) { // implicit call to Object constructor occurs here

Constructor outputs message to demonstrate method call order

17 18

firstName = first; lastName = last;

19 20

socialSecurityNumber = ssn; setGrossSales( sales ); // validate and store gross sales

21

setCommissionRate( rate ); // validate and store commission rate

22 23 24 25

System.out.printf( "\nCommissionEmployee4 constructor:\n%s\n", this ); } // end five-argument CommissionEmployee4 constructor

 CommissionEmployee.java 27

// set first name

28

public void setFirstName( String first )

29 30 31

{ firstName = first; } // end method setFirstName

32 33

// return first name

34 35

public String getFirstName() {

36 37 38

return firstName; } // end method getFirstName

39 40 41 42

// set last name public void setLastName( String last ) { lastName = last;

43 44 45 46

} // end method setLastName

47 48 49

{ return lastName; } // end method getLastName

50 51

// set social security number

52 53

public void setSocialSecurityNumber( String ssn ) {

54 55

socialSecurityNumber = ssn; // should validate } // end method setSocialSecurityNumber

// return last name public String getLastName()

37

38

57

// return social security number

58 59

public String getSocialSecurityNumber() {

60 61

return socialSecurityNumber; } // end method getSocialSecurityNumber

62 63

// set gross sales amount

64 65

public void setGrossSales( double sales ) {

66 67

grossSales = ( sales < 0.0 ) ? 0.0 : sales; } // end method setGrossSales

68 69 70 71

// return gross sales amount public double getGrossSales() {

72

return grossSales;

73 74

} // end method getGrossSales

75

// set commission rate

76

public void setCommissionRate( double rate )

77

{

78 79 80

commissionRate = ( rate > 0.0 && rate < 1.0 ) ? rate : 0.0; } // end method setCommissionRate

39

81

// return commission rate

82

public double getCommissionRate()

83 84

{

85

} // end method getCommissionRate

return commissionRate;

86 87 88

// calculate earnings public double earnings()

89

{

90 91

return getCommissionRate() * getGrossSales(); } // end method earnings

92 93 94

// return String representation of CommissionEmployee4 object public String toString()

95

{

96

return String.format( "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f",

97 98

"commission employee", getFirstName(), getLastName(), "social security number", getSocialSecurityNumber(),

99 100

"gross sales", getGrossSales(), "commission rate", getCommissionRate() );

101 102

} // end method toString } // end class CommissionEmployee4

40

1

// Fig. 9.16: BasePlusCommissionEmployee5.java

2

// BasePlusCommissionEmployee5 class declaration.

3 4

public class BasePlusCommissionEmployee extends CommissionEmployee

5 6

{ private double baseSalary; // base salary per week

7 8

// six -argument constructor

9 10

public BasePlusCommissionEmployee ( String first, String last, String ssn, double sales, double rate, double salary )

11

{

12 13

super( first, last, ssn, sales, rate ); setBaseSalary( sa lary ); // validate and store base salary

14 15

System.out.printf(

16 17

"\nBasePlusCommissionEmployee5 constructor: \n%s\n", this ); } // end six -argument BasePlusCommissionEmployee5 constructor

18 19

// set base salary

20 21

public void setBaseSalary( double salary ) {

22 23 24

baseSalary = ( salary < 0.0 ) ? 0.0 : salary; } // end method setBaseSalary

Constructor outputs message to demonstrate method call order.

41

25 // return base salary 26 public double getBaseSalary() 27 { 28 return baseSalary; 29 } // end method getBaseSalary 30 31 // calculate earnings 32 public double earnings() 33 { 34 return getBaseSalary() + super.earnings(); 35 } // end method earnings 36 37 // return String representation of BasePlusCommissionEmployee5 38 public String toString() 39 { 40 return String.format( "%s %s\n%s: %.2f", "base-salaried", 41 super.toString(), "base salary", getBaseSalary() ); 42 } // end method toString 43 } // end class BasePlusCommissionEmployee5

1 // Fig. 9.17: ConstructorTest.java 2 // Display order in which superclass and subclass constructors are called. 3 4 public class ConstructorTest 5 6 7 8 9 10

{ public static void main( String args[] ) {

"Bob", "Lewis" , "333 -33-3333" , 5000, .04 ); System.out.println();

12 13

BasePlusCommissionEmployee employee2 = new BasePlusC ommissionEmployee (

16 17 18 19 20

Instantiate CommissionEmployee4 object

CommissionEmployee employe e1 = new CommissionEmployee (

11

14 15

42

"Lisa", "Jones" , "555-55-5555", 2000, .06, 800 ); System.out.println(); BasePlusCommissionEmployee employee3 = new BasePlusCommi ssionEmployee ( "Mark", "Sands" , "888-88-8888", 8000, .15, 2000 ); } // end main

21 } // end class ConstructorTest

Instantiate two BasePlusCommissionE mployee5 objects to demonstrate order of subclass and superclass constructor method calls.

43

CommissionEmployee4 constructor: commission employee: Bob Lewis social security number: 333-33-3333 gross sales: 5000.00 commission rate: 0.04 CommissionEmployee4 constructor: base-salaried commission employee: Lisa Jones social security number: 555-55-5555 gross sales: 2000.00 commission rate: 0.06 base salary: 0.00 BasePlusCommissionEmployee5 constructor: base-salaried commission employee: Lisa Jones social security number: 555-55-5555 gross sales: 2000.00 commission rate: 0.06 base salary: 800.00 CommissionEmployee4 constructor: base-salaried commission employee: Mark Sands social security number: 888-88-8888 gross sales: 8000.00 commission rate: 0.15 base salary: 0.00 BasePlusCommissionEmployee5 constructor: base-salaried commission employee: Mark Sands social security number: 888-88-8888 gross sales: 8000.00 commission rate: 0.15 base salary: 2000.00

Subclass BasePlusCommissionEmpl oyee5 constructor body executes after superclass CommissionEmployee4’s constructor finishes execution.

Tính kế thừa • Lớp final: là lớp không cho phép các lớp khác dẫn xuất từ nó hay lớp final không thể có lớp con.  Định nghĩa dùng từ khóa final

public final class A {

… }

Tính đa hình  Đa hình: cùng một phương thức có thể có những cách thi hành khác nhau.  Interface: được cài đặt bỡi các lớp con để triển khai một phương thức mà lớp muốn có.

Tính đa hình  Lớp trừu tượng: là lớp dùng để thể hiện sự trừu tượng hóa ớ mức cao. Ví dụ: lớp “Đối tượng hình học”, “Hình 2D”, “Hình 3D” (Ví dụ định nghĩa lớp các đối tượng hình học cơ bản)  Từ khóa abstract: để khai báo một lớp abstract.

Lớp abstract không thể tạo ra đối tượng.

Giao tiếp - interface  Interface: giao tiếp của một lớp, là phần đặc tả (không có phần cài đặt cụ thể) của lớp, nó chứa các khai báo phương thức và thuộc tính để bên ngoài có thể truy xuất được. (java, C#, …)  Lớp sẽ cài đặt các phương thức trong interface.  Trong lập trình hiện đại các đối tượng không đưa ra cách truy cập cho một lớp, thay vào đó cung cấp các interface. Người lập trình dựa vào interface để gọi các dịch vụ mà lớp cung cấp.  Thuộc tính của interface là các hằng và các phương thức của giao tiếp là trừu tượng (mặc dù không có từ khóa abstract).

Giao tiếp - interface Ví dụ: // Định nghĩa một interface Shape trong tập tin shape.java public interface Shape {

// Tính diện tích public abstract double area(); // Tính thể tích

public abstract double volume(); // trả về tên của shape public abstract String getName(); }

Giao tiếp - interface // Lớp Point cài đặt/hiện thực interface tên shape. // Định nghĩa lớp Point trong tập tin Point.java public class Point extends Object implements Shape { protected int x, y; // Tọa độ x, y của 1 điểm // constructor không tham số. public Point() { setPoint( 0, 0 ); } // constructor có tham số. public Point(int xCoordinate, int yCoordinate) { setPoint( xCoordinate, yCoordinate ); }

Giao tiếp - interface // gán tọa độ x, y cho 1 điểm public void setPoint( int xCoordinate, int yCoordinate ) { x = xCoordinate; y = yCoordinate; } // lấy tọa độ x của 1 điểm public int getX() { return x; } // lấy tọa độ y của 1 điểm public int getY() { return y; }

Giao tiếp - interface // Thể hiện tọa độ của 1 điểm dưới dạng chuỗi public String toString() { return "[" + x + ", " + y + "]"; } // Tính diện tích public double area() { return 0.0; } // Tính thể tích public double volume() { return 0.0; }

Giao tiếp - interface

// trả về tên của đối tượng shape public String getName() { return "Point"; } } // end class Point

Giao tiếp - interface  Kế thừa interface

public interface InterfaceName extends interface1, interface2, interface3 { // … }

Ví dụ

54

55

Payable.java 1

// Fig. 10.11: Payable.java

2

// Payable interface declaration.

3 4

public interface Payable

5

{

6 7

Declare interface Payable

double getPaymentAmount(); // calculate payment; no implementation } // end interface Payable

Declare getPaymentAmount method which is implicitly public and abstract

1 2

// Fig. 10.12: Invoice.java // Invoice class implements Payable.

56

3 4

public class Invoice implements Payable

5 6

{

7 8 9 10 11 12 13 14 15 16 17 18 19 20

private String partNumber; private String partDescription; private int quantity; private double pricePerItem;

// four-argument constructor public Invoice( String part, String description, int count, double price ) { partNumber = part; partDescription = description; setQuantity( count ); // validate and store quantity setPricePerItem( price ); // validate and store price per item } // end four-argument Invoice constructor

21

// set part number

22

public void setPartNumber( String part ) {

23 24 25 26

Class Invoice implements interface Payable

partNumber = part; } // end method setPartNumber

 Invoice.java

27 28

// get part number public String getPartNumber()

29

{

30 31

return partNumber; } // end method getPartNumber

32 33 34 35

// set description public void setPartDescription( String description ) {

36 37 38 39 40 41 42

partDescription = description; } // end method setPartDescription

43 44 45 46 47 48 49

} // end method getPartDescription

50 51 52 53 54 55 56

// get description public String getPartDescription() { return partDescription;

// set quantity public void setQuantity( int count ) { quantity = ( count < 0 ) ? 0 : count; // quantity cannot be negative } // end method setQuantity // get quantity public int getQuantity() { return quantity; } // end method getQuantity

57

 Invoice.java 

(2 of 3)

57 58

// set price per item public void setPricePerItem( double price )

59 60 61

{ pricePerItem = ( price < 0.0 ) ? 0.0 : price; // validate price } // end method setPricePerItem

62 63 64 65

// get price per item public double getPricePerItem() {

66 67

return pricePerItem; } // end method getPricePerItem

Outline Invoice.java

68 69 70

// return String representation of Invoice object public String toString()

71 72

{ return String.format( "%s: \n%s: %s (%s) \n%s: %d \n%s: $%,.2f", "invoice", "part number", getPartNumber(), getPartDescription(),

73 74 75 76 77

"quantity", getQuantity(), "price per item", getPricePerItem() ); } // end method toString

78

public double getPaymentAmount()

79 80 81

{

// method required to carry out contract with interface Payable

return getQuantity() * getPricePerItem(); // calculate total cost } // end method getPaymentAmount

82 } // end class Invoice

Declare getPaymentAmount to fulfill contract with interface Payable

58

59

Employee.java 1

// Fig. 10.13: Employee.java

2

// Employee abstract superclass implements Payable.

3 4

public abstract class Employee implements Payable

5

{

6

private String firstName;

7

private String lastName;

8

private String socialSecurityNumber;

9 10

// three-argument constructor

11

public Employee( String first, String last, String ssn )

12

{

13

firstName = first;

14

lastName = last;

15

socialSecurityNumber = ssn;

16 17

} // end three-argument Employee constructor

Class Employee implements interface Payable

18 19

// set first name public void setFirstName( String first )

20 21 22

{



24 25 26 27

// return first name public String getFirstName() {

28 29

} // end method getFirstName

30 31

// set last name public void setLastName( String last )

32 33 34

{

39 40 41

 Employee.java

firstName = first; } // end method setFirstName

23

35 36 37 38

60

return firstName;

lastName = last; } // end method setLastName // return last name public String getLastName() { return lastName; } // end method getLastName

(2 of 3)

42

// set social security number

43 44 45 46

public void setSocialSecurityNumber( String ssn ) { socialSecurityNumber = ssn; // should validate } // end method setSocialSecurityNumber

61

Employee.java

47 48 49

// return social security number public String getSocialSecurityNumber()

50

{

51 52 53

return socialSecurityNumber; } // end method getSocialSecurityNumber

54 55 56

// return String representation of Employee object public String toString() {

57 58 59 60

return String.format( "%s %s\nsocial security number: %s", getFirstName(), getLastName(), getSocialSecurityNumber() ); } // end method toString

61 // Note: We do not implement Payable method getPaymentAmount here so 62 // this class must be declared abstract to avoid a compilation error. 63 } // end abstract class Employee

getPaymentAmount method is not implemented here

1

// Fig. 10.14: SalariedEmployee.java

2

// SalariedEmployee class extends Employee, which implements Payable.

3 4

public class SalariedEmployee extends Employee

5

{

62

Class SalariedEmployee extends class Employee (which implements interface Payable)

6 7 8

private double weeklySalary;

9 10 11

public SalariedEmployee( String first, String last, String ssn, double salary ) {

12

super( first, last, ssn ); // pass to Employee constructor setWeeklySalary( salary ); // validate and store salary } // end four-argument SalariedEmployee constructor

13 14

// four-argument constructor

15 16 17

// set salary public void setWeeklySalary( double salary )

18 19 20 21

{ weeklySalary = salary < 0.0 ? 0.0 : salary; } // end method setWeeklySalary

SalariedEmployee.java

22

// return salary

23

public double getWeeklySalary() {

24

return weeklySalary;

25 26

63

} // end method getWeeklySalary

27 28 29 30 31 32 33 34

// calculate earnings; implement interface Payable method that was // abstract in superclass Employee public double getPaymentAmount() { return getWeeklySalary(); } // end method getPaymentAmount

Declare getPaymentAmount method instead of earnings method

36

// return String representation of SalariedEmployee object public String toString()

37

{

35

38 return String.format( "salaried employee: %s\n%s: $%,.2f", 39 super.toString(), "weekly salary", getWeeklySalary() ); 40 } // end method toString 41 } // end class SalariedEmployee

1

// Fig. 10.15: PayableInterfaceTest.java

2

// Tests interface Payable.

3 4

public class PayableInterfaceTest

5

{

6 7 8

public static void main( String args[] ) { // create four-element Payable array

64

Declare array of Payable variables

9 10 11

Payable payableObjects[] = new Payable[ 4 ];

12

payableObjects[ 0 ] = new Invoice( "01234", "seat", 2, 375.00 ); payableObjects[ 1 ] = new Invoice( "56789", "tire", 4, 79.95 ); payableObjects[ 2 ] =

13 14 15 16 17 18 19 20 21

// populate array with objects that implement Payable

Assigning references to Invoice new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 ); objects to payableObjects[ 3 ] = new SalariedEmployee( "Lisa", "Barnes", "888-88-8888", 1200.00 ); Payable variables System.out.println( Assigning references to "Invoices and Employees processed polymorphically:\n" ); SalariedEmployee objects to Payable variables

22

// generically process each element in array payableObjects

23

for ( Payable currentPayable : payableObjects )

24 25

{

26 27 28 29

// output currentPayable and its appropriate payment amount

Outline

System.out.printf( "%s \n%s: $%,.2f\n\n", currentPayable.toString(), "payment due", currentPayable.getPaymentAmount() ); } // end for

30 } // end main 31 } // end class PayableInterfaceTest Invoices and Employees processed polymorphically: invoice: part number: 01234 (seat) quantity: 2 price per item: $375.00 payment due: $750.00 invoice: part number: 56789 (tire) quantity: 4 price per item: $79.95 payment due: $319.80 salaried employee: John Smith social security number: 111-11-1111 weekly salary: $800.00 payment due: $800.00 salaried employee: Lisa Barnes social security number: 888-88-8888 weekly salary: $1,200.00 payment due: $1,200.00

Call toString and getPaymentAmount methods polymorphically

65

Quan hệ giữa Class và Interface

Class

Interface

Class

Interface

extends

implements

extends

Câu hỏi ôn tập  Phạm vi khai báo thuộc tính?  Phạm vi khai báo phương thức?  Các định nghĩa phương thức bên ngoài lớp?  Constructor:   

Đặc điểm? Gọi một constructor khác? Copy constructor?

 Nested class: loại và cách sử dụng?  Cách overload operator?

Câu hỏi ôn tập  Ý nghĩa, trường hợp sử dụng?

this  supper  Kế thừa  Cách khai báo?  Phạm vi kế thừa?  Gọi khởi tạo, phương thức của superclass?  Đa/đơn kế thừa  Đối tượng kiểu lớp cha có thể gọi các phương thức thuộc lớp con?  Lớp object 

 Phạm vi của phương thức được override?

Câu hỏi ôn tập  Abstract class  

Cách khai báo VS class thông thường?

 Interface là gì?   



Cách khai báo Phạm vi các phương thức? Phạm vi các thuộc tính? Có thể tạo đối tượng?

 Interface vs class 



Giống? Khác?

BÀI TẬP 1.

2.

3.

Xây dựng lớp Point2D biểu diễn điểm trong mặt phẳng 2 chiều và các phương thức khởi tạo, lấy và thiết lập giá trị các thuộc tính, di chuyển, tính khoảng cách giữa 2 điểm, nhập, xuất. Trong hàm main cho phép nhập vào 2 điểm và một vector (để di chuyển) và xuất ra kết quả của việc di chuyển các điểm và khoảng cách giữa 2 điểm. Viết chương trình tạo lớp Time biểu diễn thời gian gồm: giờ, phút, giây và các phương thức: khởi tạo, lấy và thiết lập giá trị các thuộc tính, tăng giây lên 1 đơn vị, so sánh 2 đối tượng thời gian. Trong hàm main, nhập vào 2 thời gian, xuất ra thời gian lớn hơn và gọi hàm tăng thời gian (thứ nhất) mỗi giây. Tạo lớp Person gồm các thuộc tính: họ tên, tuổi và địa chỉ và các phương thức: khởi tạo, hiện thị thông tin. Tạo lớp NhanVien kế thừa từ lớp Nguoi và có thêm thuộc tính: lương cơ bản và hệ số có phương thức khởi tạo, tính lương (lương cơ bản * hệ số). Trong hàm main nhập vào danh sách các nhân viên và xuất ra tổng lương và nhân viên có lương cao nhất.

BÀI TẬP 4. Khai báo lớp Shape là lớp trừu tượng, có phương thức tính diện tích và phương thức toString (xuất ra tên hình và diện tích). Xây dựng lớp Rectangle và Circle kế thừa lớp Shape để định nghĩa hình chữ nhật và hình tròn. Trong hàm main cho phép nhập vào các hình và đếm xem có bao nhiêu hình chữ nhật, hình tròn và xuất ra hình có diện tích lớn nhất. 5. Viết chương trình quản lý sinh viên gồm các tính năng: -Nhập danh sách sinh viên -Xem danh sách sinh viên -Sắp xếp và hiển thị danh sách sinh viên theo điểm trung bình tăng dần -Tìm kiếm sinh viên theo tên (tên cần tìm do người dùng nhập) -Xuất ra thông tin các sinh viên có họ là “Lê” 6. Viết chương trình tạo và sử dụng lớp số phức Complex gồm 2 thuộc tính: thực và ảo và các phương thức: khởi tạo, cộng, trừ, nhân, chia hai số phức, hiển thị thông tin số phức theo dạng: thực + ảo * i. 7. Xây dựng giao diện Measurable có phương thức Valuate có kiểu là số thực. Xây dựng lớp NhanVien (họ tên, mã nhân viên số giờ làm, giá theo giờ, lương = số giờ * giá theo giờ) hiện thực giao diện Measurable (Valuate trả về lương nhân viên). Xây dựng lớp SinhVien (họ tên, mã sv, điểm toán, lý, hóa, ĐTB là trung bình của 3 môn) hiện thực giao diện Measurable (Valuate trả về điểm trung bình). Nhập vào n nhân viên, m sinh viên và tính lương trung bình của các nhân viên, điểm trung bình của các sinh viên vừa nhập. Yêu cầu: quản lý nhân viên và sinh viên chung 1 danh sách.

BÀI TẬP 8. Viết chương trình tạo và sử dụng lớp MyMath biểu diễn lớp toán học gồm các phương thức static: Tìm ước chung lớn nhất của 2 số nguyên Tìm giá trị lớn nhất của 3 số thực Tìm giá trị nhỏ nhất của 3 số thực Kiểm tra một số có là số nguyên tố Tính tổng dãy từ 1 đến N Tính trị tuyệt đối của 1 số nguyên Làm tròn một số thực 9. Viết chương trình quản lý nhân sự một công ty gồm các thành phần: Giám đốc: gồm các thuộc tính họ tên, ngày sinh, hệ số lương, hệ số chức vụ Quản lý: gồm các thuộc tính họ tên,

ngày sinh, hệ số lương, số lương nhân viên quản lý Nhân viên: gồm các thuộc tính họ tên, ngày sinh, hệ số lương, tên đơn vị (phòng/ban) Chương trình thực hiện các yêu cầu sau: -

-

-

-

-

Nhập vào danh sách gồm N nhân viên của công ty Hiển thị thông tin các nhân viên Xuất nhân viên có lương cao nhất (lương = (hệ số lương + hệ số chức vụ (nếu có)) * 1200000 Hiển thị các nhân viên sinh trong tháng 2 Xuất thông tin nhân viên thuộc phòng Kế toán Đếm xem có bao nhiêu nhân viên tên An.

Related Documents


More Documents from ""

Tata Surya.docx
May 2020 10