1. Cách khai báo và sử dụng lớp trong Java

Lớp là đơn vị thực thi cơ bản trong ngôn ngữ Java. Lớp là một khuân mẫu hay thiết kế để tạo ra các đối tượng.
Lớp quy định hình thức và các khả năng của các đối tượng
Khai báo lớp đồng thời cũng là khai báo một kiểu dữ liệu mới để có thể khởi tạo các đối tượng thuộc kiểu dữ liệu đó

Cú pháp khai báo:

class<class_name>{

//class body
}
Trong đó:
class là từ khóa được dùng để khai báo lớp
class_name là tên của lớp

– class body là phần thân của lớp: nơi khao báo các thành phần của lớp như các trường,các phương thức và các phương thức khởi tạo
– constructor (phương thức khởi tạo): là một phương thức đặc biệt được sử dụng để khởi tạo các đối tượng của một lớp

Một số quy ước khi đặt tên lớp:

  • Tên lớp nên là một danh từ
  • Tên lớp nên tuân theo quy tắc Camel
  • Tên lớp nên đơn giản, có nghĩa
  • Tên lớp không thể trùng với các khóa trong Java
  • Tên lớp không được bắt đầu bằng chữ số. Có thể bắt đầu bằng ký tự ($) hoặc dấu (_)

Ví dụ về khai báo lớp:

public class HoaHau{

// Hàm tạo đối tượng của lớp

public HoaHau(){

//Khởi tạo đối tượng

}

}

2. Cách dùng đối tượng trong Java

Đối tượng là thể hiện của 1 lớp.

Khởi tạo đối tượng

  • Có thể khởi tạo đối tượng của một lớp sau khi lớp đó được khai báo
  • Sử dụng từ khóa new để khởi tạo đối tượng:

Cú pháp:=new();

Trong đó:

  • class_name là tên của lớp
  • new là từ khóa để khởi tạo đối tượng
  • object_name là tên biến chứa tham chiếu trở đến đối tượng

Ví dụ về khởi tạo đối tượng

HoaHau hoahauObj = new HoaHau();

Trong đó:

  • Biểu thức new HoaHau() ở phía bên phải cấp phát bộ nhớ tại thời điểm thực thi
  • Sau khi vùng nhớ đã được cấp phát thì một tham chiếu đến vùng nhớ đó được trả về cho biến hoahauObj
  • Có thể tách rời việc khai báo biến và khởi tạo đối tượng, ví dụ:

HoaHau hoahauObj;

hoahauObj = new HoaHau();

Quá trình khởi tạo đối tượng

Bước 1: Khai báo biến

HoaHau hoahauObj;

  • Biến hoahauObj được khai báo và không trỏ đến bất kỳ đối tượng nào
  • Biến hoahauObj có giá trị null
  • Nếu sử dụng biến hoahauObj để truy cập các phương thức hoặc thuộc tính của lớp hoahauObj tại thời điểm này, sẽ có lỗi xảy ra

Bước 2: Khởi tạo đối tượng:

hoahauObj = new HoaHau();

  • Một đối tượng của lớp HoaHau được khởi tạo và lưu vào một vùng nhớ(ví dụ là 1V5TTT)
  • Địa chỉ vùng nhớ được gán cho biến hoahauObj

Khai báo thuộc tính

  • Các thuộc tính mô tả đặc điểm của đối tượng
  • Thuộc tính còn được goi là instance variable (biến của đối tượng)
  • Cú pháp:  access_modifier data_type property_name

Ví dụ:

public class HoaHau{

// Fields

public String name;

public int age;

// Constructors

public HoaHau(){

}

}

Khai báo phương thức

  • Phương thức mô tả các hành vi mà dối tượng có thể thưc hiện
  • Phương thức còn được gọi là instance method (Phương thức của đối tượng)

Ví dụ:

public class HoaHau{

// Fields

public String name;

public int age;

// Constructors

public HoaHau(){

}

//Methods

public String sayHoaHau(){

return ’’ Tôi là Hoa Hậu Việt Nam’’;

}

3. Constructor

  • Constructor là một phương thức đặc biệt giúp khởi tạo đối tượng
  • Constructor có tên trùng với tên của lớp
  • Một lớp có thể có nhiều constructor
  • Nếu không khai báo constructor cho lớp thì mặc định lớp đó có một constructor không có tham số

Ví dụ:

  • Không tham số

public HoaHau(){

name = ’’ No Name’’;

age = 20;

}

  • Có tham số

public HoaHau(String s, int n){

name = s;

age = n;

}

Sử dụng constructor

Có thể lựa chọn sử dụng các constructor khác nhau bằng cách truyền vào tham số khác nhau

Ví dụ:

  • Cách 1:

public HoaHau(){

name = ’’No name’’;

age = 20;

}

hoahauObj = new HoaHau();

  • Cách 2:

public HoaHau(String s, int n){

name  = s;

age = n;

}

hoahauObj = new HoaHau(’’Linh’’,22);

4. Truy xuất thuộc tính của đối tượng

  • Có thể truy xuất các thành phần của đối tượng thông qua biến trỏ đến đối tượng
  • Sử dụng dấu chấm(.) để truy xuất thuộc tính của đối tượng
  • Ví dụ:

HoaHau hoahauObj;

hoahauObj = new HoaHau(’’Linh’’,22);

System.out.println(’’Name: ’’+ hoahauObj.name);

System.out.println(’’Age: ’’+hoahauObj.age);

Gọi phương thức của đối tượng

  • Sử dụng dấu chấm (.) để gọi phương thức của đối tượng
  • Ví dụ:

HoaHau hoahauObj;

hoahauObj = new HoaHau();

String s = hoahauObj.sayHoaHau();

Truy cập trực tiếp vào các trường dữ liệu

  • Sử dụng từ khóa public khi khai báo thuộc tính sẽ cho phép truy cập trực tiếp vào các thuộc tính đó
  • Ví dụ:
  • Khai báo lớp HoaHau sau cho phép truy cập trực tiếp vào trường name

class HoaHau{

public String name;

}

HoaHau hoahauObj = new HoaHau();

hoahauObj.name = ’’Thuy Tien’’;

5. Trường dữ liệu đóng gói

  • Trường dữ liệu đóng gói là hình thức hạn chế quyền truy cập trực tiếp vào các thuộc tính của đối tượng bằng các sử dụng từ khóa private
  • Khai báo các phương thức để kiểm soát truy cập vào các thuộc tính của đối tượng
  • Các phương thức cho phép thay đổi giá trị của thuộc tính được gọi là setter, các phương thức cho phép lấy về giá trị của thuộc tính là getter

Khai báo getter/setter

  • Ví dụ:

class HoaHau(){

private String name;

public void setName(String name){

this.name = name;

}

public String getName(){

return this.name;

}

}

6. Từ khóa this

  • Từ khóa this được sử dụng để đại diện cho đối tượng của lớp hiện tại
  • Có thể sử dụng từ khóa this để truy cập đến các thành phần của đối tượng hiện tại
  • Ví dụ, sử dụng this để phân biệt 2 biến cùng tên:

class HoaHau{

private String name;

public void setName(String name){

this.name = name;

}

}

7. Chỉ định truy cập,phương thức và thuộc tính static

  • Chỉ đinh truy cập là các từ khóa được sử dụng để quy định mức độ truy cập đến các thành phần của lớp
  • Các mức truy cập:
  • public : có thể truy cập ở bất kỳ đâu
  • private : các phương thức và thuộc tính chỉ được phép truy xuất trong cùng một lớp
  • protected: các phương thức và thuộc tính được phép truy xuất trong cùng một lớp và ở lớp con kế thừa
  • default : Nếu không có chỉ định truy cập thì mức default sẽ được áp dụng. Lớp và các thành phần của lớp được truy xuất ở những nơi trong cùng một package

Bảng minh họa các mức truy cập

8. Package

  • Package(gói) là cách để phân loại các lớp và interface thành các nhóm có liên quan đến nhau và tổ chức chúng thành các đơn vị để quản lý
  • Ví dụ, Java cung cấp sẵn các gói:
  • java.io: Thực hiện các thao tác nhập xuất dữ liệu
  • java.net: Thực hiện các thao tác qua mạng lưới
  • java.security: Thực hiện các thao tác liên quan đén bảo mật
  • java.util: Cung cấp các lớp và phương thức hỗ trợ
  • Lập trình viên có thể tự đinh nghĩa các gói mới để tổ chức mã nguồn hợp lý

Khai báo Package

  • Cú pháp:    package package_name;
  • Ví dụ:

package HoaHau;

