Một số kiến thức căn bản

Hãy tìm kiếm trước khi HỎI hoặc ĐĂNG BÀI




kết quả từ 1 tới 6 trên 6
  1. #1
    Tech Admin Avatar của TreXanhVN
    Gia nhập
    May 2007
    Nơi cư ngụ
    Vietnam
    Bài gởi
    949

    Mặc định Một số kiến thức căn bản

    1.Một số câu hỏi và trả lời về Java
    Tất cả đều đã nghe nói về Java. Nhưng liệu có ai không còn câu hỏi nào về hiện tượng này? Bây giờ, khi "bức tranh" Java đang đến ngay trước mắt mọi người, hãy thử xem qua công nghệ này và giải đáp các thắc mắc phổ biến nhất

    H: Java là gì?

    Đ: Đây là ngôn ngữ lập trình mới do một nhóm nhỏ các nhà khoa học của hãng Sun Microsystems sáng tạo nên. Theo như truyền thuyết của những người tạo ra ngôn ngữ này, thoạt tiên Java được gọi là Oak và người ta định dùng nó để lập trình cho bộ TV (set-top box). Tất cả các khả năng hiện tại cũng như những lời đao to búa lớn chỉ mới có sau này. Từ nền tảng Oak lúc đó, hãng Sun đã phát triển cả một chi nhánh tên là JavaSoft.

    H: Có phải JavaScript chỉ là một tên khác của Java?

    Đ: Không đúng. JavaScript là ngôn ngữ kịch bản để thông dịch (interpreted scripting language). Java là ngôn ngữ lập trình đích thực để biên dịch (complied programming language). Java và JavaScript chỉ có chung vài điểm nhỏ về ngữ pháp có thể làm các nhà lập trình quan tâm. Xét về tổng thể chúng là hai công cụ khác nhau hoàn toàn.

    H: Thế JavaBeans là gì?

    Đ:JavaBeans là một mẫu đơn thể khả chuyển, độc lập hệ máy (portable), platform-independent component model). Các lập trình viên dùng chúng để tạo các đoạn phần mềm mà người khác có thể dùng được trong chương trình của họ.

    H: Nếu Java cũng chỉ là một ngôn ngữ lập trình như bao ngôn ngữ khác, tại sao có nhiều lời đao to búa lớn thế?

    Đ: Về kỹ thuật, Java chỉ là ngôn ngữ lập trình nhưng có mục tiêu rất xa: nó cho phép lập trình viên tạo các bản sao chương trình mà người dùng có thể chạy trên hầu hết các hệ máy và hệ điều hành. Khả năng này thường được gọi là "viết một lần, chạy mọi nơi" (write once, run anywhere) là một lợi thế cực lớn. Nó biến Java thành công nghệ chủ chốt trong máy tính mạng (NC) và là thành phần sống còn của lập trình Web.

    H: Tôi không viết chương trình và chỉ dùng Microsoft Windows thì tôi đâu cần phải quan tâm đến khả năng "viết một lần, chạy mọi nơi"?

    Đ: Do tầm quan trọng của Java đối với các nỗ lực phát triển NC, nó cũng là yếu tố không nhỏ trong vấn đề Tổng chi phí sở hữu (total cost of ownership - TCO). Sự tranh luận này đã buộc Microsoft và các công ty khác chú ý hơn đến vấn đề phiền phức là nâng cấp và bảo trì cả một "hạm đội" các hệ thống Windows. Công ty Microsoft đã tung ra bộ Zero-administration (không cần quản trị) và người ta hy vọng hãng sẽ bổ sung nhiều tính năng tương tự trong các phiên bản mới của Windows. Microsoft cũng đang phát triển dòng máy NC riêng. ở dòng này máy đầu cuối là một loại đặc biệt chạy Windows và máy chủ đa người dùng cũng chạy Windows.

    Ngoài ra, nếu bạn dùng một trình duyệt Web tương đối mới, rất có khả năng máy bạn đã chạy một vài Java applet. Rất nhiều các dải chữ chạy hay hoạt hình trong các trang Web được viết bằng Java. Đến cuối năm nay sẽ có nhiều công ty bắt đầu dùng Java để tạo các trang phức tạp hơn và tương tác hơn như các hướng dẫn cho người dùng cài đặt hay dùng thử các sản phẩm phần mềm.

    H: Sự khác biệt giữa Java app (ứng dụng Java) và Java applet là gì?

    Đ: ứng dụng (app) là một chương trình độc lập mà bạn có thể chạy trên máy của mình. Các ứng dụng phi-Java có rất nhiều, trong đó có cả tá bạn đang dùng như Microsoft Word hay Excel. Cho đến nay mới có rất ít ứng dụng Java. Java applet thường chỉ là các chương trình nhỏ hơn nhiều. Chúng chỉ chạy bên trong trình duyệt Web của bạn.

    H: Nếu mới chỉ có ít ứng dụng Java và các lập trình viên hiện nay chủ yếu dùng Java để tạo minh họa trang Web thì "lợi thế lớn" ở đâu?

    Đ: Minh họa trang Web chỉ là bước đầu. Ngôn ngữ dùng cho mạng máy tính này khai thác sự liên kết tốt hơn rất nhiều việc đơn thuần dùng chung tập tin. Hai dự án nổi bật cho hướng này là Kona của Lotus (xem http://www.kona.lotus.com) và Alta của Corel. Cả hai dự án đều tập hợp các ứng dụng gọn nhẹ, gồm soạn thảo văn bản, bảng tính, tu sửa hình đồ họa hay trình diễn các PIM. Tất cả chúng ta đều chạy trên máy tính mạng hay bất kỳ hệ thống Windows (hay phi Windows) nào hỗ trợ Java. Những chương trình này không được trông đợi sẽ thay thế hoàn toàn các bộ chương trình văn phòng.

    Chúng sẽ là các chương trình gọn hơn, đơn giản hơn mà bạn hay cần đến trong văn phòng. Ưu thế của bộ này là bạn không phải cài đặt hay bảo trì cả một mớ phần mềm văn phòng trên máy của mình. Khía cạnh hấp dẫn nhất của Kona và Alta, theo dự kiến là khả năng đật cấu hình. Mai này nếu bạn có một bộ phần mềm như vậy trong máy, bạn có thể tùy ý sửa chữa. Ví dụ nếu bạn dùng SmartSuite 98 của Lotus, bạn được phép thêm bớt các thành phần ActiveX và Kona. Alta thậm chí cho phép bạn tùy biến giao diện của chương trình bằng một trình soạn thảo HTML bất kỳ trên thị trường.

    Đây có lẽ là bước đầu của việc chuyển đổi từ các cấu hình phần mềm độc nhất, định sẵn sang các thành phần cho phép tùy đặt cấu hình. Nếu bạn muốn một giải pháp trọn bộ, tiêu chuẩn hóa thì cũng có sẵn. Nhưng nếu bạn đã biết rõ mình cần và không cần gì, bạn có thể lắp ghép các thành phần, điều chỉnh hệ thống theo như nhu cầu. Tuy vậy cuộc cách mạng này sẽ chưa diễn ra chừng nào Java chưa hoàn tất cam kết "viết một lần, chạy mọi nơi".

    H: Khái niệm "100% Pure Java - Java chính gốc" là gì?

    Đ: Đây là một loại chứng thư của Sun cấp cho chương trình viết bằng Java thỏa yêu cầu không phụ thuộc vào mã của hệ điều hành và sẽ chạy trên bất cứ máy ảo Java nào (JVM - Java Virtual Machine).

    H: Làm sao một chương trình có thể chạy mọi nơi?

    Đ: Một ứng dụng cổ điển, như Lotus 1-2-3, bản thân nó đã tự chạy được. Cuộc sống của phần mềm bắt đầu khi người ta viết ra bằng một ngôn ngữ lập trình nào đó như C chẳng hạn. Chương trình phát triển sẽ dịch nó sang mã nhị phân (binary format) để bộ xử lý của máy bạn chạy trực tiếp được. Do máy Mac và PC dùng bộ xử lý khác nhau, chúng không thể dùng chung một bản chương trình gốc (native executable), trừ phi dùng một phần mềm nào đó giải lập kiến trúc của máy kia. Nói chung việc giả lập thường làm giảm tốc độ và dễ gây ra vấn đề do kém tương thích. Các chương trình Java được dịch sang kiến trúc của riêng nó, gọi là định dạng bytecode. Để chạy chương trình Java, bạn cần một phần mềm nữa phiên dịch mã bytecode cũng như cung cấp cho nó môi trường và các dịch vụ cần thiết. Tầng phần mềm này chính là JVM. Máy ảo Java biến tất cả mọi nền phần cứng và phần mềm trở nên giống nhau dưới con mắt của chương trình Java. Về hiệu quả, FVM giống một trình điều khiển thiết bị của chương trình Java.

    Chạy chương trình Java trên JVM vẫn còn chậm hơn một chút so với chạy chương trình viết thẳng cho hệ máy đó. Dầu vậy, công nghệ JVM đang tiến bộ mau chóng về mặt tốc độ và khoảng cách sẽ được thu ngắn lại rất nhiều trước cuối năm nay. Symatec và Microsoft đã bán ra rất đúng lúc các trình biên dịch và Sun sẽ tung ra HotSpot VM trong quý 4 năm 1997. Với sự kết hợp này, người ta mong đợi chương trình Java sẽ chạy nahanh như các trình viết bằng C. Các hãng phần mềm coi hướng phát triển bằng JVM là rất hấp dẫn vì họ có thể đẩy các chương trình Java chạy trên mọi hệ máy. Chỉ cần họ viết một JVM cho hệ máy đó. Cho đến nay, đã có JVM cho rất nhiều hệ máy, từ máy tính lớn (mainframe) đến hầu hết tất cả các kiểu máy để bàn kể cả PC và Mac.

    H: Liệu VM có là một mốt nhất thời?

    Đ: Tôi e rằng không. Trước hết, máy để bàn ngày nay có đủ sức mạnh để hỗ trợ phần việc mới - chạy chương trình qua JVM. Do đó vấn đề cần quan tâm là chương trình sẽ chạy nhanh hơn trong Java hay trong C++. Nếu bạn dùng các chương trình kiểu như soạn thảo văn bản thì bạn sẽ không nhận ra sự khác biệt. Xét ở tình huống khác, nếu làm việc với bảng tính lớn, cần tính toán nhiều, bạn sẽ nhận ra sự khác biệt về tốc độ và bạn có thể sẽ không muốn dùng ứng dụng Java. Tuy vậy, một khi HotSpot VM ra đời, sự khác biệt tốc độ sẽ biến mất.

    Và khuynh hướng là người ta ngày càng dùng nhiều hơn công nghệ VM. Trong năm 1997, IBM sẽ xuất xưởng máy ảo đa năng, hỗ trợ ba ngôn ngữ: Java, BASIC và Smalltalk. Nếu như thử nghiệm này thành công, hy vọng sẽ có thêm nhiều sản phẩm hỗ trợ công nghệ VM.

    H: Công nghệ Java đã hoàn chỉnh?

    Đ: Không nó chưa hoàn chỉnh. Java là ngôn ngữ trẻ kéo theo một cái đuôi khổng lồ. Tuy vậy nó đang phát triển và thay đổi ở tốc độ chóng mặt.

    H: Tại sao tôi phải để ý đến Java?

    Đ: Các công cụ phát triển phần mềm là các chương trình cực kỳ phức tạp và thường có lỗi. Khi các nhà phát triển dùng các công cụ này chế tạo phần mềm thương mại, những lỗi này có thể tạo ra "khe nút" trong sản phẩm. Các công cụ lập trình, sau mỗi ấn bản lớn thường đòi hỏi một vài lần chỉnh sửa để giải quyết lỗi cho bớt đi đến mức chấp nhận được. Khi công cụ thay đổi nhanh quá, các công ty viết ra sẽ không còn thời gian mày mò tìm lỗi. Nếu có điều kiện vào Internet, bạn sẽ thấy nhiều cuộc trao đổi về các chương trình Java chạy khác nhau hay không chạy trên các trình duyệt khác nhau hay dưới hệ điều hành khác. Hy vọng những vấn đề này sẽ chóng qua.

    Một vấn đề nữa là việc học lập trình. Lập trình viên chưa bao giờ biết tường tận công cụ của họ vì mỗi lần thay đổi lớn họ lại phải học cái mới. Trước mắt, dùng phần mềm Java rút gọn dường như hơi phiêu lưu so với dùng phần mềm thường. Một số phần mềm Java cần phải tăng khả năng tái dùng các thành phần của chúng, như vậy lập trình viên sẽ có thời gian tập trung vào việc năng suất chất lượng và tính uyển chuyển của sản phẩm. Nhưng không ai có thể làm được điều này chừng nào các công cụ chưa chấm dứt việc bị sửa đổi như chong chóng hiện nay.

    H: Tôi có thể tìm ra các lợi ích gì nữa từ các thành phần?

    Đ: Có thể. Đã nhiều năm chúng tôi biết có dự định rằng người sử dụng có thể tùy biến thay đổi các bộ phận của phần mềm như kiểm tra chính tả và tu sửa đồ họa nhưng trong thực tế thì chưa thấy. Lý do chính là các công ty phần mềm chưa thấy sự khuyến khích thỏa đáng. Java và ActiveX đi theo hướng này. Các sản phẩm như Kona của Lotus và Alta của Corel sẽ chỉ cho thấy người dùng có thật sự cần tính năng này không.

    H: An ninh trên Internet là một vấn đề không thể bỏ qua. Còn Java thì sao?

    Đ: Các đoạn mã Java đương nhiên an toàn hơn ActiveX và không như các điều khiển ActiveX, nó không tạo ra bất cứ thay đổi nào trong cấu hình hệ thống. Nhưng vấn đề an ninh vẫn cón cho cả Java, ActiveX lẫn các hệ điều hành và trình duyệt Web. Sắp tới, ít nhất Java chắc vẫn tiếp tục an toàn hơn mức trung bình. Đoạn mã Java độc ác nhất vẫn không thể chạm vào các đĩa cứng hay Registry của máy bạn. Các than phiền phổ biến nhất về "đống cát" Java là nó quá cứng nhắc. Nó không cho phép các nhà phát triển thậ được làm những việc đáng ra được quyền làm. Ví dụ, Java applet không thể đọc được tài liệu trong máy cục bộ. Tương lai sẽ sáng sủa hơn vì Sun sẽ hỗ trợ một hình thức chứng thư, bạn thêm chút tự do cho đoạn mã Java từ các nguồn tin cậy.

    H: Java sẽ tiến tới đâu?

    Đ: Có hai việc đã rõ ràng. Thứ nhất, Java sẽ tiếp tục biến đổi ở mức độ đáng kinh ngạc hiện nay ít nhất trong 6 tháng tới vì Sun và các công ty khác đang nỗ lực đáp ứng nhu cầu các nhà phát triển. Về lâu về dài, đây là điều tốt cho người sử dụng. Điểm thứ hai, Sun, Netscape, IBM cùng nhiều công ty khác đã đầu tư rất nhiều vào Java nên không ai dám nghĩ rằng họ lại có giây phút do dự trong việc biến Java thành một ngôn ngữ thành công dài lâu.

    Hiện nay Java đã tồn tại, nếu chỉ xét đến mảng dùng để tạo đoạn mã trong trang Web. Java đã thực sự trở thành một trong những ngôn ngữ căn bản của Web và nó hữu dụng đến mức khó mà thay thế. Tương lai của Java ở góc độ là một công cụ tạo các ứng dụng kinh doanh lớn thì còn mờ mịt hơn nhiều. Câu trả lời chắc phụ thuộc vào việc Sun sẽ cố gắng đến đâu trong một hai năm tới trong việc sửa đổi Java về căn bản. Các yếu tố khác là sự phổ biến của máy tính mạng, sự thành công của các sản phẩm như Kona và Alta. Sun đã tạo và hỗ trợ một số tính năng mới rất đáng kể: công nghệ InfoBus của Lotus cho phép các thành phần Java chia sẻ dữ liệu dễ dàng và một nhóm làm việc Java tên là JFC chuyên giúp lập trình viên đẩy nhanh việc phát triển phần mềm. Cuộc cách mạng CN là phần khó giải nhất của câu đố này. Dầu vậy những bước đi đầu tiên cũng đã có vẻ rõ ràng. Nó sẽ thâm nhập vào các thiết bị đầu cuối của các máy tính lớn truyền thống trong các cơ sở giáo dục. Tất nhiên, việc NC sẽ chiếm 0,1% hay 25% thị trường máy để bàn vẫn còn chưa biết được. Dầu sao đi nữa, Java vẫn sẽ là phần quan trọng của toàn cảnh NC, loại máy đang mở rộng thị trường cho các chương trình chuyên Java mà bạn cũng có thể chạy trên Windows.

    DMCA.com Protection Status




    Chia sẻ bài viết...



    Copy đoạn dưới và gửi cho bạn bè qua Yahoo!
    Link bài viết Diễn Đàn Tin Học by QRCode
    Giao lưu kết bạn với TreXanhVN qua tài khoản Facebook.

    - Cung cấp Hosting và Domain cho các cá nhân và doanh nghiệp: http://www.trexanhvn.net/


    Hỗ trợ các thành viên qua:
    Y!M: trexanhvnnet (Khi add nick vui lòng để lại message "Mình là thành viên trong Diễn Đàn Tin Học Việt Nam" nhé!)
    Skype: trexanhvnnet


  2. #2
    Tech Admin Avatar của TreXanhVN
    Gia nhập
    May 2007
    Nơi cư ngụ
    Vietnam
    Bài gởi
    949

    Mặc định

    2.Chương trình Java được thực thi như thế nào?
    Đối với các ứng dụng chạy độc lập
    Khi một ứng dụng Java độc lập được yêu cầu chạy thì công việc đầu tiên mà JVM làm là tìm kiếm phương thức main của nó và chạy phương thức đó nếu như nó tìm được các dấu hiệu đúng chứng tỏ sự có mặt của phương thức này. Dấu hiệu đó là:

    public static void main(String args[])

    args là một mảng của Strings và bạn có thể đặt cho nó một cái tên khác tuỳ ý bạn.
    Phương thức này khi được yêu cầu thực thi thì nó sẽ vận hành lớp mã chứa trong nó trước sau đó mới gọi các phương thức khác có liên quan đến nó.

    Các Applet

    Trong một applet thì JVM lại đi tìm phương thức init trước. Cách thức nhận biết phương thức này là:
    public void init()
    Sau đó nó sẽ tìm đến phương thức start
    public void start()
    Tiếp đến là phương thức paint
    public void paint(Graphics g)
    Phương thức paint được thực thi bất cứ khi nào mà JVM cần nó để biểu diễn applet đó ra màn hình. Do vậy đây là một phuơng thức được thực thi nhiều lần trong suốt quá trình chạy applet.
    Tiếp đó, chúng ta có một số các phương thức khác có liên quan đến việc xử lý các sự kiện. Chúng ta sẽ bàn đến trong một bài khác.
    Khi người sử dụng rời khỏi trang có chứa applet đang chạy (ví dụ: chuyển sang trang khác) thì phương thức stop được gọi:
    public void stop()
    Nếu trình duyệt quay trở lại trang chứa applet, thì phương thức start lại chạy trở lại, sau đó là phương thức paint và các phương thức xử lý sự kiện khác.
    Khi mà applet ngừng chạy do trình duyệt bị đóng lại, do người sử dụng chuyển từ trang chứa applet sang trang khác trong một khoảng thời gian tương đối nào đó (đủ để trình duyệt ngừng chạy applet) hoặc do mã của applet ngầm ngừng thực thi nó thì phương thức destroy được gọi ra:
    public void destroy()
    Trong một bài khác tôi sẽ nói về các phương thức cơ bản của applet, trong đó có init(), start()..
    Giao lưu kết bạn với TreXanhVN qua tài khoản Facebook.

    - Cung cấp Hosting và Domain cho các cá nhân và doanh nghiệp: http://www.trexanhvn.net/


    Hỗ trợ các thành viên qua:
    Y!M: trexanhvnnet (Khi add nick vui lòng để lại message "Mình là thành viên trong Diễn Đàn Tin Học Việt Nam" nhé!)
    Skype: trexanhvnnet


  3. #3
    Tech Admin Avatar của TreXanhVN
    Gia nhập
    May 2007
    Nơi cư ngụ
    Vietnam
    Bài gởi
    949

    Mặc định

    3. Lập trình OOP
    Bài của danceswithwolves trên ddth.com (boxC++)

    OOP 1 : Tiến trình trừu tượng của các ngôn ngữ lập trình

    Mọi ngôn ngữ lập trình (NNLT) đều mang một mức độ trừu tượng nhất định. Mức độ phức tạp của mỗi vấn đề/bài toán (cần giải quyết bằng phương pháp lập trình) thực tế phụ thuộc vào mức độ trừu tượng này. Hợp ngữ (assembly) là một sự trừu tượng từ ngôn ngữ máy (mã máy được sinh ra khi ta biên dịch các đoạn code assembly - vốn gồm các từ khóa "gần giống tiếng Anh"). Những NNLT như Fortran, BASIC hay C là một mức độ trừu tượng cao hơn (có cấu trúc) của hợp ngữ. Những NNLT này là sự cải tiến lớn so với hợp ngữ; tuy nhiên ở mức độ trừu tượng của những NNLT này, lập trình viên (LTV) vẫn phải tư duy về cấu trúc máy tính hơn là cấu trúc vấn đề cần giải quyết. Tức là LTV phải thiết lập sự liên hệ giữa mô hình máy tính và mô hình vấn đề thực tế. Điều này đem đến nhiều thách thức trong công việc coding cũng như bảo trì code.

    Thay thế cho việc mô hình hóa máy tính là sự mô hình hóa vấn đề cần giải quyết. Những ngôn ngữ như LISP hay APL đem đến cách nhìn nhận vấn đề từ khía cạnh khác (chẳng hạn như "mọi vấn đề cuối cùng cũng chỉ là những danh sách" hay "mọi vấn đề đều có tính giải thuật"). Tương tự như vậy, PROLOG quan niệm mọi vấn đề là "chuỗi những quyết định". Mỗi ngôn ngữ trên được thiết kế riêng (và là phương án tốt) cho mỗi loại bài toán; tuy nhiên, nếu để giải quyết một loại bài toán có đặc tính cơ bản khác hẳn thì tiêu liền.

    Tiếp cận vấn đề bằng phương pháp lập trình hướng đối tượng (object-oriented programming - OOP) là một bước nhảy vọt trong tư duy lập trình. Lập trình hướng đối tượng là động tác mô hình hóa các thành phần trong miền vấn đề (problem space). Sự mô hình hóa này có tính tổng quát đủ để giải phóng LTV ra khỏi sự ràng buộc về kiểu/loại vấn đề/bài toán. Người ta gọi những thành phần trong miền vấn đề khi được mô hình hóa là những đối tượng (objects). Mỗi đối tượng, tương tự như các đối tượng trong thế giới thực, có những thuộc tính và hành vi riêng của mình. Do phương pháp tư duy OOP rất gần với cách thức tư duy của con người, LTV sẽ được tự do chú trọng vào cấu trúc vấn đề - điều cần giải quyết - hơn là cấu trúc máy. Thực tế, OOP mang đến một mức độ trừu tượng mềm dẻo và mạnh mẽ hơn những cách tiếp cận trước đây.

    Alan Kay rút ra được 5 tính chất cơ bản của SmallTalk – NNLT OO phổ biến đầu tiên, đó là :

    1. Mọi thứ đều là đối tượng (everything is an object). Hãy xem như mỗi đối tượng là một biến đặc biệt. Một đối tượng ngoài việc mang dữ liệu (như các biến thường), còn có thể “được yêu cầu, ra lệnh” từ LTV.
    2. Một chương trình là một lô một lốc các đối tượng có thể “nói chuyện” với nhau bằng cách gửi các thông điệp (a program is a bunch of objects telling each other what to do by sending message). Để “ra lệnh” cho một đối tượng, LTV “gửi một thông điệp” đến đối tượng đó. Cụ thể hơn, một thông điệp cũng giống như một câu gọi hàm (hàm của đối tượng).
    3. Mỗi đối tượng có vùng nhớ riêng được tạo nên từ những đối tượng khác (each object has its own memory made up of other objects). Có thể hiểu là, một đối tượng có thể được cấu thành từ nhiều đối tượng có sẵn khác. Vì vậy, LTV có thể xây dựng một chương trình mà mức độ phức tạp được ẩn giấu sau sự giản dị (dễ dùng) của các đổi tượng.
    4. Mọi đối tượng có một kiểu nhất định (every object has a type). Mỗi đối tượng là một phiên bản của một lớp/kiểu/loại. Ví dụ như đối tượng con Kiki nhà tôi là một phiên bản của lớp chó, hay con Kiki thuộc lớp chó.
    5. Mọi đối tượng cùng kiểu đều có thể nhận cùng thông điệp (all object of a particular type can receive the same messages). Ví dụ như mọi con thuộc lớp chó đều biết cách sủa, con Kiki cũng không ngoại lệ.

    Booch đề xuất một cách mô tả súc tích hơn về đối tượng :
    Một đối tượng có trạng thái, có hành vi và được định danh (an object has state, behaviour and identity )

    OOP 2 : Giao diện của đối tượng
    Interface of object

    Aristotle chắc hẳn là người đầu tiên nghiên cứu khái niệm type (kiểu); ông đã từng phát biểu về “chủng loài cá và chủng loài chim” (the class of fishes and the class of birds). Ý tưởng “mọi đối tượng, ngoài tính đơn nhất, luôn là một thành phần của một chủng loài, có những tính cách và hành vi chung” đã được áp dụng vào NNLT hướng đối tượng đầu tiên là Simula-67, với từ khóa cơ bản class đã giới thiệu một “kiểu” mới cho LTV.
    Class (lớp) có thể hiểu như là bản mô tả tập hợp những object (đối tượng có những thuộc tính (thành phần dữ liệu) và hành vi (chức năng) như nhau. Một class thực tế là một kiểu dữ liệu đặc biệt mà mỗi biến được khai báo từ đó ngoài việc mang dữ liệu, còn có những chức năng xử lý dữ liệu của bản thân. Cái hay ho là LTV định nghĩa một class (tạo một kiểu dữ liệu mới) để giải quyết vấn đề chứ không bị buộc phải lệ thuộc vào những kiểu dữ liệu có sẵn (được các nhà thiết kế NNLT thiết kế theo đơn vị lưu trữ trên máy tính). LTV có thể mở rộng ngôn ngữ bằng cách định nghĩa thêm các kiểu dữ liệu đặc thù cho vấn đề của riêng mình.
    Một khi LTV định nghĩa thành công một class, LTV có thể tạo bao nhiêu object tùy thích (hmm, dĩ nhiên tớ đang cố ý quên không xét đến những giới hạn của phần cứng), rồi thì tha hồ chơi bời với chúng như thể chúng là những thành phần tồn tại trong vấn đề bạn giải quyết. Thực tế, một trong những thách thức của OOP là công việc thiết lập sự tương quan giữa những object trong phạm vi vấn đề cần giải quyết (bài toán) và những object trong phạm vi giải pháp (giải pháp).
    Làm cách nào “bắt” object hành động ? Chắc chắn phải có một cách nào đó để LTV “ra lệnh” cho object, kêu nó làm cái gi đó; chẳng hạn như với object Form, kêu nó “biến” đi cho khuất mắt hay bắt nó dịch chuyển ra góc màn hình. Mỗi object chỉ có thể hiểu được những “yêu cầu” nhất định, tùy thuộc vào hệ thống class mà nó được sinh ra; ví dụ như với object Dogs thì ta kêu nó “bark” (sủa) được, chứ kêu nó “fly” (bay) thì nó chịu chết (tất nhiên nếu bác LTV nào hứng lên viết cho class Dogs một method fly thì ta sẽ có một loài chó biết bay). Trở lại vấn đề, những yêu cầu có thể đối với một object được định nghĩa bởi giao diện (interface) của nó; và, chính “kiểu” quyết định giao diện này.
    Ví dụ ta đã định nghĩa một class Light với hai chức năng là TurnOn (thực hiện bật đèn) và TurnOff (thực hiện tắt đèn). Cú pháp code giống như C++, tuy nhiên tớ nghĩ dễ hiểu cả với người chưa biết C++.

    Code:--------------------------------------------------------------------------------
    // khai báo một object mylight thuộc class Light
    Light mylight = new Light();
    // tới đây ta có một cái đèn tên là mylight

    // bật đèn mylight lên cho sáng
    mylight.TurnOn(); // --> đèn sáng

    // tắt đèn mylight tiết kiệm điện mùa khô
    mylight.TurnOff(); // --> đèn tắt
    --------------------------------------------------------------------------------Giao diện quyết định những yêu cầu nào có thể đưa ra cho một object. Tuy nhiên, rõ ràng là phải có code ở đâu đó được thực hiện khi object nhận yêu cầu. Code này, cùng với những dữ liệu ẩn, là những đặc tả implementation. Với những bạn có kiến thức về lập trình thủ tục (procedural programming), có thể hiểu như là mỗi “kiểu” có những hàm (function) liên đới, tương ứng với mỗi yêu cầu. Khi object nhận được yêu cầu, hàm tương ứng sẽ được gọi. Tiến trình này thường được tổng quát hóa bằng cách mô tả LTV “gửi một thông điệp” (send a message/make a request) đến một object, và object đó biết phải làm gì (execute code) với thông điệp này.
    Trong ví dụ trên, tên của “kiểu”/class là Light, và mylight là tên một object cụ thể thuộc class Light. Bạn có thể thấy rằng, với những object thuộc class Light, những yêu cầu hợp lý có thể là TurnOn (bật), TurnOff (tắt), MakeBrighter (chỉnh sáng), MakeDimmer (chỉnh tối) v.v... Đoạn code Light mylight = new Light() thực hiện việc đăng ký vùng nhớ cho một object kiểu Light, thực hiện khởi tạo object (initialization, sẽ bàn sau) và gán một tham chiếu (reference) tên mylight đến object đó. Để dễ hiểu hơn, bạn hãy tưởng tượng object kiểu Light (chiếm một vùng nhớ trên bộ nhớ) như là một cái đèn xịn, biến tham chiếu mylight như là một cái remote (đèn xịn mà lị). Mỗi khi cần gì, bạn không phải chạy lại chỗ cái đèn mà chỉ cần bấm cái remote mylight là xong. Chính vì tham chiếu mylight đại diện cho object đèn nên có thể nhập nhằng gọi mylight là một object cũng được (ta hiểu là đang nói đến object mà mylight tham chiếu tới). Cú pháp gọi method (phương thức/chức năng/hành vi) ở trên là <tên object>.<tên method>; đoạn code mylight.TurnOn() thực hiện gửi yêu cầu "bật đèn" đến object mylight

    Chú ý :
    Mặc dù những gì ta làm khi lập trình hướng đối tượng là ‘tạo những kiểu dữ liệu mới’ (create new data types), thực tế mọi ngôn ngữ lập trình hướng đối tượng sử dụng từ khóa “class”. Khi bạn đọc từ “kiểu” (type), hãy xem như “lớp” (class); và ngược lại.
    Giao lưu kết bạn với TreXanhVN qua tài khoản Facebook.

    - Cung cấp Hosting và Domain cho các cá nhân và doanh nghiệp: http://www.trexanhvn.net/


    Hỗ trợ các thành viên qua:
    Y!M: trexanhvnnet (Khi add nick vui lòng để lại message "Mình là thành viên trong Diễn Đàn Tin Học Việt Nam" nhé!)
    Skype: trexanhvnnet


  4. #4
    Tech Admin Avatar của TreXanhVN
    Gia nhập
    May 2007
    Nơi cư ngụ
    Vietnam
    Bài gởi
    949

    Mặc định

    4. Đóng gói các chương trình nhỏ với Java Archive
    Người viết: CEO/pcdinh
    Thành viên của http://www.JavaVietnam.org
    Ngày bắt đầu: 14/9/2003
    Ngày cập nhật: 14/9/2003
    Bản 1.0

    Người mới học lập trình Java thường không thấy thoải mái khi mà chạy các chương trình Java đã biên dịch bằng các dòng lệnh. Gỉa sử bạn đã xây dựng nên một chương trình đơn giản mang tên HelloWorld chứa trong HelloWorld.java:

    Bạn biên dịch nó:

    javac HelloWorld.java

    Và bạn có HelloWorld.class

    Bạn chạy nó:

    java Helloworld

    Nhưng trình tự này không làm bạn hứng thú gì. Bạn tìm ra một giải pháp khác: batch file.

    Bên cạnh file HelloWorld.class, bạn tạo ra một file text trống. Đổi tên nó thành starthere.bat. Mở file này trong Notepad và đưa vào đó:

    java HelloWorld

    Lưu nội dung đó lại và đóng file. Chạy file batch này, bạn vẫn được kết quả như ý muốn.

    Nhưng bạn vẫn chưa hài lòng. Gỉa sử bạn lại có một chương trình đã biên dịch khác có chứa nhiều lớp, đặc biệt là các lớp lồng trong (inner). Khi biên dịch, ngoài lớp chính thì bạn còn thấy nhiều lớp con được tách ra nằm trong các file riêng với kí hiệu rất khó hiểu $1, $2 ...nằm trong phần tên của nó. Các file này khác nhiều khiến cho bạn bối rối khi muốn thông dịch file chính để chạy chương trình. Một phần là vì số file hơi nhiều khiến cho việc quản lý khó khăn.

    Còn cách nào không? Dĩ nhiên là có. Java Archive với kí hiệu tên file là .jar quen thuộc là giải pháp 100% Java mà bạn có thể lựa chọn lúc này. Trên Win32, .jar được gọi là các file Java có thể thực thi, nghĩa là bạn chỉ cần kích chuột vào file .jar đó và chương trình chạy. File .jar thực chất là một container (file chứa) chứa đựng các file .class và các file khác cần để chạy chương trình của bạn. Khi đó bạn không còn nhìn thấy nhiều file .class kia nữa.


    Các bước như sau:
    1. Biên dịch chương trình của bạn thành bytecode (các file ".class")

    2. Tạo một file text (chuẩn ANSI) chứa các dòng sau:


    Main-Class: MyApp
    trong đó

    MyApp
    là tên lớp của ứng dụng của bạn có chứa phương thức

    public static void main
    Nhớ đừng đưa đuôi ".class" vào. Lưu file này vào thư mục chứa các file .class của ứng dụng của bạn. Đặt tên file là

    MyApp.mf
    hoặc bất cứ cái tên nào bạn muốn nhưng nhớ có đuôi .mf (Manifest file).

    3. Mở cửa sổ command prompt và thay đổi thư mục hiện thời thành thư mục chứa các file .class của ứng dụng của bạn và file text mới tạo kia. Ví dụ:

    cd\MyJava\source\
    4. Gõ câu lệnh tương tự như sau lên cửa sổ command prompt:


    jar -cvmf MyApp.mf MyApp.jar MyApp.class
    hoặc nếu bạn có nhiều file ".class" thì:


    jar -cvmf MyApp.mf MyApp.jar MyApp.class other.class another.class
    hoặc bạn muốn tất cả các file ".class" nằm trong thư mục hiện thời:


    jar -cvmf MyApp.mf MyApp.jar *.class
    5. Sau dòng lệnh này thì một file .jar mới sẽ xuất hiện trong thư mục chứa các file .class của bạn. Chỉ cần kích đúp vào đó, chương trình sẽ chạy. Nếu nó không chạy thì đuôi mở rộng .jar không liên kết với javaw.exe. Trong windows XP, kích đúp vào file, chọn "open with > choose program", chọn "always use this program", kích "browse", tìm đến và kích đúp vào "javaw.exe". Các Win khác cũng củ rứa như thế thôi. Nếu bạn đã cài J2SDK thì không chắc đã phải làm như vậy, trình cài đặt của J2SDK sẽ tự đăng kí file .jar. Nếu bạn mới chỉ cài Máy ảo Java thì cái file javaw.exe nằm ở C:\Program Files\Java\j2re1.4.2_01\javaws\ (trên máy tính của tôi là như vậy)

    tham số

    -cvmf
    thông báo cho jar.exe biết là bạn muốn:
    c - tạo ra một file gom nhóm (archive) mới
    v - gửi ra màn hình thông tin về những gì jar.exe đang làm.
    m - Chỉ định file manifest của bạn
    f - Tạo ra một file ".JAR" thay vì chỉ gửi kết quả ra màn hình (STDOUT).

    Chú ý rằng tham số m đi sau tham số f, do vậy file manifest phải được chỉ rõ trước khi chỉ định file ".jar". Bạn có thể đặt f trước m (-cvfm), nhưng sau đó bạn phải hoán đổi lại thứ tự của ".mf" và ".jar" .

    Bạn hãy gõ

    jar -?
    để có thêm thông tin về các tuỳ chọn khác.

    Nếu bạn nhận được thống báo lỗi "bad command or filename" hay "not recognized whatever" khi gõ câu lệnh jar thì bạn sẽ cần thiết lập biến môi trường PATH của bạn để nó nhận biết được thư mục BIN của môi trường thực thi Java trong máy của bạn. Ví dụ:

    path=%path%;c:\j2sdk1.4.2_01\bin
    từ của sổ dòng lệnh... nhưng nó sẽ không có tác động lên hệ điều hành khi bạn đóng cửa sổ dòng lệnh. Để thiết lập biến này lâu dài thì trong các hệ điều hành Windows 9x, Me bạn thêm nó vào C:\AUTOEXEC.BAT .... Trong Windows XP thì biến PATH được thiết lập thông qua:
    START > Control Panel > System > Advanced Tab > Environment Variables. Tìm "Path" và thêm dòng sau vào phần giá trị của nó ở cuối:

    ;c:\j2sdk1.4.2_01\bin
    Chi tiết cách thiết lập biến môi trường này tôi đã nói rõ trong bài Nhập môn Java đăng trên http://javavietnam.2ya.com

    Tìm hiểu một chút về cấu trúc file .jar
    Khi bạn tạo ra một file .jar, thì bạn hãy tự hiểu rằng bạn đã tạo ra một file nén trong đó có chứa một thư mục META-INF. Trong thư mục META-INF có một file manifest (là file chứa thông tin lược giản về cơ chế vận hành của chương trình được đóng gói).

    Sau đây là cấu trúc của nó

    myApp.jar
    +
    +
    +--META-INF (directory)
    +---MyClass.class
    +---myManifest.mf

    Thông tin trong file MANIFEST:

    Main-Class: <tên hợp lệ đầy đủ của lớp có chứa phương thức main>
    Class-Path: <classpath chor JVM>

    Khi bạn dùng cài đặt một chương trình nén và giải nén như Winace thì chắc chắn nó sẽ nhìn nhận .jar như là một file nén và bạn không thể thực thi .jar khi kích đúp lên nó được vì chương trình Winace sẽ chạy và cái mà bạn nhìn thấy chỉ là cấu trúc của file .jar. Khi đó bạn hãy cắt kết nối .jar khỏi Winace thông qua cơ chế config của chương trình này.



    Nếu ứng dụng của bạn cần đến các đối số

    Nếu ứng dụng của bạn cần đến các đối số như một số chương trình chẩn đoán mạng: ping, tracert. traceroute... thì để chạy ứng dụng bạn cần gõ dạng như sau:

    c:\> java jade.Boot -container Argument1:Argument2

    Tuy nhiên, jar không cho phép bạn nhập đối số kiểu như vậy mà bạn phải nhập từ dòng lệnh

    java -jar myapp.jar arg1 arg2 arg3 ...

    Nhưng đối với người sử dụng bình thường thì việc này là quá phức tạp và họ chỉ muốn click and go mà thôi. Khi đó bạn có hai lựa chọn

    Tạo ra một file .bat có chứa:
    @javaw.exe -jar MyApp.jar -container parameter2 parameter3
    Hai là tạo ra một shortcut trên môi trường windows của bạn. Trên môi trường Windows XP, kích chuột phải lên file .jar. Kích chọn Create Shortcut. Một file shortcut sẽ xuất hiện, khi đó bạn ấn Alt+Enter họăc kích phải vào file đó, chọn Properties, tìm đến Target. Đó là chỗ bạn có thể nối các đối số vào file .jar như bạn chạy chương trình như thể bạn đã chạy chwong trình ở chế độ dòng lệnh vậy:
    MyApp.jar parameter1 parameter2
    Chú ý: bạn không cần đặt "javaw.exe -jar" ở phần đầu của chuỗi lệnh trong Target. Nếu chương trình của bạn nằm ở thư mục khác với thư mục chứa shortcut thì bạn hãy thêm đường dẫn tuyệt đối hay tương đối cho nó. Ví dụ nếu MyApp.jar nằm ở

    c:\Applications\MyApp.jar
    thì dòng target của shortcut là như sau:

    c:\Applications\MyApp.jar parameter1 parameter2
    Giao lưu kết bạn với TreXanhVN qua tài khoản Facebook.

    - Cung cấp Hosting và Domain cho các cá nhân và doanh nghiệp: http://www.trexanhvn.net/


    Hỗ trợ các thành viên qua:
    Y!M: trexanhvnnet (Khi add nick vui lòng để lại message "Mình là thành viên trong Diễn Đàn Tin Học Việt Nam" nhé!)
    Skype: trexanhvnnet


  5. #5
    Tech Admin Avatar của TreXanhVN
    Gia nhập
    May 2007
    Nơi cư ngụ
    Vietnam
    Bài gởi
    949

    Mặc định

    5. Sự khác nhau giữa một tham chiếu trong Java với một biến kiểu con trỏ trong C/C++
    Một biến trong Java hoặc nhận một trong 8 kiểu dữ liệu primitive hoặc là một tham chiếu (reference) tới một đối tượng. Ta chỉ có 2 lựa chọn đó mà thôi.

    Nếu một biến có kiểu primitive thì giá trị của nó được lưu tại cùng một vùng nhớ với biến.

    Nếu biến là một tham chiếu, giá trị của biến sẽ là một địa chỉ bộ nhớ. Địa chỉ bộ nhớ này là vùng mà đối tượng được tham chiếu đến. Đối tượng mới chứa dữ liệu thực sự.

    Lý do tại sao biến kiểu primitive thì giá trị của nó được lưu tại cùng một cùng nhớ với biến còn biến tham chiếu thì không, anh cl đã giải thích:


    Ðơn giản hoá
    1. Stack management.
    2. Garbage collection.
    3. Safety


    Nghe như vậy ta chẳng thấy gì khác nhau giữa một tham chiếu trong Java với một biến kiểu con trỏ trong C/C++ cả. Sau đây sẽ giải thích sự khác nhau giữa chúng, bắt đầu bằng khái niệm con trỏ và tham chiếu:

    Một con trỏ là thuật ngữ dùng để mô tả một biến, biến đó trỏ đến một vùng nhớ xác định. Còn một tham chiếu là một biến tham chiếu tới một đối tượng cụ thể.

    Nghe như vậy vẫn chẳng có gì khác nhau cả, từ từ tiếp tí nữa đó, làm gì mà nóng thế:

    Cả con trỏ và tham chiếu đều là các giá trị số nguyên 32 hoặc 64 bit chứa một địa chỉ bộ nhớ. Tuy nhiên, con trỏ có thể được sử dụng như một số nguyên trong các ngôn ngữ khác, điều này cho phép các phép tính con trỏ được thực hiện. Thêm nữa, trong các ngôn ngữ khác, một con trỏ có thể trỏ tới một kiểu dữ liệu primitive. Trong Java, một tham chiếu chỉ có thể tham chiếu tới một đối tượng hoặc null. Thêm vào đó, không có các phép tính con trỏ trong Java. Không như con trỏ, bạn không thể "nhìn" thấy giá trị thực sự của một tham chiếu. Nên mặc dù tham chiếu là một địa chỉ bộ nhớ, bạn vẫn không thể tiếp cận với nó.

    Hay đấy, thế nếu ta ép tham chiếu thành kiểu int để "nghía" nó thì sao?

    Đáng buồn cho bạn là trình biên dịch không cho phép ép tham chiếu về bất cứ giá trị số nào. Không cho phép lập trình viên truy nhập trực tiếp vào bộ nhớ là một trong những tính năng bảo mật của Java.
    Giao lưu kết bạn với TreXanhVN qua tài khoản Facebook.

    - Cung cấp Hosting và Domain cho các cá nhân và doanh nghiệp: http://www.trexanhvn.net/


    Hỗ trợ các thành viên qua:
    Y!M: trexanhvnnet (Khi add nick vui lòng để lại message "Mình là thành viên trong Diễn Đàn Tin Học Việt Nam" nhé!)
    Skype: trexanhvnnet


  6. #6
    Tech Admin Avatar của TreXanhVN
    Gia nhập
    May 2007
    Nơi cư ngụ
    Vietnam
    Bài gởi
    949

    Mặc định

    Các bước tạo instance mới của lớp
    1. Gán các đối số cho các biến tham số của constructor được gọi.

    2. Nếu constructor này bắt đầu bởi việc gọi một constructor khác của cùng lớp (sử dụng this) thì các đối số sẽ được truyền vào cho các biến tham số của constructor vừa được gọi (nếu constructor này cần). Constructor vừa được gọi cũng thực hiện 5 bước như thực hiện đệ quy. Nếu việc gọi constructor kết thúc ngay lập tức thì thủ tục này cũng kết thúc ngay lập tức với cùng lý do, nếu không, chuyển tiếp sang bước 5.

    3. Nếu constructor này không bắt đầu bởi việc gọi một constructor khác của cùng lớp (sử dụng this), lớp này có superclass và superclass không phải là Object, khi đó constructor này sẽ bắt đầu gọi một constructor của superclass (sử dụng super). Tính toán các đối số và tiến hành gọi constructor của superclass qua 5 bước như thực hiện đệ quy. Nếu việc gọi constructor kết thúc ngay lập tức thì thủ tục này cũng kết thúc ngay lập tức với cùng lý do, nếu không, chuyển tiếp sang bước 4.

    4. Thực hiện việc khởi tạo các biến instance của lớp. Nếu qúa trình khởi tạo gặp lỗi và throw exception, thủ tục này sẽ kết thúc ngay với cung exception. Mặt khác chuyển sang bước 5.

    5. Thực hiện phần còn lại của thân constructor.

    Ví dụ:

    class Point { int x, y; Point () { x = 1; y = 1; } } class ColoredPoint extends Point { int color = 0xFF00FF; } class Test { public static void main(String[] args) { ColoredPoint cp = new ColoredPoint(); System.out.println(cp.color); } }

    Khi chạy chương trình trên, một instance mới của ColoredPoint được tạo ra. Đầu tiên, bộ nhớ sẽ lấy vùng nhớ để chứa giá trị cho các biến x, y và color. Tất cả các field đều lấy giá trị mặc định (trong trường hợp này là 0). Tiếp đó constructor không có đối số của ColoredPoint được gọi đầu tiên. Vì ColoredPoint không khai báo constructor nên một constructor mặc định được cung cấp tự động bởi trình biên dịch Java có dạng:

    ColoredPoint() { super(); }

    Constructor này sau đó gọi constructor không có đối số của Point. Constructor của Point không bắt đầu bởi việc gọi một constructor, nên trình biên dịch cung cấp một lời gọi ngầm (implicit) tới constructor không có đối số của superclass. Constructor của Point có thể được viết lại như sau:

    Point() { super(); x = 1; y = 1; }

    Bởi vậy constructor không có đối số của Object được gọi.

    Lớp Object không có superclass nên qúa trình đệ quy kết thúc tại đây. Tiếp theo, các biến instance của Object được khởi tạo. Sau đó, thân của constructor không có đối số của Object được thực hiện. Không có constructor nào được khai báo trong Object, nên trình biên dịch cung cấp một constructor mặc định, trong trường hợp đặc biệt này là:

    Object() { }

    Constructor này không thực hiện gì cả và quay trờ lại nơi gọi nó.

    Tiếp sau, tất cả các biến instance của lớp Point được khởi tạo. Việc khai báo x và y không cung cấp bất cứ khởi tạo nào nên không có hoạt động gì xảy ra ở đây. Tiếp theo, thân constructor của Point được thực hiện, x và y được gán giá trị 1.

    Sau đó, các biến instance của lớp ColoredPoint được khởi tạo. Bước này gán giá trị 0xFF00FF cho color. Cuối cùng, phần còn lại của thân constructor của ColoredPoint được thực hiện, trong trường hợp này không có gì được thực hiện.
    Giao lưu kết bạn với TreXanhVN qua tài khoản Facebook.

    - Cung cấp Hosting và Domain cho các cá nhân và doanh nghiệp: http://www.trexanhvn.net/


    Hỗ trợ các thành viên qua:
    Y!M: trexanhvnnet (Khi add nick vui lòng để lại message "Mình là thành viên trong Diễn Đàn Tin Học Việt Nam" nhé!)
    Skype: trexanhvnnet


Thảo luận qua mạng xã hội



Thông tin Chủ đề

Users Browsing this Thread

Hiện đang có 1 người đang đọc bài này. (0 thành viên và 1 khách)

Các đề tài liên quan

  1. Trả lời: 1
    Bài mới gởi: 24/08/2013, 10:28 AM
  2. Google Emd update: Dự kiến thay đổi tên miền trùng từ khoá tìm kiếm
    Bởi seotadao trong diễn đàn Tin đồn và diễn biến về CNTT
    Trả lời: 0
    Bài mới gởi: 30/10/2012, 01:15 PM
  3. Trả lời: 0
    Bài mới gởi: 06/04/2010, 12:24 PM
  4. Tin học căn bản
    Bởi hatuyet86 trong diễn đàn TIN HỌC CĂN BẢN
    Trả lời: 0
    Bài mới gởi: 04/06/2009, 09:11 PM

Bookmarks

Quyền Hạn Của Bạn

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể trả lời
  • Bạn không thể gửi file
  • Bạn không thể sửa bài viết
  •