Professional Documents
Culture Documents
Lớp là một tập hợp các đối tượng có những thuộc tính và phương thức giống
nhau. Ta ví dụ về lớp car sẽ có các đối tượng moto, bike …. Chúng đều có
các thuộc tính như speed, limit speed. Vậy đối tượng là gì ?
Ví dụ:
0
1 class Car{
2 int a = 10;
3 }
4 class Oto extends Car {
5 int a = 20;
6 }
7 class Test{
8 public static void main(String[] args){
9 Oto A = new Oto();
10 System.out.println(A.a);
11 }
12 }
13
Đối tượng là một thực thể có thật Lớp là một tập hợp các đối tượng
2
và có các đặc điểm riêng biệt. có những tính chất giống nhau.
5 Đối tượng được tạo ra nhiều lần. Lớp chỉ được khai báo một lần.
Có nhiều cách để tạo ra một đối Chỉ có một cách khai báo đó là
7
tượng. dùng từ khóa class.
Tính đóng gói trong java
Tính đóng gói trong java là kỹ thuật ẩn giấu thông tin và hiển thị ra thông
tin liên quan. Mục đích chính của đóng gói trong java là giảm thiểu mức độ
phức tạp phát triển phần mềm.
Đóng gói cũng được sử dụng để bảo vệ trạng thái bên trong của một đối
tượng. Thông qua các phương thức set,get ta có thể thay đổi các giá trị thuộc
tính và lấy giá trị từ chúng. Điều này làm cho chương trình dễ quản lý hơn và
có thể kiểm soát dữ liệu tốt hơn.
}
0
1 public class HinhChuNhat {
2 private int rong; // biến intance
3 private int dai; // biến intance
4
5 public void setRong(int rong){
6 this.rong = rong;
7 }
8 public void setDai(int dai){
9 this.dai = dai;
10 }
11 public int getRong(){
12 return this.rong;
13 }
14 public int getDai(){
15 return this.dai;
16 }
17 }
18
Mặc dù các bạn không thể trực tiếp thay đổi giá trị của hai
biến rong và dai nhưng có thể thông qua phương thức setRong , setDai để
thay đổi giá trị của chúng. Hoặc thông qua hai phương
thức getRong và getDai để lấy ra giá trị của chúng.
0
1 HCN co chieu rong: 3
2 HCN co chieu dai: 4
3
default (mặc định): Nếu như bạn không khai báo phạm vi truy
cập thì Java sẽ hiểu mặc định phạm vi truy cập là default. Với
default thì trong lớp (class) đó và trong gói (package) đó mới có thể
nhìn thấy được.
private (riêng tư): Nếu như bạn khai báo phạm vi truy cập là
private thì chỉ duy nhất trong lớp (class) đó mới có thể nhìn thấy
được.
public (công khai): Nếu như bạn khai báo phạm vi truy cập là
public thì mọi thứ từ lớp (class), gói (package), lớp con (subclass)
đề có thể nhìn thấy được.
protected (được bảo vệ): Nếu như bạn khai báo phạm vi truy cập
là protected thì lớp (class) đó, gói (package) đó, lớp con (subclass)
đó đều có thể nhìn thấy được.
Bài tập: Xây dựng một lớp HocSinh gồm các thuộc tính tên, tuổi, địa chỉ. Các
phương thức set get tên,tuổi, địa chỉ của lớp HocSinh.
Cú pháp kế thừa
0
1 class Subclass-name extends Superclass-name {
2 //methods and fields
3 }
4
Ví dụ về kế thừa trong java
0
1 class Point{
2 private int x;
3 private int y;
4
5 }
6 class Circle extends Point{
7 private int r;
8
9 }
10
0
1 class A{
2 public void hello(){
3 System.out.println("Hello!");
4 }
5 }
6 class C extends A{
7 public void helloJava(){
8 System.out.println("Hello Java!");
9 }
10 }
11 class Test{
12 public static void main(String[] args){
13 C obj = new C();
14 obj.hello();
15 obj.helloJava();
16 }
17 }
18
0
1 Hello!
2 Hello Java!
3
Ví dụ về thừa kế nhiều tầng
0
1 class A{
2 public void hello(){
3 System.out.println("Hello!");
4 }
5 }
6 class B extends A{
7 public void hellWorld(){
8 System.out.println("Hello World!");
9 }
10 }
11 class C extends B{
12 public void helloJava(){
13 System.out.println("Hello Java!");
14 }
15 }
16 class Test{
17 public static void main(String[] args){
18 C obj = new C();
19 obj.hello();
20 obj.hellWorld();
21 obj.helloJava();
22 }
23 }
24
0
1 Hello!
2 Hello World!
3 Hello Java!
4
Ví dụ về thừa kế thứ bậc
0
1 class A{
2 public void hello(){
3 System.out.println("Hello!");
4 }
5 }
6 class B extends A{
7 public void hellWorld(){
8 System.out.println("Hello World!");
9 }
10 }
11 class C extends A{
12 public void helloJava(){
13 System.out.println("Hello Java!");
14 }
15 }
16 class Test{
17 public static void main(String[] args){
18 C obj = new C();
19 obj.hello();
20 obj.helloJava();
21 //obj.helloWorld();
22 }
23 }
24
0
1 Hello!
2 Hello Java!
3
Để giảm thiểu sự phức tạp và đơn giản hóa ngôn ngữ, đa kế thừa không được
support trong java.
Hãy suy xét kịch bản sau: Có 3 lớp A, B, C. Trong đó lớp C kế thừa từ các lớp
A và B. Nếu các lớp A và B có phương thức giống nhau và bạn gọi nó từ đối
tượng của lớp con, như vậy khó có thể xác đinh được việc gọi phương thức
của lớp A hay B.
Vì vậy lỗi khi biên dịch sẽ tốt hơn lỗi khi runtime, java sẽ print ra lỗi “compile
time error” nếu bạn cố tình kế thừa 2 class.
0
1 class A{
2 public void eat(){
3 System.out.println("Eating");
4 }
5 }
6 class B{
7 public void eat(){
8 System.out.println("Not eat");
9 }
10 }
11 class C extends A,B{
12 public static void main(String[] args){
13 C obj = new C();
14 obj.eat();
15 }
16 }
17
0
1 Compilation failed;
2
Bài tập:
1. Viết một class point có các thuộc tính vị trí (x,y) và các phương thức
set,get để làm việc với hai thuộc tính đó.
2. Viết một class circle kế thừa từ class point. Có thêm thuộc tính r
(bán kính) và các phương thức tính chu vi, diện tích của hình tròn
đó.
Tính trừu tượng trong java
Tính trừu tượng là một tiến trình ẩn các cài đặt chi tiết và chỉ hiển thị tính
năng tới người dùng. Sử dụng tính trừu tượng giúp chúng ta chỉ tập trung
vào trọng tâm thay vì quan tâm đến cách nó thực hiện.
0
1 abstract class Car{
2 abstract void display();
3 }
4
Ở ví dụ trên phương thức display() là một phương thức abstract.
Lưu ý:
Phương thức abstract thì không có dấu {} ở phía sau. Nếu có dấu {}
thì chương trình tự hiểu phương thức đó là một phương thức trống
chứ không phải không có trình triển khai.
Một constructor không thể khai báo abstract.
Một phương thức abstract không thể khai báo với từ khóa final.
0
1 abstract class HinhHoc{
2 abstract float dientich();
3 abstract float chuvi();
4 }
5 class HinhTron extends HinhHoc{
float r;
6
HinhTron(float r){
7
this.r = r;
8
}
9
@Override
10
float dientich() {
11
return 3.14f*r*r;
12
}
13
14
@Override
15
float chuvi() {
16
return 2*r*3.14f;
17
}
18
public void display(){
19
System.out.println("Chu vi: "+ chuvi());
20
System.out.println("Dien tich: "+ dientich());
21
}
22
}
23
public class TEST {
24
public static void main(String[] args){
25
HinhTron hinhTron = new HinhTron(2);
26
hinhTron.display();
27
}
28
}
29
30
Out put:
0
1 Chu vi: 12.56
2 Dien tich: 12.56
3
Mình tạo ra một lớp abstract HinhHoc và một lớp HinhTron kế thừa từ lớp
HinhHoc. Trong lớp HinhTron mình tiến hành overriding lại các phương thức
abstract của lớp HinhHoc.
Một interface trong java có tất cả các phương thức đều là abstract hết. Các
class triển khai từ một interface.
0
1 interface animal{
2 void eating();
3 }
4 class Dog implements animal{
5 @Override
6 public void eating() {
7 System.out.println("Dog eating");
8 }
9 }
10 public class TEST {
11 public static void main(String[] args){
12 Dog dog = new Dog();
13 dog.eating();
14 }
15 }
16
0
1 Dog eating
2
Trong java trình biên dịch tự động thêm từ khóa public và abstract trước
phương thức của interface và các từ khóa public, static và final trước các
thành viên dữ liệu.
Một interface không thể có constructor hay bạn không thể khởi tạo
một interface.
Tất cả các phương thức của interface đều là abstract.
Một interface có thể được kế thừa từ một interface khác.
Một interface không thể được kế thừa từ một lớp.
Một class chỉ được kế thừa từ một class khác, nhưng một class có
thể được triển khai từ nhiều interface.
Bạn phải dùng từ khóa implements để triển khai interface.
0
1 interface animal{
2 void eat();
3 }
4 interface dog extends animal{
5 void drink();
6 }
7 class BabyDog implements dog{
8
9 @Override
10 public void eat() {
11 System.out.println("Eating");
12 }
13
14 @Override
15 public void drink() {
16 System.out.println("Dinking");
17 }
18 }
19 public class TEST {
20 public static void main(String[] args){
21 BabyDog dog = new BabyDog();
22 dog.eat();
23 dog.drink();
24 }
25 }
26
0
1 Eating
2 Dinking
3
Trong ví dụ trên interface dog được kế thừa từ interface animal. Sau đó class
BabyDog triển khai interface dog và phải overriding lại hai phương
thức eat và drink.
Lồng interface
Một interface có thể chứa một interface khác, đó gọi là lông interface.
0 interface animal{
1 interface dog{
2 void drink();
3 }
4 }
5 class BabyDog implements animal.dog{
6 @Override
7 public void drink() {
8 System.out.println("Drinking");
9 }
10 }
11 public class TEST {
12 public static void main(String[] args){
13 BabyDog dog = new BabyDog();
14 dog.drink();
15 }
16 }
17
18
Out put:
0
1 Drinking
2
Sự khác nhau giữa Interface và Abstract class.
Trạ ng thái củ a đố i tượ ng: thể hiện ở giá trị củ a các biến trong class
(các field củ a đố i tượ ng), ví dụ cái xe màu gì, bao nhiêu phân khố i, giá
tiền…
Hành vi: các method (phương thứ c) củ a Class, hay đượ c hiểu là các
hành độ ng củ a đố i tượ ng. Ví dụ cái xe có thể chạ y, phát tiếng còi,
phát ánh đèn…
Định danh: việc nhậ n diện đố i tượ ng đượ c triển khai thông qua mộ t
ID duy nhấ t. Giá trị củ a ID là không thể nhìn thấ y vớ i ngườ i dùng bên
ngoài. Nhưng nó đượ c sử dụ ng nộ i tạ i bở i JVM để nhậ n diện mỗ i đố i
tượ ng mộ t cách duy nhấ t.
Trong Java nói riêng và trong lậ p trình hướ ng đố i tượ ng nói chung thì Class
(lớ p) đượ c hiểu là mộ t nhóm các đố i tượ ng có các đặ c điểm chung.
Ví dụ Class XeOto đượ c thiết kế không có cánh quạ t thì thì đố i tượ ng
(ví dụ : xe ô tô màu đen, phân khố i 5.2L và tố c độ 300km/h) đượ c tạ o
sẽ không thể nào có cánh quạ t.
Abstract class hay còn gọ i là lớ p trừ u tượ ng đơn giả n đượ c xem như mộ t
Class cha cho tấ t cả các Class có cùng bả n chấ t. Do đó mỗ i lớ p dẫ n xuấ t (lớ p
con) chỉ có thể kế thừ a từ mộ t lớ p trừ u tượ ng. Bên cạ nh đó nó không cho
phép tạ o instance, nghĩa là sẽ không thể tạ o đượ c các đố i tượ ng thuộ c lớ p
đó.
Lớ p trừ u tượ ng có thể có các phương thứ c: Abstract method hoặ c Non-
abtract method.
Lớ p trừ u tượ ng có thể khai báo 0, 1 hoặ c nhiều method trừ u tượ ng bên
trong.
Không thể khở i tạ o 1 đố i tượ ng trự c tiếp từ mộ t class trừ u tượ ng.
Interface đượ c xem như mộ t mặ t nạ cho tấ t cả các Class cùng cách thứ c
hoạ t độ ng nhưng có thể khác nhau về bả n chấ t. Từ đó lớ p dẫ n xuấ tcó thể kế
thừ a từ nhiều lớ p Interface để bổ sung đầ y đủ cách thứ c hoạ t độ ng củ a
mình (đa kế thừ a - Multiple inheritance).
Interface là mộ t contract, các class implement phả i triển khai các method
theo như interface đã định nghĩa.
5. Tổ ng kết
Bạ n không nên nhầ m lẫ n khi nói về việc mộ t class đượ c implement hay
extend.
Là cách để che dấu những tính chất xửlý bên trong của đối tượng, những
đối tượng khác không thể tác động trực tiếp làm thay đổi trạng thái chỉ có
thể tác động thông qua các method public của đối tượng đó. Mình sẽ tạ o ra
2 class để thể hiện điều này:
using System;
namespace oop
class hinhchunhat
height = newHeight;
width = newWidth;
height và width ởđây chính là các tính chất (properties) của đối
tượng class hinhchunhat
tinhdientich() là method được public nhằm mục đích tương tác với
các đối tượng khác. Tạo một class Program vớ i method static để
run, xem cách tương tác và thay đổ i tính chấ t củ a đố i tượ ng thông
qua các method public như nào:
using System;
namespace oop
{
class Program
Console.ReadLine();
Output:
Như vậy khi ta muốn thay đổi các tính chất (properties) không thể tương tác
trực tiếp với properties mà phải thông qua các method public được định
nghĩa bên trong class
không thể biết luồ ng xửlý logic bên trong của đố i tượng
using System;
namespace oop
class hinhdang
Console.WriteLine("Mau hong");
}
public void showType()
using System;
namespace oop
pg.showType();
Console.ReadLine();
Output:
Trong class Program không hề có method showType() nhưng vẫ n có thể
truy cậ p sử dụ ng nó bằ ng cách kế thừ a lạ i method củ a class hinhdang Kế
thừa nhiều cấp (Multiple level Inheritance): Kế thừ a nhiều class.
Ở diagram trên mình viết thêm class mausac và chuyển private method
showColor() sang class mausac thành public method.
using System;
namespace oop
class hinhdang
}
}
using System;
namespace oop
Console.WriteLine("Mau hong");
using System;
namespace oop
pg.showType();
pg.showColor();
Console.ReadLine();
}
}
Output:
Là mộ t đố i tượ ng thuộ c các lớ p khác nhau có thể hiểu cùng mộ t thông điệp
theo cách khác nhau.
Ví dụ đa hình trong thự c tế: Mình có 2 con vậ t: chó, mèo hai con vậ t này khi
nhậ n đượ c mệnh lệnh là "hãy kêu" thì chó kêu "gâu gâu", mèo kêu "meo
meo".
using System;
namespace oop
class Program
object o = "hello";
Print(o);
Console.ReadLine();
Output:
virtual :từ khoá dùng để khai báo 1 phương thứ c ả o (có thể ghi đè
đượ c).
override: từ khoá dùng để đánh dấ u phương thứ c ghi đè lên phương
thứ c củ a lớ p cha.
Tạ o ra 3 class Animal,Dog,Cat
using System;
namespace oop
class Animal
Console.WriteLine("Animal is speaking...");
using System;
namespace oop
using System;
namespace oop
class Cat:Animal
using System;
namespace oop
class Program
{
static void Main(string[] args)
dog.Speaking();
cat.Speaking();
Console.ReadLine();
Output:
using System;
namespace oop
class Animal
{
Console.WriteLine("Animal is speaking...");
using System;
namespace oop
override
using System;
namespace oop
override
{
Console.WriteLine("Cat speaks meo meo");
using System;
namespace oop
class Program
dog.Speak();
cat.Speak();
Console.ReadLine();
Output:
Là phương pháp trừ u tượ ng hóa định nghĩa lên nhữ ng hành độ ng, tính chất
củ a loạ i đố i tượ ng nào đó cầ n phả i có. Ví dụ khi bạ n định nghĩa mộ t lớ p
độ ng vậ t(Animal), Animal thì có rấ t nhiều loạ i, làm sao để xác định đó là mộ t
loạ i độ ng vậ t? lúc này bạ n sẽ hình dung trong đầ u độ ng vậ t có nhữ ng tính
chấ t hành vi cơ bả n nhấ t định phả i có như ăn, nói khi bấ t kỳ mộ t developer
nào định viết mộ t đố i tượ ng thuộ c lớ p độ ng vậ t sẽ kế thừ a lạ i lớ p Animal có
2 hành vi ăn, nói,đố i tượ ng đượ c tạ o ra có thể khác nhau như chó hoặ c mèo
nhưng đều có nhữ ng hành vi củ a độ ng vậ t là ăn và nói. => Trong ví dụ trên
nhìn vào hành vi ăn và nói củ a chó và mèo ta có thể khẳ ng định nó thuộ c
lớ p độ ng vậ t. Vậ y chố t lạ i rõ làng tính trừ u tượ ng ở đây sinh ra chủ yếu để
trừ u tượ ng hóa và định nghĩa các tính chấ t hành vi phả i có để xác định đó
là đố i tượ ng gì dự a vào tính chấ t hành vi củ a đố i tượ ng. => Các method
trừ u tượ ng đều rỗ ng không thự c hiện bấ t kỳ hành vy nào, hành vy sẽ đượ c
triển khai cụ thể do các đố i tượ ng kế thừ a. => Viết xong đoạ n trên không
biết các bạ n đọ c có hiểu không @@ thấ y có vẻ lan man quá, vì chưa có kinh
nghiệm @@, nói chung định nghĩa mộ t phầ n phả i thự c hành nhiều coder
mà, thự c hành nhiều tự các bạ n sẽ hiểu ra ).
Tiếp tụ c nhé ^^ trong c# có 2 phương pháp để triển khai tính trừ u tượ ng
này:
1. Abstract class
method thườ ng (là vẫ n có logic trả về data hoặ c thự c thi hành độ ng
nào đó, nó đượ c sử dụ ng cho mụ c đích dùng chung)
Abstract class Animal và 2 class Dog, Cat kế thừ a lạ i nhữ ng method đượ c
public 2. Interface : Khá giố ng vớ i abstract class nhưng interface không phả i
là class, trong interface chỉ có khai báo nhữ ng method/properties trố ng
không có thự c thi, thự c thi sẽ đượ c thể hiện trong các lớ p kế thừ a, interface
giố ng như mộ t cái khung mẫ u để các lớ p implement và follow.
Tạ o 2 interface IAnimal,Interface2 và 2 class Pig,Bird kế thừ a 2 interface