  • Tên của package phải trùng với tên của thư mucj chứa mã nguồn
  • Tên của subpackage phải lần lượt trùng với tên của các thư mục tương ứng, ví dụ:

package com.HoaHau.ui;

9. Từ khóa import

  • Cần sử dụng từ khóa import để có thể sử dụng các lớp được định nghĩa trong các package khác
  • Ví dụ:

package model;

public class HoaHau{

}

package controller;

import model.controller;

public class HoaHauController{

public void index(){

HoaHau hoahauObj = new HoaHau();

}

}

10. Từ khóa static

  • Từ khóa static được sử dụng để khai báo các thuộc tính và phương thức của lớp(khác với thuộc tính và phương thức của đối tượng)
  • Các thành phần static trực thuộc lớp, thay vì trực thuộc đối tượng
  • Biến static còn được gọi là biến của lớp
  • Phương thức static còn được gọi là phương thức của lớp
  • Có thể truy xuất các thành phần static bằng cách sử dụng lớp hoặc đối tượng
  • Không cần khởi tạo đối tượng vẫn có thể sử dụng các thành phần static

Biến static

  • Cú pháp khai báo biến static:

     modifier static data_type variable_name;

  • Ví dụ:

Khai báo biến static

class HoaHau(){

        public static String language = ’’English’’;

  }

Truy xuất biến static

System.out.println(“Ngôn ngữ: ”+HoaHau.language);

Phương thức static

  • Cú pháp khai báo phương thức static:

modifier static data_type methob_name(){

//body

}

  • Ví dụ:

Khai báo phương thức static:

class HoaHau(){

public static String getLanguage(){

return “English”;

}

}

Truy xuất biến static

System.out.println(“Ngôn ngữ: ”+ HoaHau.getLanguage());

Một số ràng buộc

  • Phương thức static chỉ có thể gọi các phương thức static khác
  • Phương thức static chỉ có thể truy xuất các biến static
  • Phương thức static không thể sử dụng từ khóa this hoặc super
  • Có thể khởi tạo static thông qua khối khởi tạo static

11. Kế thừa trong Java

  • Kế thừa là cơ chế cho phép một lớp con sử dụng lại các đặc điểm và hành vi đã được định nghĩa trong lớp cha
  • Ví dụ:
  • Lớp cha: Nguoi
  • Lớp con: HoaHau,NguoiMau,Dienvien,CaSi

Quan hệ is-a

  • Quan hệ giữa lớp con và lớp cha là quan hệ is-a(là – một)
  • Ví dụ: Hoa hậu là người , người mẫu là một người, diễn viên là một người, ca sĩ là một người

Một số khái niệm

  • Lớp được kế thừa gọi là lớp cha hoặc lớp cơ sở hoặc super class
  • Lớp kế thừa gọi là lớp con hoặc lớp dẫn xuất hoặc subclass
  • Lớp con kế thừa tất cả các thành phần của lớp cha, ngoại trừ các thành phần được khai báo là private
  • Lớp con có thể gọi constructor của lớp cha
  • Lớp con có thể định nghĩa thêm các thuộc tính và phương thức mới
  • Java không cho phép đa kế thừa(một lớp kế thừa nhiều lớp cha)

Một số dạng thừa kế trong Java

  • Single: một lớp kế thừa từ chỉ một lớp cha
  • Multilevel: một lớp kế thừa từ một lớp cha, lớp cha lại kế thừa từ lớp khác ở trên nó
  • Hierarchical: một lớp cha có nhiều lớp con với nhiều level khác nhau
  • Multiple: một lớp con kế thừa từ nhiều lớp cha

Bai thuc hanh MS Excel-97

Cú pháp thừa kế

  • Từ khóa extends được sử dụng để kế thừa một lớp
  • Cú pháp:

 class HoaHau extends Nguoi{

// class body

}

  • Trong đó :
  • HoaHau là tên lớp con
  • Nguoi là tên lớp cha

Ví dụ về thừa kế

class Nguoi{

}

class HoaHau extends Nguoi{

}

class NguoiMau extends Nguoi{

}

class DienVien extends Nguoi{

}

Method Overriding (ghi đè phương thức)

