Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 8 của 8
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Lập Trình Hướng Đối Tượng, Sử Dụng Java

    Đây là loạt bài mình viết cũng lâu lâu rồi, mọi người đọc tham khảo. Nếu có thắc mắc có thể public lên đây để mình hoặc mọi người giải đáp. Nếu loạt viết có sai sót mong đc góp ý. Xin cám ơn,

    Ngoài ra các bạn có thể liên hệ mình theo email: beautifulsoul84hung@gmail.com
    Thân ái,

    beautifulsoul84hung


    Note: Bạn nên đăng nhập để xem được các file ảnh


    Bài 1: Dùng gì để dịch và chạy một chương trình Java ?

    - Cài JDK và path môi trường
    Mình có viết một cái ở đây, nói chung là ko hay nhưng dùng đc. Mọi ng có thể tham khảo
    http://www.youtube.com/watch?v=8edL8ViefPA
    hoặc làm theo Hướng dẫn này. Do bạn của mình viết

    - IDE: Có thể dùng NetBean hoặc Eclipse

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    xét đoạn code đơn giản sau
    Mã nguồn PHP:


    Mã:
    public class cviet{    public static void main (String args [])    {        System.out.println ("Hello cviet's member");    }}
    - Ta thấy rằng trước class cũng như function đều có từ khóa public ---> Đây là thuộc tính của hàm cũng như thuộc tính của class. public có nghĩa là công cộng, của chung ---> ai ai cũng có thể dùng được. thường thì các member function của class đều ở dạng public. Và đương nhiên là vậy rồi, một đối tượng phải giao tiếp với bên ngoài qua các method thì mới được coi là đối tượng
    (đây là một điểm đáng lưu ý khi lập trình hướng đối tượng)
    Ngoài ra còn có các thuộc tính private, protected. Nói qua về private: chỉ các thành phần dùng riêng, mà chỉ có một mình đối tượng được dùng. thường là các biến (attribute). Đương nhiên các method nào mà chỉ mình class dùng thì nên để ở dạng private
    có bạn sẽ thắc mắc: Vậy để tất ở public có được không ? xin trả lời: "đương nhiên là được. Nhưng nó vi phạm nguyên tắc của lập trình hướng đối tượng, còn vi phạm như thế nào mình sẽ giải thích ở các bài tiếp theo"

    - class name phải trùng tên với file name (điều này là bắt buộc trừ một vài trường hơp sau này bạn sẽ gặp )

    - Bạn đừng nên thắc mắc nhiều class có nghĩa gì, mà hãy công nhận rằng từ khóa class chỉ để thông báo rằng ta đang định nghĩa một lớp đối tượng

    - static: có nghĩa là tĩnh. Nó chỉ ra rằng main là một phương thức lớp

    - void: kiểu rỗng, không có trả về, sau này hàm còn có kiểu trả về là int float, char, String ......

    - các thứ khác như String args [] xin bạn cứ viết y nguyên và chưa nên thắc mắc sâu

    - lệnh: System.out.println ("hello itva's member");: Đây là lệnh in ra màn hình ngoài ra println còn thay thế được bằng printf, print
    println: có xuống dòng (ln: viết tắt của line)
    print: ko có
    printf: giống hệt C

    Điểm khác nhau bạn có thể theo dõi đoạn code sau:
    Mã nguồn PHP:

    Mã:
    public class hellobsh{        public static void main (String args [])    {        int x = 1000;        System.out.println ("Hello " + x + "bsh's member");        System.out.print("Hello " + x + "bsh's member");        System.out.printf ("Hello %d bsh's member", x);    }}
    kết quả thu được




    phân tích kq: Sau lệnh in 1 thì lệnh in 2 được xuống dòng, lệnh in3 ko đc xuống dòng . Lý do tại sao thì mình đã giải thích ở trên rồi. Bạn nào chưa học qua C thì nên bỏ qua lệnh printf. Vì giải thích về nó còn liên quan tới truyền biến .... Chúng ta nên nhớ cách 1 và cách 2 là đủ rồi hì hì


    Phần 2: Các thành phần cơ bản


    - Ngôn ngữ Java hỗ trợ ba kiểu chú thích sau:
    •/* text */
    •// text
    •/** documentation */. Công cụ javadoc trong bộ JDK sử dụng
    chú thích này để chuẩn bị cho việc tự động phát sinh tài liệu.

    - Dấu mở và đóng ngặc nhọn “{“ và “}”: là bắt đầu và kết
    thúc 1 khối lệnh.
    - Dấu chấm phẩy “;” kết thúc 1 dòng lệnh.


    - Biến
    Cái này chắc mình không phải nói qua nhiều nhỉ: java phân biệt chữ hoa và chữ thường chú ý: biến cũng có thuộc tính và kiểu dữ liệu
    (thuộc tính: public, private ....: "toàn cục, cục bộ")

    - Kiểu dữ liệu

    java có một cái khá thú vị: có kiểu dữ liệu cơ sở cũng như có kiểu dữ liệu đối tượng
    - Ngôn ngữ lập trình java có 8 kiểu dữ liệu cơ sở: byte, short, int, long, float, double, boolean và char.
    - Kiểu đối tượng: Viết đầy đủ tên, chữ cái đầu in hoa: Integer, Float, Double

    Bình thường chúng ta cứ sử dung kiểu dữ liệu cơ sở. không cần thiết sử dụng kdl đối tượng. Trừ String và các kdl ta định nghĩa để dùng =)). Đương nhiên là vậy rồi. Đối tượng ta định nghĩa mà không dùng thì để làm zì




    - Khai báo mảng:
    float arr [] = new float[100];
    ---> các kiểu dữ liệu khác khai báo và cấp phát tương tự. Điểm xuất phát là arr[0];

    - Các toán tử dùng sẽ được liệt kê ở bảng sau. Mọi người theo dõi





    Chú ý sự khác nhau giữa "=" và "==": Nhiều bạn làm quen tay rồi vẫn hay nhầm khi code. Lúc tìm thì ko thấy lỗi nhưng kết quả lại tùm lum

    Phần 3: Demo và giải thích một chút về nhập xuất để làm bài tập
    Mã nguồn PHP:

    Mã:
    import java.util.Scanner; public class hellocviet{        public static void main (String args [])    {        Scanner input = new Scanner (System.in);        System.out.print ("cviet co bao nhieu thanh vien ?: ");        int x = input.nextInt ();        System.out.println ("Hello " + x + "cviet's member");            }}
    các bạn thử chạy và xem kết quả.

    - import java.util.Scanner; ---> ad thư viện vào để dùng Scanner. Phần sau các bạn làm y hệt là được. Còn giải thích thì mình chưa muốn nói. vì liên quan tới rất nhiều thứ.
    ngoài nextInt () bạn có thể thay băng nextFloat (), nextDouble(), next () ... để nhập dữ liệu tương ứng
    Chú ý: Từ cơ bản thì nên làm theo chứ chưa nên hiểu nhiều


    Bài 1: Nhập 3 số và in ra số lớn nhất
    Bài 2: Nhập n số và in ra số lớn nhất
    Bài 3: Viết chương trình giải phương trình bậc 2

    Lời giải

    Bài 1


    Mã:
    import java.util.Scanner;public class max3so {    public static void main (String args [])    {        Scanner input = new Scanner (System.in);        System.out.println ("Moi Nhap");        System.out.print ("So thu nhat: ");        int a = input.nextInt ();        System.out.print ("So thu hai: ");        int b = input.nextInt ();        System.out.print ("So thu ba: ");        int c = input.nextInt ();        if (a > b)        {            if (a > c)                System.out.println ("Max: " + a);            else                System.out.println ("Max: " + c);        }        else        {            if (b > c)                System.out.println ("Max: " + b);            else                System.out.println ("Max: " + c);        }    }}
    Bài 2


    Mã:
     import java.util.Scanner; public class maxnso {    public static void main (String args [])    {        int n;        Scanner input = new Scanner (System.in);        System.out.print ("Nhap so phan tu: ");        n = input.nextInt ();        int arr[] = new int [n];        for (int i = 0; i < n; i ++)        {            System.out.print ("pt thu " + i + " la: " );            arr [i] = input.nextInt ();        }        int max = arr [0];        for (int i = 1; i < n; i ++)            if (arr [i] > max)                max = arr [i];        System.out.println ("Max: " + max);    }}
    bài 3


    Mã:
                /**                @author: bsh                @day:3/6/2012                @name: beautifulsoul84hung                            @progame: Giai phuong trinh bac 2            **/       import java.util.Scanner;     // Thu vien toan hoc duoc add luon nen ta ko can phai add     public class giaipt    {        public static void main (String args [])        {            int a, b, c; // he so cua phuong trinh            Scanner input = new Scanner (System.in);            System.out.print ("Nhap he so a: ");            a = input.nextInt ();            System.out.print ("Nhap he so b: ");            b = input.nextInt ();            System.out.print ("Nhap he so c: ");            c = input.nextInt ();            if (a == 0)            {                if (b == 0)                    System.out.println ("Phuong trinh vo nghiem");                else                    System.out.println ("Nghiem cua phuong trinh la: " + (float)c/b);                    // Chung ta phai ep kieu. Vi nghiem cua phuong trinh la kq phep chia                     //---> ket qua ko nhat thiet la so nguyen            }            else            {                int denta = b*b - 4*a*c;                if (denta < 0)                    System.out.println ("Phuong trinh vo nghiem");                else if (denta == 0)                    System.out.println ("Phuong trinh co duy nhat nghiem" + (float)-b/(2*a));                else                {                                        float x1 = (float)(-b-Math.sqrt (denta))/ (2*a);                    float x2 = (float)(-b+Math.sqrt (denta))/ (2*a);                    System.out.println ("Phuong trinh co 2 nghiem phan biet" + x1+ "" + x2);                }                            }        }    }

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    - Điều kiện: if


    Mã:
    if(biểu thức){// khoi lenh}else if (biểu thức){// khoi lenh}....else if (biểu thức){// khoi lenh}else (biểu thức){// khoi lenh}
    biểu thức: ở đây chính là các biểu thức so sánh, <; >; >=; <=; == (chú ý == chứ ko phải là =)
    chú ý là ko cần thiết phải có else if. Nhưng một khi có else if thì phải có else



    Ví dụ về if else: sinh viên nào có điểm < 4.0 thì thông báo failed, còn lớn hơn hoặc = thì pass

    - for: Vòng for trong java giống hệt như trong C++ vậy.
    form:


    Mã:
    for (int i = 0; i< n; i++){//------}
    Chúng ta dùng vòng for để duyệt mảng, đếm, ...... <chúng ta đã làm quen ở bài 2 với vòng for>




    - while, do ..while

    while (bieu thuc)
    {
    // khi ma bieu thuc dung thi thuc thi trong vong while
    }

    do
    {
    // khi ma bieu thuc dung thi thuc thi vong while
    }while (bieu thuc);

    Note: Câu hỏi: Điểm khác nhau cơ bản giữa while và do while là gì ?





    - switch ... case:


    Mã:
    int i;>> nhap i = ?switch (i){case 1://---break;case2://---break;case 3://---break;default:// ---}
    switch case sẽ nhảy tới vị trí của i mà ta chọn. do đó thích hợp dùng switch case để xây dựng các menu

    VD: Dùng while hoặc do while để đảo ngược số tự nhiên. Hoặc là một cách nào đó.
    Mã nguồn PHP:


    Mã:
    import java.util.Scanner;// su dung thu vien nhap public class daoso{    public static void main (String args [])    {        Scanner input = new Scanner (System.in);        System.out.println ("Nhap so tu nhien tu ban phim: ");                 // Nhap so tu nhien tu ban phim        int stn = input.nextInt ();                System.out.println ("Dao nguoc la: ");                while (stn!=0)        {            System.out.print (""+ stn%10);            // ta cu cat lay duoi cua so tu nhien va in ra            // ----> in ra man hinh ket qua cua phep du cho 10            stn = stn/10;        }                //                System.out.println ();             }}
    Vd: ví dụ tiếp theo mình sẽ hướng dẫn các bạn xây dựng menu bằng switch case và vòng lăp do while
    Do code dài nên khi đọc các bạn cần chú ý
    Mã nguồn PHP:


    Mã:
    /**@author: bsh@name:beautifulsoul84hung@day:5/6/2012@programe: Menu**/   // thu vien su dung ham nhapimport java.util.Scanner; public class menu{    public static void menu ()    {        Scanner input = new Scanner (System.in);        int luachon;                    // su dung vong lap do while de lap vo han nhap. den khi nguoi dung nhap 0 de thoat        do        {                        // in ra man hinh menu             System.out.println ("****************************************");            System.out.println ("** 0: thoat                           **");            System.out.println ("** 1:                                 **");            System.out.println ("** 2:                                 **");            System.out.println ("** 3:                                 **");            System.out.println ("** 4:                                 **");            System.out.println ("****************************************");            System.out.println ("Moi nhap lua chon: ");             // Nhap lua chon de thuc thi switch case             luachon = input.nextInt ();            switch (luachon)            {                case 1:                    int lc;                    do                    {                        // menu con tu menu lon                         System.out.println ("****************************************");                        System.out.println ("** 0: thoat                           **");                        System.out.println ("** 1:                                 **");                        System.out.println ("** 2:                                 **");                        System.out.println ("****************************************");                        System.out.println ("Moi nhap lua chon: ");                        lc = input.nextInt ();                        switch (lc)                        {                            case 1:                                System.out.println ("lua chon nhanh 1");                                break;                            case 2:                                System.out.println ("lua chon nhanh 2");                                break;                            default:                                System.out.println ("Moi nhap lai: ");                                break;                            case 0:                        }                    }while (lc != 0);                    break;                case 2:                    System.out.println ("ban chon case 2");                    break;                case 3:                    System.out.println ("ban chon case 2");                    break;                case 4:                    System.out.println ("ban chon case 2");                    break;                default:                    System.out.println ("Moi nhap lai: ");                    break;                case 0:            }        }while (luachon !=0);    }    public static void main (String args [])    {        menu ();    }}

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bài 4: Lập trình hướng đối tượng. Các thành phần cơ bản

    Đến với lập trình hướng đối tượng mình sẽ giải thích nghĩa của một số thuật ngữ thông dụng. Các bạn nhớ không nên gượng ép vào ngôn ngữ lập trình. Không nên cố gắng hiểu nó liên quan gì tới ngôn ngữ. Chú ý chỉ cần hiểu các thuật ngữ nói lên điều gì, không nên tìm hiểu tạo ra hay làm ra chúng hay chức năng của chúng đối với một ngôn ngữ làm gì. Vì chắc chắn mình sẽ giới thiệu cách làm. Nếu các bạn chưa hiểu rõ bản chất của chúng mà đi tìm hiểu chức năng thì sẽ rơi vào một vòng luẩn quẩn, mông lung. Sau này chắc chắn sẽ khó học


    I> Khái niệm về đối tượng và class

    1: Đối tượng là gì ? (Object)

    Đối tượng là những thực thể. Có thuộc tính và các tính chất hay những hoạt động cụ thể nào đó. Ví dụ như đối tượng là con chó, con gà, chân chó, chân gà . Vậy thì khi xác định một thứ gi gỉ gì gi có phải là đối tượng hay không thì bạn chỉ việc phân tích chúng có thuộc tính hay tính chất chăng hihi. Mời các bạn đến với cách phân tích một tờ giấy sau:




    Thuộc tính của nó là dòng kẻ và màu sắc. Do đó tờ giấy chính là đối tượng

    // Phần dưới hơi nâng cao. Dành cho các bạn khá. Các bạn khác có thể tham khảo thêm

    Sau này khi làm việc với ngôn ngữ lập trình nhiều bạn sẽ thấy rằng đối tượng là tất cả những kiểu dữ liệu không phải nguyên thủy (int, float, double). Đúng vậy chúng ta có thể gọi đối tượng là kiểu dữ liệu bởi vì đối tượng sau khi chúng ta tạo ra không phải chỉ để cho có. Mà chúng là “vốn” để ta triển khai các hoạt động
    Ví dụ: Giả sử chúng ta có vốn là: Chó. Mèo -- Chúng ta sẽ dùng vốn đó để tạo ra các hoạt động. Như mèo thấy chó thì chạy, chó thấy mèo thì đuổi …. Chứ nếu chỉ tạo ra đối tượng mà không làm gì cả thì ta tạo ra chúng liệu có ích gì ?


    2: Lớp (class)

    Có thể ví von như sau. Giả sử như chiếc xe đạp là đối tượng thì bản vẽ tạo nên chiếc xe đạp là class. Nói theo cách hàn lâm thì đối tượng chính là một thể hiện của class
    Tại sao chúng ta lại nói đối tượng là một thể hiện của class ? Đơn giản vì một class sẽ tạo ra rất nhiều đối tượng  Chả có ai lại tạo ra một bản vẽ để tạo một sản phẩm giá rẻ cả.

    Note: class là một cái khuôn để đúc ra đối tượng



    (bản thiết kế ô tô: Đây chính là class)




    Các ô tô được sản xuất theo bản thiết kế (chính là các đối tượng)

    II> Phân tích để xây dựng một kiểu dữ liệu hướng đối tượng


    1: Phân tích: Để xây dựng một bài theo kiểu hướng đối tượng ta sẽ phải làm các bước phân tích sau

    B1: Xác định kiểu dữ liệu để xây dựng nên nó: có thể là kiểu dữ liệu đối tượng
    -Ví dụ như để tạo đối tượng là con chó: Ta cần phải có các dữ liệu sau đấy (vốn): Chân chó, đầu chó, mắt chó ….
    Chú ý: Tất cả phải để ở private vì chẳng có con mèo nào hay bất cứ một loài nào khác cần chân chó để tạo thành chân nó cả. Hehe. Nhớ nhé. Đừng để public. Không là chỉ có mình bạn cần cân chó để tạo thành chân mình thôi đấy. hehe. Mình cũng nhấn lại. Bất kì cái gì dùng riêng cho con chó thì để ở private hết


    B2: Sau bước phân tích đặc điểm thì chúng ta xây dựng các phương thức tạo, hiện dữ liệu.

    Chính là phương thức getX (), setX() ….. Sử dụng các phương thức này thì bạn giống như một bác sỹ thực thụ
    Ví dụ sử dụng setChan (objectc chan..) -- bạn đã thay cho đối tượng đó chân rồi đấy 
    Lập trình hướng cấu trúc chắc chắn bạn không gặp nhưng không sao cả, với hướng đối tượng thì bạn là một bác sỹ thực thụ.

    B3: Phân tích và tạo dựng các hoạt động.

    Ví dụ như chó thì hoạt động là: bắt bóng, đuổi mèo, giữ nhà ……  Đấy. Nhưng thứ bạn phân tích chỉ có vậy

     Chú ý: Bạn chỉ cần hiểu nghĩa, chưa cần hiểu ứng dụng của nó trong lập trình hướng đối tượng nhé 

    Bài này nhiều lí thuyết quá. Mình cho bạn nào mới học một lời khuyên “Nếu bạn đọc chưa hiểu thì hãy đọc thêm lần nữa”. Đây là những khái niệm nền tảng để bạn đến với lập trình hướng đối tượng đấy


    các bạn có thắc mắc gì về con trỏ this thì để bài sau nhé . Các bạn thật chú ý phương thức get và set cho mình. Cực kì quan trọng. Chú ý kiểu đối tượng truyền vào set và kiểu đối tượng trả về ở get

    code thì bạn có thể lấy ở đây
    Mã nguồn PHP:

    Mã:
    public class Chó {// các thuộc tính    private objectc chancho;    private objectm matcho;    ...... // Các hoạt động    public void setChan (objectc chancho)    {        this.chancho = chancho;    }    public objectc getChan ()    {            return chancho;    }    ..        public void hoatdong (object x)    {        if (x == người)        {            thanthien ();        }        else if (x == mèo)        {            duoibat ();        }        else if ( ...)        {            ...        }        else            ...    }}
    Mình có bài tập cho các bạn muốn thực hành

    Viết class point:
    a- có phương thức tính khoảng cách 2 điểm A, B bất kì
    b-Di chuyển điểm A, tính khoảng cách A, B

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Hàm tạo (constructor)

    1. Nhắc lại đôi nét về hàm tạo

    Như mình có trình bày hôm trước. Hàm tạo là một hàm có nhiệm vụ chắp ghép các dữ kiện ban đầu để tạo thành đối tượng. Ví dụ như từ chân, mắt, mũi … để ghép thành một chú chó.

    2. Cách viết hàm tạo

    - Hàm tạo phải có tên trùng tên của class. Ví dụ class name: chó thì hàm tạo cũng là chó () function




    - Trong hàm tạo không có từ khóa return (tức là không trả về) và cũng không có kiểu trả về. Rất đặc biệt nhé các bạn. Đây là hàm rất khác so với các hàm khác. Các hàm khác thường là public X function () nhưng hàm tạo lại là public function () trong đó X là float, int, double….



    3. Đặc Điểm

    - Hàm tạo được gọi khi một đối tượng được tạo ra
    - Một lớp có thể có nhiều hàm tạo - Mời đọc tiếp phần nạp chồng hàm dưới đây (overload)


    4. Đôi Nét về quá tải hàm (overload):
    (có thể xem ở ví dụ 1)

    Quá tải hàm là trạng thái các hàm giống nhau về tên, khác nhau về số lượng các đối số truyền vào hay khác nhau về kiểu đối số truyền vào
    Đó là 2 đặc điểm mà bạn cần nhớ để hiểu thế nào là quá tải hàm. Mời các bạn theo dõi ví dụ sau để hiểu ngay đc vấn đề
    class Test và hai hàm tạo Test tương ứng






    5. Hàm tạo không đối và hàm tạo mặc định (default constructor, no-argument constructor)

    Rất nhiều bạn nhầm lẫn cho rằng 2 hàm này là một. Nhưng thực tế đây là 2 hàm hoàn toàn khác nhau
    Chúng ta sẽ đi từ khái niệm trước

    - Default constructor (hàm tạo mặc định)

    Nếu như trong class không có hàm khởi tạo thì máy ảo java sẽ làm nhiệm vụ gọi ra một default constructor để tạo ra một đối tượng thể hiện của class. Thực chất chỉ là tạo ra một cái jj đó linh tinh mang tên thể hiện của lớp nhưng chưa có gì cả. Bởi vì vốn dĩ hàm tạo mặc định giống như một hàm ta khai báo mà không định nghĩa. Hoặc là định nghĩa không gì cả -> khó hiểu đúng không hihi. Chú ý thấm nhé. Hihi. “Hàm tạo mặc định được định nghĩa theo kiểu không gì cả, không có những thuộc tính gì cả”


    - No –argument constructor (hàm tạo không đối)

    Nó cũng gần gần giống hàm tạo mặc định. Hoàn toàn có thể giống hệt luôn và chỉ khác nhau cái tên hihi.
    Nhưng chẳng ai lại làm thế cả. Thường thường khi làm với class đơn giản, làm ít lần một số bạn hay làm vậy. Nhưng hàm tạo không đối cho phép ta set một số giá trị cho một số thuộc tính cuả đối tượng

    Ví dụ: Con chó nào cũng có chân, có mắt, có đuôi … Vậy thì không việc gì ta phải sử dụng hàm tạo mặc định. Sau đó lại sử dụng các phương thức setChan, setMat, setDuoi … rất phức tạp, nhàm chán trong cùng một công việc


     Ngoài ra các bạn có thể tìm hiểu thêm về hàm tạo, có rất nhiều thứ khá thú vị. Nhưng do đây là hướng dẫn cơ bản nên mình không muốn đào quá sâu một thứ không khó lắm, và cũng không quá quan trọng


    Hủy Đối tượng trong java


    1. Đôi nét về phương thức finalize

    Trong java không có hàm hủy (phương thức hủy, method). Phương thức finalize được gọi để dọn dẹp rác. Sở dĩ nó không phải phương thức hủy bởi vì khi đối tượng bị hủy bỏ, chưa chắc nó đã được gọi tới. Nó được gọi tới khi máy ảo java khởi động trình dọn dẹp rác


    2. Giải phóng bộ nhớ trong java

    Nhớ lại trong C++ ta sử dụng toán tử new để cấp phát và giải phong bằng toán tử delete. Nhưng nhiều khi các bạn quen tay dùng mà không chịu trả lại. Có nghĩa là new nhưng lại không delete để trả lại bộ nhớ cho hệ thống, khi đó bộ nhớ sẽ bị rò rỉ. Để khắc phục tình trạng đó, C++ cũng có hàm hủy mặc định. Tuy nhiên nó không được thong manh cho lắm. hihi Dẫn đến nhiều chương trình phải kết thúc bất thường, hậu quả thì thật là khó nói ==”

    Trong java thì không có những khái niệm như vậy. Máy ảo java đủ thông minh để biết được đối tượng nào không dùng tới nữa và cho lên xe gom rác =))


    Bài tập: Xây dựng cấu trúc dữ liệu danh sách liên kết đầy đủ
    ps: Ngoài lề: Có thể thêm giao diện, menu để chương trình đẹp mắt

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trong lập trình hướng đối tượng thì kế thừa là một thuật ngữ được nhắc tới thường xuyên, rất thông dụng. Chẳng có lí gì mà ta lại không tận dụng những bước của người đi trước làm tiền đề cho mình đúng không nào. Việc này giảm tải được sự thừa thãi không đáng có. Ví dụ con chó con rất giống cha nó bởi nó được di truyền lại từ con chó cha. Do đó ta cần khai báo chó con thừa kế từ cha nó sau khi khai báo xong ta được sử dụng luôn những đặc tính đã có sẵn của con chó cha.

    Chính inheritance làm cho các class của java ngày một phong phú hơn. Từ một số lớp cơ sở, sơ khai, (lớp ông tổ) dần dần theo thời gian tạo thành một khối lượng khổng lồ các class




    1. Lớp cơ sở và lớp dẫn xuất

    Một lớp mà được kế thừa từ một lớp nào đó ta gọi là lớp dẫn xuất, lớp qua quan hệ thừa kế, tạo nên lớp dẫn xuất thì lớp đó được gọi là lớp cơ sở

    2. Cách xây dựng. Sử dụng từ khóa extends (hiểu nôm na thì extends là “được kế thừa từ thằng”)

    Ex: public class a extends b {
    …..
    }

    Qua ví dụ thì ta hiểu rằng: Thằng a “được kế thừa từ thằng” b
    Qua khái niệm thì ta có thể hiểu nôm na thế này. Mọi thuộc tính của lớp a sẽ được kế thừa từ lớp b (thành phần public hay protected).

    Chú ý: ta không thể truy cập được vào thành phần private cũng như package của lớp cơ sở. Giải tích nôm na là thế này. Con cái được hưởng rất nhiều từ bố mẹ. Nhưng không phải cái gì của bố mẹ con cái cũng biết được. Đương nhiên cha cũng phải có bí mật của cha. Mẹ cũng phải có bí mật của mẹ hì hì
    Note: có 2 phương thức mà lớp dẫn xuất không được kế thừa. đó là phương thức xây dựng và phương thức finalize
    Các bạn có thể tự suy nghĩ để hiểu tại sao ko kế thừa đc nhé …. ?. Câu hỏi dành cho các bạn 


    3. Sâu thêm về method trong lớp dẫn xuất

    Đi từ khái niệm. Lớp dẫn xuất kế thừa gần hết các thành phần của lớp cơ sở. Do đó mà ta dễ hình dung rằng cha và con có cùng interface (giao diện) + con có thêm một số thành phần mới

    Cơ mà thực tế không phải vậy. Java hỗ trợ rất nhiều chức năng tự động, nhiều khi không tường minh dẫn tới có rất rất nhiều sự hiểu lầm

    Không phải lớp con chỉ sao chép interface của lớp cha. Chúng ta nên hiểu thế này. Khi tạo ra một đối tượng từ lớp dẫn xuất thì nó chứa bên trong nó các sự vật con của lớp cơ sở.


    4. Override (ghi đè)

    Đây là hiện tượng mà method của lớp con giống hệt method của lớp cha về tên cũng như tham số truyền vào. Thì người ta gọi là ghi đè, Chú ý ghi đè khác quá tải hàm. Có nghĩa là Override hoàn toàn khác Overload -> Các thuật ngữ này rất giống giống nhau nhưng bản chất lại khác nhau hoàn toàn. Do đó ko nên có sự nhầm nhọt đáng tiếc hihi. Chú ý thuật ngữ override gắn liền với thừa kế


    5. Từ khóa super.

    Có nghĩa khi gọi tới một hàm nào của cha từ class con thì ta dùng từ khóa super. Cũng đúng thôi vì mình trích lại định nghĩa này cho các bạn xem … Còn ví dụ cụ thể mình sẽ phân tích ở 2 class phía dưới
    Không phải lớp con chỉ sao chép interface của lớp cha. Chúng ta nên hiểu thế này. Khi tạo ra một đối tượng từ lớp dẫn xuất thì nó chứa bên trong nó các sự vật con của lớp cơ sở.


    Các bạn có thể thấy. Mình sử dụng phương luôn phương thức của lớp cha. Bởi bạn có thể hiểu thế này. Chó cũng là động vật. Do đó không lí gì mà nó không có chức năng của động vật

    Tuy nhiên chú ý kĩ thì động vật là một con gì đó chung chung. Nếu in kết quả ra màn hình. Thì bạn chỉ biết nó là động vật và có mấy chân. Nhưng không hề biết nó là động vật gì

    Nhiệm vụ của override là làm rõ điều đó. Các bạn có thể theo dõi mình sửa lại class chó. Mình override method display
    6. Thiết kế cây thừa kế.(vd động vật)
    Bước 1, ta xác định các đặc điểm chung và trừu tượng mà tất cả các loài động vật đều có

    Bước 2, thiết kế một lớp với tất cả các thuộc tính và hành vi chung kể trên. Đây sẽ là lớp mà tất cả các lớp động vật đều có thể chuyên biệt hóa. Các đối tượng trong ứng dụng đều là các con vật (animal), do đó, ta sẽ gọi tên lớp cha chung của chúng là Animal. Ta đưa vào đó các phương thức và biến thực thể mà tất cả các con vật đều có thể cần. Kết quả là ta được lớp cha là lớp tổng quát hơn, hay nói cách khác là trừu tượng hơn, c.n các lớp con mang tính đặc thù hơn, chuyên biệt hơn lớp cha.
    Bước 3: Xác định xem các lớp con có cần các hành vi (cài đặt của các phương thức) đặc thù của thể loại con cụ thể đó hay không?
    Bước 4: Tiếp tục dùng trừu tượng hóa tìm các lớp con có thể còn có hành vi giống nhau, với mục đích phân nhóm mịn hơn nếu cần.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0



    Nhìn vào hình ảnh cũng như trên thực tế thì ta thấy có nhiều class ko nên tạo thực thể. Giả sử như lược đồ trên. Chả có đối tượng nào chỉ là Animal. Ít nhất nó phải là một con vật nào đó.
    1 Mục đích

    Chúng ta có thể tạo ra các lớp cơ sở để tái sử dụng mà không muốn tạo ra đối tượng thực của lớp. Chúng ta dùng từ khóa abstract trước class.




    Vậy khi nào một lớp nên là lớp trừu tượng, khi nào th. nên là lớp cụ thể? Bút chắc là lớp trừu tượng. Bút bi và Bút máy có lẽ cũng nên là các lớp trừu tượng. Vậy đến khi nào thì các lớp trở thành lớp cụ thể? Bút máy Parker liệu có thành lớp cụ thể hay vẫn là lớp trừu tượng? Có vẻ như bút máy Hồng Hà nét hoa 2008 chắc chắn là lớp cụ thể. Nhưng làm thế nào để chắc chắn?





    2 Phương thức trừu tượng.

    Không chỉ lớp, ta còn có thể khai báo các phương thức trừu tượng. Một lớp trừu tượng có nghĩa phải tạo lớp con cho nó; còn một phương thức trừu tượng có nghĩa rằng nó phải được override.

    Để thống nhất giao diện giữa lớp cha và lớp con. Ta khai báo trừu tượng ở lớp cha. Và cài đặt cụ thể tại lớp con
    Note: Các con khác nhau tuy có cùng giao diện nhưng cách cài đặt lại tùy từng đứa con đó
    Cũng dễ hiểu thôi: Ví dụ như cùng là động vất nhưng trâu với chó lại có cái chân khác nhau về màu sắc, hình dáng …..
    - Phương thức trừu tượng bắt buộc phải được cài đặt lại ở lớp con để sử dụng





    Lớp Giao Diện (interface)

    Interface là mức trừu tượng cao hơn lớp trừu tượng. Có nghĩa là mọi method của nó chỉ được khai báo giao diện, không được phép cài đặt gì cả
    - Đặt từ khóa interface trước class
    - Lớp cài đặt (kiểu như kế thừa) sử dụng từ khóa implements thay vì extends





    Chú Ý: Một class chỉ có thể extends của 1 class khác nhưng lại có thể đc implements nhiều class khác

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Tiếp đi bạn ơi. đang hay mà[IMG]images/smilies/applause.gif[/IMG]

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •