Thứ Bảy, 7 tháng 12, 2013

Ngôn ngữ Java đằng sau vẻ bề ngoài



Khi bạn viết mã lệnh bằng ngôn ngữ Java, giống như nhiều ngôn ngữ khác, bạn viết mã nguồn, sau đó bạn biên dịch nó; trình biên dịch kiểm tra mã lệnh của bạn và đối chiếu với các quy tắc cú pháp của ngôn ngữ. Nhưng nền tảng Java bổ sung thêm một bước khác nữa ngoài các bước trên. Khi bạn biên dịch mã Java, bạn sẽ nhận được kết quả là mã byte (bytecodes). Sau đó, máy ảo Java (JVM) sẽ thông dịch các mã byte này lúc chạy thi hành– đó là khi bạn yêu cầu Java chạy chương trình.


Theo thuật ngữ hệ thống tệp, khi bạn viết mã, bạn sinh ra một tệp .java. Khi bạn biên dịch tệp này, trình biên dịch của Java sinh ra một tệp .class, chứa các mã byte. JVM đọc và thông dịch tệp .class này lúc chạy thi hành và nó hoạt động như thế nào là tùy thuộc vào nền hệ thống mà bạn đang chạy. Để chạy trên các nền hệ thống khác nhau, bạn phải biên dịch mã nguồn của mình đối với các thư viện dành riêng cho nền hệ thống đó. Bạn có thể hình dung rằng lời hứa hẹn “viết một lần, chạy mọi nơi” sẽ trở thành “viết một lần, kiểm thử mọi nơi”. Đó là có những sự khác biệt mong manh (hay không mong manh cho lắm) giữa các nền hệ thống, có thể khiến cho mã lệnh của bạn hành xử khác nhau trên những nền tảng khác nhau.




Khi bạn tạo các đối tượng Java, JRE sẽ tự động cấp phát không gian bộ nhớ cho các đối tượng này từ heap, đây là vùng bộ nhớ lớn có sẵn để cấp trong máy tính của bạn. Quá trình chạy thi hành sẽ theo vết của những đối tượng này giùm bạn. Khi chương trình của bạn không sử dụng các đối tượng đó nữa thì JRE sẽ vứt bỏ chúng. Bạn không phải để tâm đến chúng nữa.


Nếu bạn đã từng viết bất cứ phần mềm nào bằng ngôn ngữ C++, cũng là một ngôn ngữ hướng đối tượng (người ta cho rằng thế), với tư cách là lập trình viên, bạn phải cấp phát và lấy lại bộ nhớ dành cho đối tượng mình tạo ra một cách tường minh bằng cách sử dụng các hàm malloc() và free(). Điều đó đối với các lập trình viên thật là phiền hà. Nó cũng nguy hiểm nữa, vì nó mở đường cho việc thất thoát bộ nhớ len lỏi vào trong chương trình của bạn. Thất thoát bộ nhớ gây ra việc chương trình của bạn ngốn bộ nhớ với tốc độ phát hoảng, điều này gây sức ép lên bộ vi xử lý của máy tính đang chạy chương trình. Nền tảng Java giúp bạn loại bỏ nỗi lo về tất cả những vấn đề đó vì nó có thành phần thu dọn rác.


Bộ thu dọn rác của Java là một tiến trình nền phía sau để loại các đối tượng không còn được dùng tới nữa, chứ không buộc bạn phải tường minh làm điều đó. Máy tính rất thích hợp trong việc lưu giữ vết của hàng ngàn thứ và cấp phát tài nguyên. Nền tảng Java giúp cho phép máy tính của bạn thực hiện điều đó. Nó duy trì số đếm các tham chiếu đang dùng đến mọi đối tượng trong bộ nhớ. Khi con số này chạm mức 0, bộ thu dọn rác sẽ lấy lại vùng bộ nhớ mà đối tượng ấy đã sử dụng. Bạn có thể trực tiếp gọi bộ thu dọn rác, nhưng tôi không bao giờ phải làm điều đó. Nó thường tự xử lý và tất nhiên là cũng sẽ tự xử lý trong mọi mã ví dụ trong tài liệu này.








Như chúng ta đã lưu ý trước đây, nền tảng Java đi kèm với các công cụ dòng lệnh cho phép bạn biên dịch ( javac) và chạy (java) các chương trình Java. Vậy tại sao ta lại sử dụng một IDE như Eclipse? Đơn giản chỉ vì việc sử dụng các công cụ dòng lệnh có thể rất phiền phức, bất kỳ chương trình có độ phức tạp như thế nào. Các công cụ dòng lệnh có sẵn nếu bạn cần đến chúng, nhưng sử dụng một IDE thường là lựa chọn khôn ngoan hơn.


Lý do chính của khẳng định này là IDE quản lý tệp và đường dẫn giúp bạn, và có các trình hướng dẫn tương tác để hỗ trợ bạn khi bạn muốn thay đổi môi trường chạy thi hành của mình. Khi tôi muốn biên dịch một chương trình Java bằng công dụ dòng lệnhjavac, tôi phải lo việc thiết đặt biến môi trường CLASSPATH từ lúc đầu để JRE có thể biết nơi đặt các lớp của tôi, hoặc tôi phải thiết đặt giá trị cho biến này lúc biên dịch. Trong một IDE như Eclipse, tất cả những gì tôi phải làm là cho Eclipse biết tìm JRE ở đâu. Nếu mã lệnh của tôi dùng các lớp không do tôi viết ra, tất cả những gì tôi phải làm là cho Eclipse biết những thư viện mà dự án của tôi tham chiếu đến là gì và tìm chúng ở đâu. Điều này đơn giản hơn nhiều so với việc dùng dòng lệnh để gõ những câu lệnh dài đến phát khiếp để chỉ rõ đường dẫn đến lớp.


Nếu bạn muốn hay cần dùng các công cụ dòng lệnh, bạn có thể tìm thấy cách sử dụng chúng ở trang Web về công nghệ Java của Sun (xem Các tài nguyên).

Thứ Năm, 5 tháng 12, 2013

Tài nguyên java



Trang chủ chính thức về công nghệ java có đường liên kết đến mọi thứ liên quan đến nền tảng Java. Bạn có thể tìm thấy mọi tài nguyên ngôn ngữ Java “chính thống” bạn cần ngay ở đây, bao gồm cả các đặc tả ngôn ngữ và tài liệu API. 
Xem trang tài liệu Java để tìm các đường liên kết tới tài liệu API cho mỗi phiên bản SDK. 

Bài Taming Tiger của John Zukowski trên developerWorks đưa ra một cách nhìn về phiên bản gần nhất của nền tảng J2SE. 

Trang chủ javadoc chứa tất cả các thành phần trong ngoài của javadoc, bao gồm cả cách dùng các công cụ dòng lệnh và cách viết Doclet của riêng bạn nhằm cho phép bạn tạo ra khuôn dạng tùy chỉnh cho tài liệu của mình. 

Tài liệu hướng dẫn về Sun Java là một nguồn tài nguyên tuyệt vời. Nó là lời giới thiệu nhẹ nhàng về ngôn ngữ này, chứa đựng nhiều tư liệu hơn hẳn tài liệu hướng dẫn này, bao gồm cả các liên kết đến các tài liệu hướng dẫn khác để tiếp cận tới các chi tiết hơn nữa về nhiều khía cạnh đa dạng của ngôn ngữ Java. 

Tái cấu trúc, cuốn sách của Martin Fowler (Addison-Wesley, 1999) là nguồn tài nguyên tuyệt diệu để phát triển những mã lệnh hiện có. > 

Trang Bạn mới đến với công nghệ Java là cả một ngân hàng các tài nguyên developerWorks dành cho những người mới khởi đầu học Java, bao gồm cả các liên kết đến các nguồn tài liệu hướng dẫn và chứng chỉ. 

Bạn sẽ tìm thấy các bài báo về đủ mọi khía cạnh của lập trình Java trên developerWorks tại vùng công nghệ Java

Xem các trang hướng dẫn tại vùng công nghệ Java để tìm một danh sách đầy đủ các tài liệu hướng dẫn tập trung vào Java miễn phí trên developerWorks .

Lập trình Java các khái niệm OOP