  • Method Overriding (ghi đè phương thức) là cơ chế cho phép lớp con định nghĩa lại các phương thức đã được định nghĩa trước đó ở lớp cha
  • Phương thức override ở lớp con có cùng tên, cùng danh sách tham số và kiểu dữ liệu trả về so với phương thức ở lớp cha
  • Phương thức ở lớp con phải có access modifier có level bằng hoặc cao hơn so với phương thức lớp cha
  • Từ khóa override được sử dụng để ghi đè phương thức
  • @Override có thể được sử dụng để dánh dấu phương thức ghi đè

Ví dụ:

public class Nguoi{

public String getName(){

return ’’Tôi là người Việt Nam’’;

}

}

public class HoaHau extends Nguoi{

@Override

public String getName(){

return ’’Tôi là hoa hậu Việt Nam’’;

}

}

12. Từ khóa Super

  • Từ khóa super được sử dụng ở lớp con để gọi đến constructor hoặc phương thức của lớp cha
  • Ví dụ, gọi constructor của lớp cha

  • Ví dụ, gọi phương thức của lớp cha

13. Lớp Object phương thức toString()

  • Lớp Object là lớp gốc của tất cả các lớp trong java
  • Tất cả các lớp trong java đều kế thừa từ lớp Object
  • Lớp Object có một phương thức được sử dụng thông dụng đó là toString():Trả về một chuỗi mô tả đối tượng
  • Mô tả của phương thức toString() là:

   public String toString();

  • Ví dụ:

System.out.println(hoahau.toString());

Override phương thức toString()

  • Các lớp có thể ghi đè phương thức toString()để mô tả đối tượng tốt hơn
  • Ví dụ:

public class HoaHau{

private int age;

public HoaHau(int age){

this.age = age;

}

@Override

public String toString(){

return ’’Hoa Hậu Đỗ Mỹ Linh tuổi là: ’’+ this.age;

}

}

14. Tính đa hình trong Java

  • Đa hình là cơ chế cho phép một biến thuộc kiểu dữ liệu cha có thể trỏ đến một đối tượng thuộc lớp con
  • Khi khai báo một lớp,đồng nghĩa với tạo ra một kiểu dữ liệu mới
  • Khi một lớp con kế thừa lớp cha thì kiểu dữ liệu của lớp cha được gọi là supertype, kiểu dữ liệu của lớp con được gọi là subtype
  • Ví dụ: Nguoi là supertype của HoaHau và HoaHau là subtype của Nguoi. Tất cả các đối tượng của lớp HoaHau đều là Nguoi nhưng không phải ngược lại.
  • Tính đa hình cho phép khai bao như sau:

  Nguoi nguoiObj =  new HoaHau();

Dynamic Binding

  • Khi triển khai kế thừa, một phương thức có thể được viết ở nhưng lớp khác nhau
  • Dynamic binding là cơ chế của JVM để xác định sẽ gọi phương thức nào tại thời điểm thực thi
  • Ví dụ, phương thức toString() sẽ được gọi?

Object o1 = new HoaHau();

System.out.println(o1.toString());

15. Ép kiểu(Casting)

  • Ép kiểu là cơ chế chuyển đổi một tham chiếu đến đối tượng thuộc loại này thành tham chiếu đến đối tượng loại khác
  • Có 2 loại ép kiểu:
  • Ép kiểu ngầm định: ép từ subtype lên supertype
  • Ép kiểu tường minh: ép từ supertype xuống subtype
  • Ví dụ:

Ép kiểu ngầm định:

Nguoi nguoiObj = new HoaHau();

Ép kiểu tường minh:

HoaHau hoahauObj = (HoaHau) nguoiObj;

16. Toán tử instanceof

  • Toán từ instanceof giúp kiểm tra kiểu của một đối tượng
  • Giá trị trả về có kiểu là boolean
  • Ví dụ:

if(myObject instanceof HoaHau){

System.out.println(’’Hoa hậu là : ’’+((HoaHau) myObject).getName());

}

Lưu ý: Nếu không ép kiểu sang kiểu HoaHau thì không thể gọi phương thức getName() được.

17. Từ khóa final

  • Từ khóa final áp dụng cho lớp và phương thức để ngăn việc kế thừa và ghi đè phương thức
  • Ví dụ:

public final class Nguoi{

}

public class HoaHau(){

public final void display(){

}

}

18. Abstract class

