Khái niệm đối tượng Đối tượng là một thể hiện của một lớp Mỗi đối tượng có các hành vi được định nghĩa bởi các phương thức mà ta có thể gọi ◦ Ta có thể làm gì với đối tượng này?. C
Trang 1Chapter 4
Java Classes & Objects
Trang 3 Mỗi đối tượng chịu trách nhiệm thực hiện
một tập tác vụ có liên quan với nhau
Đối tượng có thể yêu cầu một đối tượng
◦ “If I can’t do it, then I’ll ask somebody who
can.”
Các đối tượng tương tác với nhau bằng
cách gởi thông điệp
Chương trình được tạo thành từ các đối tượng
Trang 4 Mẫu (khung thức) mà từ đó các đối
tượng thực sự được tạo ra
Trang 5Class components
Data members (Attributes) Method 1 Method 2
La dơn vị cơ bản trong
lập trình Java
Classes
Trang 6[<phạm vi hoặc kiểm soát truy nhập>]
[extends <Tên lớp cha>]
[implements<tên giao diện>]
{ <Các thành phần của lớp>
}
class, extends, implements: từ khóa
Các kiểu lớp trong Java:
Định nghĩa lớp
Trang 7 Một chương trình có thể có
nhiều lớp và các lớp có
thể:
◦ Trong 1 file duy nhất.
◦ Trong nhiều file khác nhau,
và các file này có thể nằm
trong cùng một Package hay
nằm trong nhiều Package
khác nhau
class
class abc { class cdf { void method1() {}
void method2() {}
} class ghk { }
public static void main(String[] args) {
} }
Trang 8 Lớp được sử dụng khi chương trình cần một đối tượng có kiểu của lớp đó.
<tên lớp> <tên đối tượng> = new <tên lớp>();
Ví dụ
Person myClass = new Person();
Sử dụng class
Trang 9 Hàm: Hành vi của các đối tượng trong một lớp
Cú pháp định nghĩa:
[<Phạm vi hoặc thuộc tính kiểm soát truy
nhập>]<Kiểu trả về><Tên phương thức>
([<Danh sách tham biến hình thức>])
Trang 10 The flow of control following method
invocations
Method
Trang 11Ex: Lớp RectangleDemo
• Để có thể thực thi, chương trình Java phải có một lớp
định nghĩa phương thức main
• Phương thức main() được gọi bởi JVM để bắt đầu
chương trình.
Trang 12Khái niệm đối tượng
Đối tượng là một thể hiện của một lớp
Mỗi đối tượng có các hành vi được định
nghĩa bởi các phương thức mà ta có thể gọi
◦ Ta có thể làm gì với đối tượng này?
◦ Các phương thức nào ta có thể áp dụng cho nó?
Trang 13Tạo đối tượng
• Một đối tượng phải được tạo trước khi sử dụng trong một chương trình
Trang 14Syntax to access the
data members of a class
outside the class:
g.drawOval(x,y,radius,radius);
} }
Accessing data members of a class
Trang 15 Chỉ ra mức độ truy xuất được cho phép đối với
các thành phần dữ liệu và các phương thức của đối tượng
◦ public : có thể được truy cập mọi nơi trong hệ thống và được thừa kế bởi các lớp con của nó
◦ private : có thể được truy cập trong chính lớp đó Không cho phép kế thừa
◦ protected : có thể được truy cập và thừa kế bởi các lớp con và có thể truy xuất bởi mã lệnh của cùng gói đó
◦ Defaul t (không khai báo 3 kiểu trên): chỉ cho phép truy nhập đối với các lớp trong cùng gói, kể cả các lớp con Không cho phép kế thừa.
Access modifer
Trang 16Public-ex
Trang 17Protected-ex
Trang 18Private
Trang 19Default
Trang 20 Khi khai báo các thành phần của lớp:
◦ có staitc: những thành phần đó dùng chung cho tất
cả đối tượng trong một lớp
◦ Không có static: thường mỗi biến đều có bản sao
các giá trị riêng của từng đối tượng.
Truy nhập tới các thuộc tính dữ liệu static có thể thực hiện
◦ Thông qua tên lớp
◦ Thông qua tên đối tượng
Đặc tính Static
Trang 21class varStatic { int x=2;
static int y=3;
varStatic(){
x++; y++; }
public static void main(String[] args){
varStatic So = new varStatic();
Trang 22class methodStatic { private int x=2;
private static int y=3;
public static void setxy () {
x++; //error
y++; }
public static void main(String[] args){
methodStatic So2 = new methodStatic();
Trang 23 Toán tử móc xích giữa các lớp kế thừa
Ngăn kế thừa với khai báo final
Thừa kế (Inheritance)
Trang 24Thừa kế (Inheritance)
• Tạo ra một lớp mới từ lớp có sẵn
• Sử dụng lại thuộc tính và phương thức
Trang 25 Superclass (Base class)
◦ Là lớp mà từ đó lớp con được dẫn xuất
◦ Có thể gọi là lớp cơ sở hoặc lớp cha
Subclass (Derived class)
Trang 26 Sử dụng từ khoá extends để khai báo sự thừa kế
Một lớp có thể dẫn xuất trực tiếp từ duy nhất một
lớp (đơn thừa kế)
Nếu một lớp không có bất kỳ lớp cha nào thì mặc
nhiên nó cũng được dẫn xuất từ lớp Object
◦ Lớp Object là cha của tất cả các lớp trong Java
Một lớp con có thể thừa kế tất cả các thành phần
được khai báo protected và public của lớp cha
Inheritance
Trang 27class Parent {
…
}
class Child1 extends Parent {
//Các thuộc tính dữ liệu bổ sung
Trang 28Ví dụ về thừa kế
Trang 29Inheriting a class does not
overrule the private access
restriction Thus, even
though a subclass includes
all of the members of its
superclass, it cannot access
those members of the
superclass that have been
declared private
class vdInher {
private double width;
private double height;
void showDim() { System.out.println("Width and height are:“+width + " and " + height);
} public static void main(String[] args){
Triangle ve1 = new Triangle();
ve1.showDim();
System.out.println(ve1.area());
ve1.showStyle();
} }
class Triangle extends vdInher { String style;
double area() {
Member access & Inheritance
Trang 30class vdPrivate
{
private double width;
private double height ;
Trang 31 Constructor:
◦ là một phương thức đặc biệt (không có hoặc có
nhiều tham số)
◦ không có giá trị trả về và có tên trùng với tên lớp
◦ đặt các giá trị khởi tạo cho các đối tượng
◦ khi một đối tượng được tạo, dùng với toán tử new
◦ Có thể có nhiều hơn một constructor
Trường hợp không có constructor: trình biên dịch sẽ cung cấp constructor mặc định (không làm gì cả, null, false,0) cho lớp đó.
Constructor – toán tử tạo lập
Trang 32[<thuộc tính>] <tên lớp> (<ds tham biến>){
// Nội dung cần tạo lập
Trang 33Class without constructor Class with constructor
class VdConstructor { private int x,y;
System out.println(So.x);
class VdConstructor {
private int x,y;
public static void
Trang 34Nhiều Constructor
Trang 35 trình biên dịch sẽ tự động chèn lời gọi tới Constructor
mặc nhiên (implicity) hoặc Constructor không tham số
(explicity) của lớp cha trước khi thực thi đoạn code khác trong Constructor lớp con
◦ Có gọi tường minh constructor của lớp cha bằng cách sử dụng từ khoá super trong phần đặc tả constructor của lớp dẫn xuất
Trang 36Chuỗi constructor
Parent
F1
F2
Trang 37Chuỗi constructor
• Thể hiện của lớp dẫn xuất
luôn gọi constructor của
lớp cơ sở trước rồi mới
đến constructor của lớp
dẫn xuất
Trang 38Các nguyên tắc của Constructor
Constructor mặc nhiên (default constructor)
sẽ tự động sinh ra bởi trình biên dịch nếu lớp không khai báo Constructor.
Trang 39Ex: Parent()
Trang 40Ex ?: Parent() default
Trang 41 Các toán tử tạo lập:
◦ có thể được nạp chồng (Overloading) trong cùng
1 lớp.
◦ không thể viết đè (Override) ở các lớp con
Java có 2 toán tử tạo lập: this() và super()
◦ This(): sử dụng để tạo ra đối tượng của cùng lớp hiện thời
◦ Supper(): được sử dụng trong các toán tử tạo
lập của lớp con để truy xuất đến các thành phần
và constructor của lớp cha từ lớp con
Toán tử móc xích giữa các lớp kế thừa
Trang 42class Ve2C{
protected double x,y ;
public Ve2C(double x,double y)
Trang 43} methodB(int k){
super.methodA(k) ; }
} // end class B
Trang 44class Ve3C extends Ve2C {
Trang 45Triệu hồi tường minh Constructor lớp cha (explicitly)
Trang 46Ví dụ
Trang 47 Nạp chồng các phương thức (overloading):
cùng 1 tên,
cùng lớp
khác nhau về danh sách tham số
khác nhau về số lượng hoặc
khác nhau về thứ tự các kiểu.
Ex, JDK API có lớp java.lang.Math có nhiều hàm nạp chồng (min())
Nạp chồng các phương thức
Trang 48class TinhToan {
public static void main(String[] args) {
Tinh c = new Tinh();
Trang 49Ghi đè phương thức
Ghi đè phương thức (Overriding) là:
◦ Lớp con định nghĩa phương thức mới có cùng
dấu hiệu với phương thức ở lớp cha (khác lớp)
Dấu hiệu(signature) bao gồm:
Trang 50class vd1 {
public static void main(String[] args) {
Child c= new Child();
c.Infor();
}
}
class Parent {
public void Infor(){
System out println( "Calling Parent " );
}
}
class Child extends Parent {
Ex: overriding
Trang 52Biến, phương thức và lớp Final
Biến Final - Final Variables
Phương thức Final - Final Methods
Lớp Final - Final Classes
Trang 53Biến Final
Từ khóa “ final ” được sử dụng với biến để chỉ
rằng giá trị của biến là hằng số.
Hằng số là giá trị được gán cho biến vào thời
điểm khai báo và sẽ không thay đổi về sau.
Trang 54Phương thức hằng (Final)
Được sử dụng để ngăn chặn việc ghi đè (overriding) hoặc
che lấp (hidden) trong các lớp Java.
Phương thức được khai báo là private hoặc là một thành
phần của lớp final thì được xem là phương thức hằng.
Phương thức hằng không thể khai báo là trừu tượng
(abstract).
Trang 55 Các phương thức được khai báo là final không thể được nạp chồng
class A {
final void method (){
} } class B extends A{
final void method (){ // error }
ex
Trang 56Lớp hằng - Final Classes
Là lớp không có lớp con.
Đượ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.
Là lớp có thể hoặc không có các phương thức hằng.
Lớp hằng có thể tạo đối tượng
Trang 571 Cú pháp lời gọi hàm
2 Các cách truyền tham số
Truyền theo tham trị:
• Các tham biến hình thức có kiểu nguyên thủy
Truyền theo tham biến
• Các tham biến hình thức có kiểu class
• Các tham biến hình thức có kiểu array
3 Các tham biến final.
Truyền tham số và các lời gọi hàm
57
Trang 58 Các đối tượng trong ct trao đổi với nhau thông qua các thông điệp – được cài đặt như lời gọi hàm.
Trang 59 Cách truyền các giá trị phụ thuộc vào kiểu của các tham biến hình thức
Cách truyền các tham số
59
Kiểu của tbht Giá trị được truyền
Kiểu nguyên thủy Kiểu nguyên thủy
(Tham trị) Kiểu lớp Giá trị tham chiếu Kiểu mảng Giá trị tham chiếu
Trang 60 Khi tham biến hình thức có kiểu nguyên thủy thì giá trị của các biến được sao chép sang biến hình thức
Gọi là truyền theo tham trị:
◦ ->Mọi thay đổi của biến hình thức không ảnh hưởng đến tham biến hiện thời
Truyền các giá trị kiểu nguyên thủy
60
Trang 61class Thamtri { public int test(int i,int j) {
System.out.println("Gia tri cua ham test tdoi: "+ ex.test(a, b));
System.out.println("Sau goi phuong thuc:" + a + " " + b);
}
Ex: truyền theo tham trị
61
Kiểu nguyên thủy
Trang 62 Khi biến hiện thời tham chiếu tới đối tượng , thì giá trị tham chiếu của đối tượng sẽ được truyền cho biến hình thức.
Khi đó, biến hiện thời và biến hình thức là 2 tên gọi khác nhau của đối tượng được tham chiếu
◦ -> mọi thay đổi thực hiện đối với các thành phần của đối tượng thông qua tham biến hình thức
Truyền các giá trị tham chiếu
62
Trang 63class Thamchieu { public static void test(tchieu aa) {
class tchieu { int x, y ;
Ex: truyền theo tham chiếu
63
Kiểu Lớp
Trang 64 Mảng được xem là đối tượng
Các phần tử của mảng có thể có kiểu nguyên thủy hoặc kiểu lớp (tham chiếu).
Ta xét bài toán: sx mảng
◦ Định nghĩa 1 hàm doicho có biến hình thức là kiểu mảng
◦ Biến hiện thời có kiểu mảng
Truyền tham chiếu kiểu mảng
64
Trang 66 Tham biến hình thức có thể khai báo với final -> biến cuối trắng – nó không được khởi tạo giá trị (trắng) cho đến khi nó được gán một trị nào đó, khi đó giá trị được gán là cuối cùng, không thay đổi.
Các tham biến final
66
Trang 67class vd0 { public int test (int i, final int j) {
System.out.println("Sau goi phuong thuc:"+a+" "+b);
System.out.println(“Gia tri cua ham test t.doi: "+c);
}
Final - ex
67
Trang 68 Có thể truyền các tham số cho chương trình trên dòng lệnh.
Các đối số của chương trình
68
Trang 69Lớp trừu tượng (Abstract class)
1 Định nghĩa lớp trừu tượng
2 Hiện thực lớp trừu tượng
3 Định nghĩa phương thức trừu tượng
4 Ví dụ
Trang 70đặc tả trong lớp cơ sở Nếu không nó phải được đặc tả là
trừu tượng.
Trang 71• Nếu một lớp chứa phương thức trừu tượng thì
chính nó cũng phải được đặc tả là trừu tượng
Trang 72Ví dụ lớp và phương thức trừu tượng
Trang 731 Giới thiệu
2 Định nghĩa giao tiếp
3 Thực thi giao tiếp
4 Ví dụ
Giao tiếp (Interface)
Trang 74 Trong đa thừa kế , lớp con có thể thừa kế từ nhiều
lớp khác nhau (cần thiết trong lập trình)
◦ cho phép đa kế thừa trong Interface.
◦ Đ/n: Một giao tiếp là một tập hợp các định nghĩa phương
thức trừu tượng (không có cài đặt) và có thể định nghĩa các hằng.
◦ Với giao tiếp ta có thể xác định một lớp phải làm gì nhưng
Giao tiếp (Interface)
Trang 75lớp được định nghĩa trong cùng gói với giao tiếp
phương thức có trong giao tiếp (không cung cấp cách cài đặt).
Khai báo giao tiếp (Interface)
Trang 76public interface CalculatorInterface
{
public double add(double x, double y);
public double sub(double x, double y);
public double mul(double x, double y);
public double div(double x, double y);
}
Interface Const { Double PI=3.14;
String DONVI_S= “cm2 “ ;
Interfaces - ex
Trang 77 Một lớp thực thi một giao tiếp tuân theo những quy
ước đã được khai báo trong giao tiếp đó
<InterfaceNames>: danh sách các giao tiếp
Thực thi giao tiếp
Trang 78class CalculatorTest implements CalculatorInterface {
public double add(double x, double y) { return x+y; }
public double sub(double x, double y) { return x-y; }
public double mul(double x, double y) { return x*y; }
public double div(double x, double y) {return x/y; }
public static void main(String[] args) {
Trang 79Implementing Multiple Interfaces
An interface can extend zero or more interfaces
Multiple interfaces can be implemented in a single class.
This implementation provides the functionality of multiple
inheritance.
Implement multiple interfaces by placing commas between the
interface names when implementing them in a class.
A class must implement all inherited interface methods
Trang 80Ex of Implementing Multiple Interfaces
Trang 82 Quan hệ:
◦ lớp ngoài (enclosing, outter class)
◦ Lớp trong (nested, inner class):
Là lớp khai báo bên trong 1 lớp khác
Lớp trong có quyền truy xuất lớp ngoài
Lớp ngoài chỉ truy xuất được lớp con khi có một thể hiện của lớp trong (bằng toán tử new)
Lợi ích: có thể viết code truy xuất lớp ngoài từ lớp
trong mà không cần định nghĩa đối tượng lớp ngoài
Lớp con (trong /inner)
Trang 84public class Outer {
private String st = "Outer Class"; //
InnerClass innerClass = new InnerClass();
Trang 85 là nơi tổ chức các lớp và các giao diện bạn
coi như là các thành viên của nó
Trang 86Tạo một tham chiếu đến các thành phần của gói:
//import mypackage.Calculate;
class PackageDemo{
public static void main(String args[]){
// Calculate calc = new Calculate();
mypackage.Calculate calc = new
mypackage.Calculate();
}
Package
Trang 87 Xây dựng lớp cơ sở Dagiac, lớp con HCN,