Tuesday, July 14, 2015

Bài 9 - Lập trình hướng đối tượng (Object Oriented Programming)

Trong loạt bài trước mình đã hướng dẫn các bạn về các kỹ năng lập trình căn bản đối với ngôn ngữ Java . Tuy nhiênJava là ngôn ngữ lập trình hướng đối tượng rất mạnh mẽ . Và chúng ta sẽ dành nhiều thời gian hơn để nói về nó . Và đây cũng chiếm gần như chọn thời gian tìm hiểu của chúng ta.
I. Định nghĩa class của Object
1. Lập trình hướng đối tượng là gì :là ngôn ngữ mô tả các sự vật hiện tượng thông qua đối tượng.
Vậy đối tượng là gì : đối tượng là hiện tượng sự vật , được biểu hiện bằng các thuộc tính(data field) , và các hành động (behavior ) của nó được mô tả bằng các method hay event.
Trong Java người ta biểu diễn đối tượng thông qua class (template).
Ví dụ : class Nguoi có các field (name , age , salary...) và các behavior (nghe, nói , đọc ,viết ...)
Khi thiết kế hệ thống , chúng ta cần dùng các ngôn ngữ phân tích thiết kế khác . Ở đây tôi sẽ đề cập cho các bạn một dạng ngôn ngữ phân tích thiết kế thông thường hay sử dụng đó là UML(Unified Modeling Language) . Người ta dùng UML class diagram để thể hiện một class (hay template của đối tượng như sau)

Trong đó dữ liệu của thuộc tính được thể hiện ở dạng
dataFieldName: dataFieldType
Các contructor :
ClassName(parameterName: parameterType)
Các method :
methodName(parameterName: parameterType): returnType
Wao , chúng ta lại đề cập tới khái niệm contructor , vậy nó là gì.
Contructor được khai báo trùng với tên class , biểu diễn như một method nhưng lại không có kiểu dữ liệu trả về. Nó là một thể hiện của class .

Khi khai báo một class , thì nó sẽ tự động sinh ra một contructor rỗng (không có tham số).Mặc dù nó không thể hiện trên code.
Nếu một class viết một contructor có tham số (arguments) duy nhất cho class . Thì contructor này sẽ overload contructor default (không tham số) . Vì vậy nếu bạn gọi contructor(không tham số) nó sẽ báo lỗi .
Khi bạn muốn một thể hiện của class ở nhiều dạng , yêu cầu đầu vào cho class nhiều tham số thì bạn cũng có thể tạo rất nhiều contructor . Khi gọi tới contructor nào thì nó sẽ overload các contructor còn lại : Ví dụ:
public class DemoContructor {

       int a;
       String str ;
       float salary;
       public DemoContructor(){
              System.out.println("contructor rong");
       }
       public DemoContructor(int a){
              this.a = a;
              System.out.println("contructor co 1 tham so :" + a);
       }
      
       public DemoContructor(int a, String str, float salary) {
              super();
              this.a = a;
              this.str = str;
              this.salary = salary;
              System.out.println("contructor co 3 tham so:" + a + " " + str + " " + salary);
       }
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              DemoContructor demo = new DemoContructor();
              DemoContructor demo2 = new DemoContructor(3);
              DemoContructor demo3 = new DemoContructor(4, "hello", 12);
       }

}
Đây cũng là một đặc tính đa hình trong Java .
Trong eclipse các bạn có thể tự generate các method contructor bằng các click vào Source trên thanh tabbar (Alt +S) hoặc chuột phải vào cửa sổ soạn thảo -->Source --> Generate Contructor using field
2. Biến static (static variables) , Constant (hằng số ) và method.
- Biến static và method static: Khi chúng ta muốn chia sẻ dữ liệu thì chúng ta dùng biến static . Biến static lưu trữ giá trị trong bộ nhớ dùng chung. Bởi vì vị trí ô nhớ dùng chung này , tất cả các đối tượng giống nhau trong class đều có thể thay đổi giá trị của biến static này. Java cũng support các method static để gọi tới các biến static. Ví dụ :
Các bạn chú ý : Chỉ có method static mới gọi được các biến static . Và chỉ có method static mới gọi được tới nhau.
Cách khai báo biến static và method static là :
static int numberOfObjects;

static int getNumberObjects() {
  return numberOfObjects;
}
- Hằng số và final method : Để chia sẻ dữ liệu cho toàn bộ project chúng ta dùng từ khóa final static để biểu diễn những giá trị không thể thay đổi . Hay đây chính là biểu diễn hằng số như trong toán học. (Những giá trị không bao giờ thay đổi ).Ví dụ
final static double PI = 3.14159265358979323846;
Tương tự như vậy final method cũng là một method không có bất kỳ method nào thay đổi giá trị của nó . Cũng không đươc kế thừa (cái này mình sẽ giới thiệu các bạn trong những bài học lần sau ).
public class DemoFinal {

       final static double PI = 3.14159265358979323846;
       final /*static*/ void show(){
              System.out.println("show :" + PI);
             
       }
       public static void main(String[] args) {
              DemoFinal fn = new DemoFinal();
              fn.show();
//            show();
       }
}
- Cách gọi tới method hoặc variable từ hàm main.
Thông thường chúng ta có 2 cách gọi method hay variable từ hàm main . Một là gọi trực tiếp , hai là gọi thông qua đối tượng.
* Cách 1 : gọi trực tiếp
Vì hàm main là một hàm static nên tất cả các variable và method của nó khi gọi tới phải là static
static int a = 23;
static void show(){
     System.out.println("ket qua show :" + a);
}
public static void main(String[] args) {
     show();
     System.out.println("ket qua show 2 :" + a);
}
*Cách 2 : gọi thông qua đối tượng. Ta dựa vào contructor như đã nói ở trên . Sau đó nhờ đối tượng để gọi tới.
public class DemoObject {

       String name = "Khai";
       int age = 24;
      
       public DemoObject() {
              super();
       }

       public DemoObject(String name, int age) {
              super();
              this.name = name;
              this.age = age;
       }

       void show(){
              System.out.println("name :" + name + "\nage" + age);
       }
       public static void main(String[] args) {
              DemoObject obj = new DemoObject();
              obj.show();
             
              DemoObject obj2 = new DemoObject("nosoft", 30);
              obj2.show();
       }
}
3. Khả năng truy nhập (Visibility Modifiers)
Java cung cấp các khả năng truy nhập dữ liệu như sau :
- public : Các biến dữ liệu hoặc method có thể sẽ được tất cả các lớp khác , hoặc method khác gọi tới ở bất kỳ nơi đâu trong project
- protected : Các biến dữ liệu hoặc method chỉ cho các lớp hoặc method khác gọi tới nếu cùng chung một package.
- private : Các biến dữ liệu hoặc method chỉ cho các method khác hoặc lớp nội hàm truy nhập nếu chung một class.
- default : truy nhập được trong class và trong package nhưng lại không truy nhập được từ class con
Đây cũng chính là tính bảo mật dữ liệu trong Java
Để tăng tính bảo mật project của bạn thì chúng ta nên dùng private cho các field . Và truy xuất dữ liệu thông quá các method getter và setter .
Thông qua các method getter và setter này để hạn chế khả năng truy nhập dữ liệu như thế nào tới từng loại user một. Tùy vào mục đích sử dụng.
public class Student {
  private int id;
  private BirthDate birthDate;

  public Student(int ssn, int year, int month, int day) {
    id = ssn;
    birthDate = new BirthDate(year, month, day);
    }

    public int getId() {
      if(id >1)
      return id;
      return 0;
    }

    public BirthDate getBirthDate() {
      return birthDate;
    }
}

public class BirthDate {
   private int year;
   private int month;
   private int day;

   public BirthDate(int newYear, int newMonth, int newDay) {
     year = newYear;
     month = newMonth;
     day = newDay;
   }

   public void setYear(int newYear) {
     year = newYear;
   }
}
public class Test {
  public static void main(String[] args) {
    Student student = new Student(111223333, 1970, 5, 3);
    BirthDate date = student.getBirthDate();
    date.setYear(2010); //Now the student birth year is changed!
  }
}
Muốn lấy dữ liệu của class Student thì ta dùng phương thức getter (getId , getBirthDate)
Muốn gán dữ liệu ta dùng phương thức setter (setYear)
Các bạn cũng có thể generate trong eclipse giống như generate contructor bằng phím tắt Alt+ S.
*Mở rộng : Cũng như với variable thì Array cũng là một object chứa các object khác là các phần tử .
Circle[] circleArray = new Circle[10];
for (int i = 0; i < circleArray.length; i++) {
  circleArray[i] = new Circle();
}
4. Lớp DateTime và Random
Trong Java hỗ trợ 2 thư viện rất hữu dụng đó là lớp Date và Random.
a . Date
Thuộc gói java.util.Date để thể hiện các toán tử current second , minute , hour . Có câu lệnh System.currentTimeMillis() để tính toán thời gian tại thời điểm hiện tại chính xác tới minisecond .
java.util.Date date =  new jave.util.Date();
System.out.println("The elapsed time since Jan 1, 1970 is " +
 date.getTime() + " milliseconds");
System.out.println(date.toString());
Result
The elapse time since Jan 1, 1970 is 1100547210284 milliseconds
Mon Nov 15 14:33:30 EST 2004
b. Random.
Thuộc gói java.util.Random generate ra các toán tử ngẫu nhiên . Trong phạm vi nào đó.
Ví dụ :
Random random1 = new Random(3);
System.out.print("From random1: ");
for (int i = 0; i < 10; i++)
  System.out.print(random1.nextInt(1000) + " ");
Random random2 = new Random(3);
System.out.print("\nFrom random2: ");
  for (int i = 0; i < 10; i++)
  System.out.print(random2.nextInt(1000) + " ");
Result
From random1: 734 660 210 581 128 202 549 564 459 961
From random2: 734 660 210 581 128 202 549 564 459 961
II. Tính đóng gói dữ liệu.
Hãy xem xét việc xây dựng một hệ thống máy tính, ví dụ. Máy tính cá nhân của bạn được tạo thành từ nhiều thành phần, chẳng hạn như một CPU, CD-ROM, ổ đĩa mềm, bo mạch chủ, quạt, và như vậy. Mỗi thành phần có thể được xem như là một đối tượng có các thuộc tính và phương thức. Để có được các thành phần để làm việc cùng nhau, tất cả chúng cần biết là mỗi thành phần được sử dụng và làm thế nào nó tương tác với những thành phần khác. Nó không cần phải biết làm thế nào nó hoạt động trong nội bộ. Việc thực hiện các thành phần với nhau phải được đóng gói và ẩn từ riêng chúng. Bạn có thể xây dựng một máy tính mà không biết làm thế nào thành phần được thực hiện như thế nào.
Vì vậy chúng ta có thể dùng các project này để làm library cho các project kia.
OK. Hôm nay hãn tạm dừng tại đây .
Mình sẽ không nêu ví dụ trong bài hướng dẫn này .
Nhưng vẫn có bài tập cho các bạn luyện tập về nó .
Bài 1: Tạo chương trình nhập và in ra thông tin một sinh viên (tên , tuổi , quê quán , học lực (điểm trung bình của ba môn : toán , văn , anh)) . Phải sử dụng contructor và getter setter để thực hiện.
Bài 2 : Tạo một chương trình nhập và in thông tin nhân viên (id , tên , tuổi , chức vụ , phòng ban (id phòng ban , loai phòng) , số lương) . Trong đó nếu chức vụ là trưởng phòng thì lương không được dưới 10 triệu. Nếu là giám đốc thì lương không dưới 20 tr
Source code : here
(Code khung)
pass extract : https://coderandtutorial.blogspot.com

No comments:

Post a Comment