Một đối tượng là gì? 
 Java được biết đến như một ngôn ngữ hướng đối tượng (OO - object-oriented), bạn có thể sử dụng ngôn ngữ này để lập trình hướng đối tượng. Điều này rất khác so với lập trình thủ tục, và có thể hơi lạ lùng đối với hầu hết các lập-trình-viên-không-hướng-đối-tượng. Bước đầu tiên bạn phải hiểu đối tượng là gì, vì đó là khái niệm cơ sở của OOP. Một đối tượng là một gói mã lệnh độc lập (self-contained), có khả năng tự hiểu và có thể nói cho các đối tượng khác về chính nó nếu chúng đưa ra các yêu cầu mà nó hiểu được. Một đối tượng có các data members (thành phần dữ liệu) (các biến) và methos (các phương thức), chính là những yêu cầu mà nó biết cách trả lời (dù chúng không được diễn đạt bằng lời như các câu hỏi). Tập các phương thức mà một đối tượng biết cách trả lời được gọi là interface (giao diện) của đối tượng. Một vài phương thức là public, có nghĩa là các đối tượng khác có thể gọi đến chúng. Tập các phương thức này được gọi là public interface (giao diện công cộng) của đối tượng. Khi một đối tượng gọi phương thức của một đối tượng khác, thì được gọi là gửi một thông điệp (sending a message hoặc message send). Cụm từ này là thuật ngữ của OO nhưng hầu hết trong giới Java mọi người hay nói, “gọi phương thức này” hơn là “gửi thông điệp này”. Trong phần tiếp theo, chúng ta sẽ xem xét một ví dụ minh họa khái niệm giúp bạn hiểu vấn đề này rõ ràng hơn.
  Ví dụ minh họa khái niệm đối tượng 
Giả sử chúng ta có đối tượng Person. Mỗi Person có tên, tuổi, chủng tộc và giới tính. Mỗi Person cũng biết nói và biết đi. Một Person có thể hỏi tuổi của một Person khác, hoặc yêu cầu một Person khác bắt đầu đi (hay dừng). Diễn đạt theo thuật ngữ lập trình, bạn có thể tạo một đối tượng Person và khai báo một số biến (như tên và tuổi). Nếu bạn tạo một đối tượng Person thứ hai, đối tượng này có thể hỏi tuổi của đối tượng thứ nhất hoặc yêu cầu đối tượng thứ nhất bắt đầu đi. Nó có thể thực hiện những điều ấy bằng cách gọi đến các phương thức của đối tượng Person đầu tiên. Khi chúng ta bắt đầu viết mã lệnh bằng ngôn ngữ Java, bạn sẽ hiểu ngôn ngữ này triển khai thực hiện khái niệm đối tượng ra sao. Nói chung, khái niệm đối tượng là như nhau trong ngôn ngữ Java và các ngôn ngữ hướng đối tượng khác, mặc dù việc triển khai thực hiện trong mỗi ngôn ngữ có thể khác nhau. Các khái niệm là chung. Vì vậy, lập trình viên hướng đối tượng, bất chấp họ lập trình bằng ngôn ngữ nào đều có xu hướng phát biểu khác so với những lập trình viên thủ tục. Các lập trình viên thủ tục thường nói về các hàm và các mô đun. Lập trình viên hướng đối tượng lại nói về các đối tượng và họ thường nói về các đối tượng này bằng cách sử dụng các đại từ nhân xưng. Chẳng hề bất thường khi bạn nghe một lập trình viên hướng đối tượng nói với đồng nghiệp, “đối tượng Supervisor nói với đối tượng Employee, ‘cho tôi ID của cậu,’ vì anh ta cần những thông tin này để gán nhiệm vụ cho Employee.” Lập-trình-viên-hướng-thủ-tục có thể nghĩ rằng cách nói chuyện này thật lạ lùng, nhưng nó lại hoàn toàn bình thường đối với lập-trình-viên-hướng-đối-tượng. Trong thế giới lập trình của họ, mọi thứ đều là đối tượng (cũng có một vài ngoại lệ đáng chú ý trong ngôn ngữ Java) và các chương trình là chỉ là sự tương tác (hay nói chuyện) giữa các đối tượng với nhau. 
  Các nguyên tắc hướng đối tượng cơ bản 
Khái niệm đối tượng là trọng yếu đối với lập trình hướng đối tượng, và dĩ nhiên, ý tưởng các đối tượng giao tiếp với nhau bằng các thông điệp cũng vậy. Nhưng có 3 nguyên tắc cơ bản mà bạn cần hiểu. Bạn có thể nhớ 3 nguyên tắc hướng đối tượng cơ bản bằng cụm từ viết tắt PIE, trong đó: 
Đa hình ( Polymorphism) 
Thừa kế ( Inheritance) 
Bao đóng ( Encapsulation)
 Đó là những từ trừu tượng nhưng những khái niệm này thực sự không quá khó hiểu. Trong các phần tiếp theo, chúng ta sẽ bàn chi tiết hơn về từng khái niệm này, theo thứ tự ngược lại. 
  Bao đóng (Encapsulation) 
Hãy nhớ rằng, một đối tượng là độc lập, chứa đựng các thành phần dữ liệu và các hành động mà nó có thể thực hiện trên các thành phần dữ liệu ấy. Đây là việc triển khai thực hiện nguyên lý gọi là ẩn giấu thông tin. Ý tưởng là một đối tượng có thể tự hiểu chính nó. Nếu một đối tượng khác muốn điều gì từ đối tượng này thì nó phải 'hỏi'. Theo thuật ngữ lập trình hướng đối tượng, phải gửi một thông điệp đến một đối tượng khác để hỏi về tuổi. Theo thuật ngữ Java, phải gọi một phương thức của đối tượng khác để nó trả lại kết quả là tuổi. Sự bao đóng đảm bảo rằng mỗi đối tượng là khác nhau và chương trình là một cuộc giao tiếp giữa các đối tượng. Ngôn ngữ Java cho phép các lập trình viên vi phạm nguyên lý này nhưng hầu như luôn là một ý tưởng tồi nếu làm như thế. 
  Thừa kế (Inheritance) 
Khi bạn được sinh ra, nói về khía cạnh sinh học, bạn là tổ hợp DNA của cha mẹ mình. Bạn không hoàn toàn giống ai trong số họ, mà bạn giống cả hai người. OO cũng có nguyên tắc tương tự đối với các đối tượng. Quay lại với đối tượng Person. Ta nhớ lại rằng mỗi người có một chủng tộc. Không phải tất cả các Person đều cùng chủng tộc, nhưng dù sao thì họ cũng có điểm tương đồng như nhau đúng không? Chắc chắn vậy! Họ chẳng phải ngựa, tinh tinh hay cá voi mà là người. Mọi con người đều có những điểm chung nhất định và điều này giúp phân biệt con người với các loài động vật khác. Nhưng giữa mọi người cũng có khác biệt với nhau. Một đứa trẻ có giống hệt một người trưởng thành không? Không. Đi lại và nói là khác nhau rồi. Nhưng một đứa trẻ thì vẫn chắc chắn là một con người. Theo ngôn ngữ hướng đối tượng, Person và Baby là các lớp (class) sự vật hiện tượng thuộc cùng một hệ thống phân bậc (hierarchy), và Baby thừa kế các đặc tính và hành vi từ lớp cha của nó. Chúng ta có thể nói rằng một Baby cụ thể là một kiểu Person hay Baby thừa kế từ Person. Nhưng không có chiều ngược lại – một Person không nhất thiết phải là một Baby. Mỗi đối tượng Baby là một cá thể (instance) của lớp Baby và khi chúng ta tạo một đối tượng Baby, chúng ta cá thể hóa (instantiate) lớp này. Hãy coi lớp như là khuôn mẫu chung cho các cá thể của lớp đó. Nói chung, đối tượng có thể làm những gì tùy thuộc vào kiểu của đối tượng đó là gì – hoặc nói theo cách khác, đối tượng đó là cá thể của lớp nào. Cả Baby và Adult đều thuộc kiểu Person, nhưng một đối tượng (Adult) có thể có một việc làm (job) còn đối tượng kia (Baby) thì không. Theo thuật ngữ Java, Person là một lớp cha (superclass) của cả Baby và Adult, và các lớp này là lớp con của Person. Một khái niệm có liên quan khác là ý tưởng về trừu tượng hóa (abstraction). Person có mức trừu tượng hóa cao hơn Baby hay Adult. Cả hai đều là kiểu Person nhưng có những khác biệt nho nhỏ. Tất cả các đối tượng Person đều có những điểm chung (như tên và tuổi). Bạn có thể cá thể hóa một Person? Thực sự là không! Bạn hoặc có một Baby hoặc có một Adult. Trong Java, Person được gọi là lớp trừu tượng (abstract class). Bạn không thể trực tiếp có một cá thể của lớp Person. Bạn sẽ có Baby hoặc Adult, cả hai đều là kiểu Person, nhưng là Person đã được cá thể hóa (hay thực tế hóa). Các lớp trừu tượng nằm ngoài phạm vi của bài này, chúng ta sẽ không bàn thêm về chúng nữa. Bây giờ, ta hãy suy nghĩ xem với một Baby, “nói” (speak) có nghĩa là gì. Chúng ta sẽ xét đến các hệ quả trong phần thảo luận tiếp theo. 
  Đa hình (Polymorphism) 
Baby có “nói” được như Adult không? Dĩ nhiên là không rồi. Một Baby có thể ê a, nhưng không nhất thiết nói ra những lời hiểu được như Adult. Do đó, nếu tôi cá thể hóa một đối tượng Baby (hay là “cá thể hóa một Baby” cũng có cùng ý nghhĩa – từ “đối tượng” được ngầm hiểu) và cho nó nói, thì nó chỉ có nghĩa là những tiếng ê a. Ta hy vọng rằng Adult “nói” thì mạch lạc hơn. Trong hệ thống phân bậc con người, chúng ta có Person nằm ở đỉnh với Baby và Adult nằm phía dưới nó, là các lớp con. Tất cả mọi người đều có thể nói, Baby và Adult cũng vậy, nhưng sẽ nói khác nhau. Baby chỉ ê a và phát những âm thanh đơn giản. Adult nói thành lời. Đó chính là sự đa hình: các đối tượng làm việc theo cách riêng của chúng.
  Ngôn ngữ Java là hướng đối tượng và không hướng đối tượng như thế nào?
Như chúng ta thấy, ngôn ngữ Java cho phép bạn tạo các đối tượng hạng nhất (first-class), nhưng không phải bất cứ cái gì trong ngôn ngữ này đều là đối tượng. Một số ngôn ngữ OO như Smalltalk lại hoàn toàn khác. Smalltalk hoàn toàn là hướng đối tượng, có nghĩa là mọi thứ trong ngôn ngữ này đều là đối tượng. Java là ngôn ngữ lai tạp giữa đối tượng và phi đối tượng. Nó cho phép một đối tượng biết rõ các đối tượng khác, nếu với tư cách là một lập trình viên bạn cho phép điều đó xảy ra. Điều này vi phạm nguyên lý bao đóng. Tuy nhiên, ngôn ngữ Java cũng cung cấp cho tất cả các lập trình viên OO những công cụ cần thiết để tuân theo mọi quy tắc hướng đối tượng và viết mã lệnh OO rất chuẩn. Nhưng làm được như vậy cần phải tự có kỷ luật. Ngôn ngữ không ép bạn làm việc đúng đắn được. Trong khi những người thuần túy chủ nghĩa hướng đối tượng tranh luận xem liệu Java là hướng đối tượng hay không, thực sự điều này cũng không mang lại lợi ích gì cả. Nền tảng Java sẽ giữ vững vị trí của nó. Hãy học cách lập trình hướng đối tượng tốt nhất có thể làm việc với mã lệnh Java và cứ để những lý lẽ thuần túy chủ nghĩa cho những người khác. Ngôn ngữ Java giúp bạn viết chương trình rõ ràng, khá ngắn gọn, dễ bảo trì, điều này là khá đủ trong cuốn sách của tôi đối với hầu hết các tình huống nghề nghiệp.

Thứ Tư, 31 tháng 10, 2012

hoàng duy hoàng ++ Chào mừng các bạn ghé thăm Blog của tôi ++ Mong các bạn góp ý để Blog ngày càng phát triển ++

tên tôi là hoàng duy hoàng

hề
hôm nay ba mốt tháng mười
tự dưng thấy hơi buồn cười
trông thấy mọi người hóa trang
còn mình thì cứ lang thang
sang phòng của thằng bạn chơi
vài trận đế chế đỡ buồn.
haizzzzzzz.......(>_<)
buồn ơi là buồn!!!!!!!!!!!
chán ơi là chán~~~~~~~~

Thứ Bảy, 5 tháng 5, 2012

kaibap

kaibap_kute đây là blog đầu tiên của tôi
viết lung tung chả biết có đúng ko.:):)
blog đầu tiên của kaibap