  • Trong kế thừa, lớp cha định nghĩa các phương thức chung cho các lớp con
  • Lớp con cụ thể hơn lớp cha, lớp cha “chung chung ” hơn lớp con
  • Trong kế thừa, càng lên cao thì tính cụ thể càng ít đi , tính trừu tượng càng tăng lên
  • Những lớp có tình trừu tượng rất cao, đến mức không thể tạo được các đối tượng của lớp đó thì được gọi là lớp trừu tượng(abstract class)

Abstract methob

  • Abstract methob là những phương thức được khai báo nhưng không có phần thân
  • Ví dụ:
  • Lớp Nguoi có thể khai báo phương thức getNgheNghiep nhưng không có phần thân cho phương thức này
  • Tất cả các ’’Người’’ đều có nghề nghiệp
  • Không thể xác định người đó làm nghề gì ở bên trong lớp Nguoi bởi vì chưa xác định rõ ’’Người’’ này là đối tượng gì.

Từ khóa abstract

  • Từ khóa abstract được sử dụng để khai báo lớp trừu tượng và phương thức trừu tượng
  • Ví dụ:

public abstract class Nguoi{

private String nam;

protected Nguoi(String name){

this.name = name;

}

public abstract String getNgheNghiep();

}

Các tính chất của lớp abstract

  • Không thể tạo đối tượng của lớp abstract
  • Lớp abstract có thể có các thuộc tính và phương thức bình thường
  • Một lớp chứa phương thức abstract thì lớp đó phải là abstract
  • Một lớp không phải là abstract kế thừa từ một lớp cha abstract thì phải implement tất cả các phương thức abstract của lớp cha
  • Lớp abstract và phương thức abstract thì không thể là final

19. Cách dùng interface

  • Interface là một cấu trúc tương tự như lớp nhưng chỉ chưa các hằng số và abstract methob
  • Interface quy định các hành vi chung cho các lớp triển khai nó
  • Sử dụng từ khóa interface để định nghĩa interface
  • Cú pháp:

modifier interface interface_name{

// constant declare

// abstract methob

}

Các tính chất của Interface

  • Định nghĩa một interface tạo ra một kiểu dữ liệu mới
  • Không thể tạo đối tượng của interface
  • Interface không thể chứa các phương thức không abstract
  • Khi một lớp triển khai interface thì cần triển khai tất cả các phương thức được khai báo trong interface đó
  • Interface có thể được thiết kế khai báo các phương thức chung cho các lớp không liên quan với nhau
  • Interface bổ sung cho việc java không hỗ trợ đa kế thừa

Triển khai Interface

  • Một lớp triển khai interface bằng cách sử dụng từ khóa implements
  • Cú pháp:

  class className implements interfaceName{}

  • Ví dụ:

public interface HoaHauImp{

String NgoaiNgu();

}

public class HoaHau implements HoaHauImp{

@Override

public Strirng NgoaiNgu(){

return ’’Toeic 950’’;

}

}

Kế thừa interface

  • Một interface có thể kế thừa interface khác
  • Interface con thừa hưởng các phương thức và hằng số được khai báo trong interface cha
  • Interface con có thể khai báo thêm các thành phần mới
  • Từ khóa extends được sử dụng để kế thừa interface
  • Ví dụ:

public interface HoaHauImp{

String NgoaiNgu();

}

public interface Nguoi extends HoaHauImp{}

public interface Casi extends HoaHauImp{}

Access modifier của interface

  • Mặc định, các phương thức abstract của interface đều có mức độ truy cập là public
  • Không thể sử dụng private hoặc protected cho các phương thức interface
  • Không cần thiết phải chỉ rõ mức độ truy cập là public cho các phương thức của interface

Khai báo hằng số trong interface

  • Có thể khai báo các hằng số trong interface
  • Không cần thiết phải chỉ rõ mức độ truy cập cho hằng số, mặc đinh là public
  • Không cần thiết phải ghi rõ từ khóa final cho hằng số
  • Ví dụ:

   public interface NgoaiNgu{

  String trinhdo = ’’Toeic 950’’;

}

Lựa chọn interface hay abstract class?

  • Trong nhiều trường hợp có thể chuyển đổi giữa việc sử dụng interface và abstract class
  • Nếu có sự gần gũi, rõ ràng giữa các lớp về mốt quan hệ cha-con thì nên sử dụng lớp(mối quan hệ is-a)
  • Ví du: Hoa hậu là một người
  • Nếu không có mối quan hệ gần gũi thì nên chọn interface (mối quan hệ can-do)
  • Ví dụ: Hoa hậu có trình độ ngoại ngữ