Thứ Ba, 25 tháng 12, 2007

Lập trình Java

Cuối năm 1990, James Gosling được Sun giao nhiệm vụ xây dựng phần mềm lập trình cho các mặt hàng điện tử dân dụng với mục tiêu nhỏ gọn, tương thức được với nhiều thiết bị phần cứng khác nhau. Ban đầu nhóm Gosling dự định dùng C++, nhưng sau đó nhận thấy rằng C++ còn quá cồng kềnh và đòi hỏi rất nhiều hỗ trợ phần cứng. Do vậy nhóm quyết định xây dựng một ngôn ngữ lập trình mới. Đặt tên là Oak (Cây sồi - Cửa sổ phòng làm việc của Gosling nhìn ra một gốc sồi). Oak được sử dụng đầu tiên trong dự án xanh (Green Project), trong đó nhóm đưa hệ thống vào các thiết bị dân dụng như TV, đầu Video, điện thoại và các thiết bị cầm tay. 1993, Oak được sử dụng trong Dự án Phim-theo-yêu-cầu (Video On Deman). Trong đó, Oak là nền của phần mềm quảy lý hệ thống truyền hình hỗ trợ tương tác. Từ đó, Oak có những bước trưởng thành nhanh chóng. Do có sự trùng tên, nên Oak đổi tên thành Java. Nhóm đã quyết định lấy tên này khi đi du lịch đến hòn đảo Java rất nổi tiếng của Indonesia. Năm 1993, Web/Internet ra đời vào có bước phát triển mạnh. Nhóm đã nhận ra điều này và định hướng phát triển cho Java trở thành ngôn ngữ phục phụ hoàn hảo cho lập trình trên nền Web. Lịch sử phát triển của Java đến nay đã trải qua gần 20 năm.
Java Technology: Programming Language
● As a programming language, Java can create all kinds of applications that you could create using any conventional programming language.
Java Technology:A Development Environment
● As a development environment, Java technology provides you with a large suite of tools: – A compiler (javac) – An interpreter (java) – A documentation generator (javadoc) – A class file packaging tool and so on... Java được xây dựng chủ yếu trong bộ công cụ phát triển java JDK (Java Development Kit), bao gồm các thư viện chuẩn, các trình biên dịch (Compiler) (javac), thông dịch (interpreter)(java), bộ soạn tài liệu (javadoc); JVM (java vỉtual machine) ... đây chính là platform để phát triển các ứng dụng Java. JDK 1.0 khởi đầu vào năm 1995. JDK 1.1 ra đời 1 năm sau đó (1996) với nhiều cải tiến như: - Tăng thêm thư viện giao diện AWT (Abstract Windows ToolKit) - Xây dựng hệ thống thư viện JavaBeans. - Xây dựng thư viện lập trình giao diện JFC (Java Foundation Class) - Thêm các lớp mới: java.math, java.net... Từ đó, java được cải tiến liên tục qua các phiên bản: 1.12,1.13...1.16- JDK 1.16 là lõi viết lên các IDE nổi tiếng như JBuilder 2.0 của Borland, Visual Age của IBM, Visual J++ 6.0 của MS. Năm 1998, JDK 1.2 ra đời với nhiều thay đổi, bảo mật hơn, chạy nhanh hơn và linh động hơn 1.1 --JDK 1.2 tích hợp JavaBeans và JFC vào Core Java API --Phát triển thêm đồ họa 2D, 3D --EJB (Enterprise Java Beans) và JSP(Java Server Page). Tháng 7/2002, JDK 1.4 ra đời, hỗ trợ 3 môi trường: --Java Standard Edition: Java chuẩn dành cho hầu hết môi trường phát triển ứng dụng Java. --Java Enterprise Edition: Java dành cho Enterprise. Hỗ trợ Web, EJB, JSP, servlet... --Java Mobile: môi trường phát triển các ứng dụng cho các thiết bị di động. 30/9/2004, J2SE 5.0 ra đời với hơn 100 feature mới. Code name Tiger. 11/12/2006, J2SE 6.0 ra đời dưới sự phát triển của JSR 270. Code name Mustang. Hãy nhớ lại mục đích của Java là gì? Chạy trên nhiều nền hệ điều hành, nhiều nền phần cứng, trên nhiều thiết bị khác nhau... JVM chính là chìa khóa giúp java đạt được mục đích trên. Mã nguồn Java sẽ được bộ biên dịch javac biên dịch thành mã Bytecode, chạy trên các máy ảo Java (JVM). Mỗi hệ điều hành, mỗi phần cứng sẽ có bộ máy ảo riêng cho nó. Do vậy, các ứng dụng của Java có thể chạy trên nhiều nền chừng nào máy đó còn đi kèm bộ thông dịch, bộ gỡ rối, và bộ thư viện kiểm soát mã thực thi của Java. Kiến trúc này là kiến trúc trung tính (Neutral Architecture). Mô hình biên dịch và thực thi các ứng dụng Java: -Sử dụng Text Editor viết các mã nguồn của Java: Ví dụ Hello.java -Biên dịch Hello.java thành mã Byte code Hello.class bằng trình biên dịch javac. Việc này chỉ làm 1 lần. -Thông dịch các mã bytecode bằng trình thông dịch java. Lặp lại nhiều lần. Mỗi lần chạy các ứng dụng java đều phải thông dịch từ trình thông dịch này. Các đặc điểm của Java: -Đơn giản (Simple) -Hướng đối tượng (Object Oriented) -Phân tán (Distributed) -Đa tuyến (Multithreaded) -Mạnh mẽ (Robust) -Trung tính (Architecture neutral) -Khả chuyển (Portable) -Linh động (Flexible) -Bảo mật (Security) -Hiệu quả cao (High Performance) Các đặc tính này sẽ được làm rõ hơn khi làm việc với Java Trước khi bắt đầu viết chương trình đầu tiên. Chúng ta nhắc lại một chút về kiến trúc của Java. - Mã nguồn Java được viết dưới dạng plain text, với đuôi mở rộng là .java . Source file được biên dịch bằng javac compiler thành .class file. File .class này là mã bytecode, không chạy ngay bởi vi xử lý được mà phải chạy qua Java Virtual Machine (JVM). -JVM có thể được cài đặt trên rất nhiều nền, cho nên cùng 1 file .class có thể chạy trên được Microsoft Windows, Solaris TM Operating System (Solaris OS), Linux, hay Mac OS Một vài định nghĩa: -Console: Cổng giao diện dòng lệnh. VD: cmd của windows, terminal của Linux... -Text Editor VD: Notepad, Wordpad, vi, emacs ... -Intergrated Development Environment hay IDE: Môi trường phát triển ứng dụng, tích hợp tất cả các thứ như Text Editor, Compiler, Interpreter, Debugger vào 1 gói Software dùng để phát triển phần mềm cho thuận tiện. VD: Eclipse, Netbeans, .............. Sơ lược về lịch sử lập trình: Step-by-step programming: Trong những ngày đầu của ngành IT, lập trình là một công việc khó khăn. Mỗi bước làm việc của máy đều phải theo dõi tỉ mỷ, cẩn thận. Ngôn ngữ lập trình thời đó là ngôn ngữ máy (Machine Language), sau đó cao hơn 1 chút là hợp ngữ (Asembly Language). Mỗi mã lệnh của ngôn ngữ tương ứng với một chỉ thị của CPU. Hiện nay, Asembly chủ yếu dùng để lập trình nhúng cho các con Chip. Các bạn khoa điện tử chắc sẽ rất rõ về ngôn ngữ này. Procedure language: Ngôn ngữ thủ tục. Đó là Pascal và C, ngôn ngữ thủ tục giúp các lập trình viên dễ dàng trong công việc so với giai đoạn trước. Các chuỗi hành động sẽ được tập hợp lại thành một khối gọi là hàm (function) hay thủ tục (procedure). Các khối này là các black box, người sử dụng không cần biết trong khối đó cụ thể làm những bước nào, chỉ cần biết tham số đầu vào và kết quả đầu ra như thế nào. Như hàm writeln trong Pascal hay println trong C. Vấn đề đặt ra: trong ngôn ngữ thủ tục, các hộp đen được kết nối với nhau để tạo ra một hệ thống phù hợp với yêu cầu mới. Điều này sản sinh ra một kiến trúc hộp đen cha bao gồm rất nhiều hộp đen con được kết nối với nhau (trong C có khái niệm con trỏ hàm - function pointer thực hiện công việc này). Khi muốn thay đổi dữ liệu trong một hộp đen con (không phải dữ liệu trả về), các hộp đen con khác và hộp đên cha cần phải được kiểm tra lại và biên dịch lại, nếu không dễ gây ra lỗi. Với ứng dụng lớn, đây là một việc phức tạp. Structured Development (Phát triển cấu trúc): Sự phát triển cấu trúc không thay đổi các ngôn ngữ đã dùng. Mà là một phương pháp phát triển phần mềm mới. Trong phương pháp này, lập trình viên phải lên được 100% kế hoạch của chương trình trước khi viết bất kỳ dòng code nào. Cần soạn một lượng biểu đồ lớn để xác lập tương quan giữa các hàm với nhau, với các dữ liệu. Vấn đề là: Khó có thể đưa vào thiết kế tất cả những gì xảy ra với chương trình. Một chương trình tốt phải được phát triển trên điều kiện thực tế: lập trình, thử, cáp dụng, cải tiến .... Lập trình cấu trúc đòi hỏi một thiết kế hoàn chỉnh trước khi mọi thứ được cài đặt. Do đó sẽ không có "Ôi mẹ ơi, tôi quên mất feature này rồi! " Lập trình hướng đối tượng OOP: -Đối tượng là khái niệm cơ sở trong OOP. Nó không phải là con số, không phải là cấu trúc thông thường. Theo ý kiến của mình nó áp dụng thói quen của con người vào công việc lập trình. Các sự vật trên thế giới đều có những đặc tính riêng, tiêu biểu cho sự vật đó. Các đặc tính này thông qua các giác quan sẽ lưu giữ lại "hình ảnh" của sự vật trong nhận thức của chúng ta. Các sự vật này, có tên gọi khác là các đối tượng. Việc biểu diễn lại các đặc tính, khả năng, hành động của đối tượng đó chính là OOP. Các bạn nhớ lại các bài văn miêu tả con mèo của mình hồi học cấp 1. Chúng ta nhận biết sự hiện diện của con mèo như thế nào? Đó là thông qua các đặc tính cả nó: tên nó là Mun, lông màu đen, mắt màu xanh, có bốn chân, là động vật có vú... và các hành động ngủ, bắt chuột, nhảy, vẫy đuôi... một nhóm đối tượng có tập hợp các đặc tính riêng nào đó đại diện cho nhóm đó. Ví dụ, nhóm con mèo sẽ khác với nhóm con gà. Vậy những đặc điểm nào làm nên sự khác nhau đó??? Những đặc điểm này được gọi là lớp (Class). Mỗi đối tượng là một thực thể của lớp nào đó. OOP chính là áp dụng các qui tắc của các bài văn miêu tả vào ngôn ngữ lập trình. Chúng ta xây dựng lớp Con mèo. Lớp Con mèo: các thuộc tính: +Tên +Là động vật có vú không? +màu lông +màu mắt +Số lượng chân các phương thức: +ngủ +bắt chuột +nhảy +vẫy đuôi Và con mèo Mun của IPv6 chính là một đại diện (instance) của lớp con mèo. Hay gọi là đối tượng con mèo Mun. Các phương thức trong đối tượng khi được triệu gọi sẽ làm thay đổi thuộc tính của chính nó và thay đổi thuộc tính của các đối tượng khác như thế nào? Ví dụ: như mèo Mun vồ con chuột==> con chuột chết. Ngoài ra, răng con Mun sẽ có thay đổi gì? --> dính máu. OOP chính là sự biểu diễn lại các vấn đề này. Các điểm mạnh của OOP
Chương trình Java đầu tiên: Hello World
. Chạy Hello World trên Console: Mã nguồn viết bằng Notepad: HelloWorld.java Lưu trong thư mục: C:\Java\javafiles
Code:
public class HelloWorld{
 public static void main(String args[]){
  System.out.println("Hello World!");
 }
}
Biên dịch: C:\Java\javafiles>javac HelloWorld.java Thông dịch: C:\Java\javafiles>java HelloWorld Kết quả
Cấu trúc chương trình Java.
Java là ngôn ngữ hướng đối tượng nên tất cả các hàm phương thức đều phải nằm trong khai báo lớp đối tượng. Kể cả chương trình chính.
Code:
public class HelloWorld{
       ........
}
Trên là lớp ứng dụng HelloWorld, từ khóa class cho biết khai báo lớp, từ khóa static cho biết lớp này là lớp toàn cục, cho phép tất cả các lớp khác sử dụng nó. Lớp không phải là chương trình chính. Chương trình chính được cài đặt bên trong lớp, là một phương thức tĩnh:
Code:
 public static void main(String args[]){
  System.out.println("Hello World!");
 }
Trong java, phương thức tên main() này chính là điểm vào đầu tiên của chương trình. Khi bạn gọi java HelloWorld, trình thông dịch java sẽ nạp lớp HelloWorld vào bộ nhớ và tìm phương thức main() và thực thi nó. Các từ khóa: public: cho biết main() là phương thức chung có thể được triệu gọi từ môi trường bên ngoài. static: cho biết main() là phương thức tĩnh, nghĩa là phương thức có thể triệu gọi thông qua tên lớp mà không cần phải khởi tạo đối tượng của lớp. void: cho biết phương thức không trả về giá trị. String args[]: mảng chuỗi chứa các đối số truyền trên dòng lệnh khi bạn gọi chương trình Java. VD: bạn triệu gọi như sau: java HelloWorld abc def hehehe Thì lúc này mảng args[] sẽ chứa ba chuỗi: args[0] chứa chuỗi "abc" args[1] chứa chuỗi "def" args[2] chứa chuỗi "hehehe" System.out.println("Hello World!"); System là tên thư viện của hệ thống out là tên một đối tượng trong thư viện System println() là một phương thức của đối tượng out. Phương thức này in ra màn hình Console chuỗi Hello World!
Chương 4: Progamming Fundamentals
(những quy tắc lập trình cơ bản) Objectives At the end of the lesson, the student should be able to: ● Identify the basic parts of a Java program ● Differentiate among Java literals, primitive data types, variable types ,identifiers and operators ● Develop a simple valid Java program using the concepts learned in this chapter Mục tiêu: Sau bài học, bạn có thể: - Nhận biết được những phần cơ bản của 1 chương trình Java. - Phân biệt sự khau giữa các literals ?? Java, các kiểu dữ liệu cơ bản (nguyên thuỷ), các kiểu biến, các định danh và các toán tử. - Trình bày một chương trình Java đơn giản, hợp lệ sử dụng các khái niệm đã học trong chương này. Dissecting my First Java Program
Code:
1  public class Hello
2  {
3  /**
4  * My first Java program
5  */
6  public static void main( String[] args ){
7
8 //prints the string Hello world on screen
9  System.out.println(“Hello world”);
10
11      }
12  }
Phân tích chương trình Java đầu tiên của tôi. Dòng 1: Chỉ ra tên của lớp là Hello Trong Java, tất cả “code” được đặt bên trong 1 lớp (đã được) khai báo. The class uses an access specifier public, which indicates that our class in accessible to other classes from other packages (packages are a collection of classes). We will be covering packages and access specifiers later. Lớp sử dụng 1 truy xuất xác định là public, chỉ ra rằng lớp của chúng ta có thể được truy xuất từ các lớp khác của các gói khác (gói là 1 tập hợp của các lớp). Chúng ta sẽ tìm hiểu gói và truy xuất xác định sau. Dòng 2: Dấu “{“ bắt đầu 1 khối lệnh (ở đây là của lớp Hello). Dòng 3, 4, 5: Chú thích trên nhiều dòng (dùng cặp /*…..*/) để chương trình được rõ hơn. Khi biên dịch thì chương trình biên dịch sẽ bỏ quá các chú thích. Dòng 6: Chỉ ra tên của phương thức trong lớp Hello là phương thức chính (main) Phương thức chính (main) là điểm bắt đầu của 1 chương trình Java Mọi chương trình được viết bằng Java (trừ các Applet) được chạy (bắt đầu) với (bằng) phương thức chính main Dòng 8: Chú thích trên 1 dòng (dùng //) Dòng 9: Câu lệnh System.out.println(), in ra màn hình đoạn text được đặt trong “”,ở đây là: Hello World Dòng 11, 12: Đóng (kết thúc) phương thức chính và lớp Hello theo lần lượt. Coding Guidelines 1. Your Java programs should always end with the .java extension. 2. Filenames should match the name of your public class. So for example, if the name of your public class is Hello, you should save it in a file called Hello.java. 3. You should write comments in your code explaining what a certain class does, or what a certain method do. Hướng dẫn viết Code. 1. Chương trình Java của bạn phải luôn kết thúc với phần mở rộng là .java 2. Tên file phải trùng với tên của lớp. Ở đây, tên lớp là Hello do vậy phải lưu file là Hello.java 3. Nên viết những chú thích để chương trình được rõ hơn. Câu lệnh Java được viết trên 1 hoặc nhiều dòng và được kết thúc bằng dấu chấm phẩy ; Khối lệnh là 1 hoặc nhiều câu lệnh được đặt trong cặp { }, có thể được lồng vào nhau vô hạn. Java Identifiers ● Identifiers – are tokens that represent names of variables, methods, classes, etc. – Examples of identifiers are: Hello, main, System, out. ● Java identifiers are case-sensitive. – This means that the identifier Hello is not the same as hello. ● Identifiers must begin with either a letter, an underscore “_”, or a dollar sign “$”. Letters may be lower or upper case. Subsequent characters may use numbers 0 to 9. ● Identifiers cannot use Java keywords like class, public, void, etc. We will discuss more about Java keywords later. Các định danh Java - Định danh là những dấu hiệu cho biết tên của các biến, các phương thức, các lớp…, ví dụ: Hello, main, System.. - Định danh trong Java phân biệt chữ hoa thường. Suy ra : Hello # hello - Định danh phải được bắt đầu bằng chữ cái (hoa hoặc thường) hoặc dấu gạch dưới “_”, hay dấu đôla “$”. Các ký tự theo sau có thể là chữ số 0 đến 9. - Định danh không được sử dụng những từ khoá của Java, như: class, public, void, … Chúng ta sẽ thảo luận nhiều hơn về từ khoá Java sau. Java Identifiers Coding Guidelines 1. For names of classes, capitalize the first letter of the class name. For example: ThisIsAnExampleOfClassName 2. For names of methods and variables, the first letter of the word should start with a small letter. For example: thisIsAnExampleOfMethodName 3. In case of multi-word identifiers, use capital letters to indicate the start of the word except the first word. For example: charArray, fileNumber, className. 4. Avoid using underscores at the start of the identifier such as _read or _write. Hướng dẫn viết Code các định danh Java 1. Với tên của lớp, viết hoa các ký tự đầu tiên của tên lớp VD: ThisIsAnExampleOfClassName 2. Với tên của phương thức hay biến, ký tự đầu tiên nên viết chữ thường VD: thisIsAnExampleOfMethodName 3. Trong trường hợp định danh đa từ (đa nghĩa), viết hoa những ký tự chỉ rõ bắt đầu của từ trừ từ đầu tiên. VD: charArray, fileNumber, className 4. Tránh dùng dấu gạch dưới “_”để bắt đầu 1 định danh VD: _read, _write Java Keywords ● Keywords are predefined identifiers reserved by Java for a specific purpose. ● You cannot use keywords as names for your variables, classes, methods ... etc. ● The next slide contains the list of the Java Keywords. Từ khoá trong Java - Từ khoá là những định danh dành riêng đã được xác định trước bởi Java cho những mục đích cụ thể. - Bạn không thể sử dụng những từ khoá như tên của biến, lớp, phương thức … - Danh sách các từ khoá trong Java: 1. abstract : Dùng để thông báo 1 phương thức trừu tượng, cần có 1 phương thức con không trừu tượng lấp lên. Một phương thức trừu tượng sẽ không có phần mã lệnh (method body) mà chỉ có phần khai báo đặc tả. Các lớp kế thừa sẽ chịu trách nhiệm cài đặt phương thức abstract. 2. boolean : Kiểu biến logic, chỉ có hai giá trị đúng, sai (TRUE, FALSE). Chúng không tương tự C/C++ vì trong C/C++ giá trị thật của chúng được giữ ở số nguyên. 3. break : Từ khoá cho phép ngắt dòng lệnh để thoát ra khỏi vòng lặp. 4. byte: Kiểu biến số, có giá trị. 5. case: Nói lên một trường hợp khi phải lựa chọn. 6. catch: Sử dụng khi nhận về các kết quả lỗi. 7. char: Kiểu biến ký tự. 8. class: Lớp. 9. const: Thông báo biến đi kèm sau là hằng. 10. continue Dùng để nhảy tiếp đến một dòng lệnh lặp. 11. default Giá trị mặc định trong cấu trức lựa chon. 12. do Nằm trong câu lệnh vòng lặp do…while 13. double Kiểu số thực 14. elsse Nằm trong cặp lệnh điều khiển “Nếu thì If…else” 15. extends Dẫn xuất. 16. final Thông báo biến đi sau là hằng 17. finally Phương thức chấm dứt 18. float Kiểu số thực. 19. for Dùng để thực hiện một vòng lặp xác định. 20. goto Nhảy đến, thực hiện một lệnh di chuyển dòng lệnh. 21. if Nằm trong cặp lệnh điều khiển “Nếu thì If… else” 22. implements Cài đặt. 23. import Cho biết dùng các thư viện nào. 24. instanceof Dùng xác định kiểu đối tượng trong khi chương trình đang chạy (Runtime Type Identification). 25. int Kiểu biến nguyên 26. interface Giao diện, dùng để đặc tả giao thức giữa các đối tượng. 27. long Kiểu số nguyên 28. native Nguồn, gốc: Dùng để chỉ việc sử dụng các ngôn ngữ gắn với 1 hệ cụ thể. 29. new Dùng để tạo ra một đối tượng mới. 30. package Gói thư viện chứa các lớp. 31. private Báo cho biết biến khai báo tiếp theo sau là biến cục bộ. 32. protected Không bị chồng 33. public Báo cho biết biến khai báo tiếp theo sau là biến toàn cục. 34. return Trở về lệnh gọi. 35. short Kiểu biến số thực. 36. static Báo cho biết biến/phương thức khai báo tiếp theo sau là biến hoặc phương thức tĩnh. 37. super Đối tượng cha. 38. switch Dùng trong hệ tuỳ chọn. 39. synchronized Đồng bộ 40. this Đối tượng hiện đang xét. 41. throw Trả về lỗi. 42. throws Cho biết phương thức hay biến sẽ được trả về khi có lỗi (dùng trong khai báo phương thức). 43. transient Biến tạm. 44. try Thử làm để nhận lỗi về. 45. void Báo cho biết phương thức khai báo tiếp sau sẽ không có giá trị trả về. 46. while Dùng trong cặp câu lệnh vòng lặp. 47. byvalue ???? 48. threadsafe ???? 49. null ???? Ngoài ra có thể xem truefalse là 2 từ khoá của Java Java Literals ● Literals are tokens that do not change - they are constant. ● The different types of literals in Java are: – Integer Literals – Floating-Point Literals – Boolean Literals – Character Literals – String Literals Các hằng Java - Hằng là thành phần (dấu hiệu) không thể thay đổi – chúng là hằng số. - Những loại hằng số trong Java: - Hằng kiểu nguyên. - Hằng dấu chấm động. - Hằng kiểu boolen (logic) - Hằng kí tự - Hằng kiểu chuỗi. Đoạn sau của Slide nói về: - Primitive data types( boolean, char, byte, short, int, long, float, double) - Variables (declare, initialize, output) (khởi tạo, đưa giá trị vào, giá trị ra) ● System.out.println() vs. System.out.print() ● Reference Variables vs. Primitive Variables ● Operators (Arithmetic operators, Increment and Decrement operators, Relational operators, Logical operators, Conditional Operator ( Operator Precedence) Mình nghĩ phần này cũng gần như các ngôn ngữ khác, các bạn tự đọc nha. Có gì khó hiểu thì post lên diễn đàn cùng thảo luận. Ở cuối chương này, Sang có đưa ra 1 bài tập (homework) như sau: • Compute the smallest number and display it (as you did compute and display greatest number) • If the smallest number is less than 10, display "The smallest number is less than 10!". Otherwise, display " The smallest number is greater than or equal to 10!". Question
Trích:
Mới học QT4, có 1 đoạn code sau, chưa rõ vấn đề lắm, post lên cho anh Freshboy, anh Tuantrangdream và anh em cùng giải đáp. class Tinhtong { int a = 10; int b = 20; public static void main(String args[]) { int c; c = a+b; System.out.println("Ket qua" + c); } } Hai cái dòng màu đỏ phải có chữ static thì mới thực thi được, còn ko có nó sẽ báo lỗi, vì sao vậy? . Xin giải thích kỹ chổ này giúp, cám ơn.
Trích:
class Tinhhieu { int a = 10; int b = 20; void hienthi() { int c; c = b-a; System.out.println("ket qua: " + c); } public static void main(String args[]) { Tinhhieu t = new Tinhhieu(); t.hienthi(); } } vì sao đoạn code ở trên ko sử dụng static ngay lúc khai báo biến a và b mà nó chạy được. Em cám ơn
ANSwer
Trích:
để có thể truy xuất trực tếp không thông qua object bạn chỉ việc khai báo biến a,b là public static, sau đó để có thể có thể lấy giá trị thì gọi trực tiếp thông qua class bằng cách gọi ClassName.property hoặc ClassName.method() , trong trường hợp này là Tinhtong.a hoặc Tinhtong.b Một thực thể (method hoặc biến) khi được chỉ định là static sẽ được khởi tạo một lần duy nhất khi class chứa thực thể đó được load vào JVM, khi một thực thể là static có nghĩa nó là thành phần "tĩnh" của class, nó là thuộc tính hoặc hành vi ở mức class (ko phải ở mức object), nó được khởi tạo một lần duy nhất và tồn tại ngay cả khi chưa hề có object nào được new trên class đó. Lý do hàm main phải là static vì JVM cần phải có được một gì đó bắt đầu khi application chạy trước cả khi object đầu tiên được khởi tạo, để có thể bắt đầu một chương trình trước cả khi object đầu tiên được khởi tạo JVM cần nắm được thứ gì đó đã tồn tại, đã được khởi tạo, đã được cấp phát vùng nhớ, và đã có thể chạy được, ... đó là hàm main. Vì thế hàm main phải là static. Việc ứng dụng static thì rất nhiều, bạn có thể sử dụng từ khóa static khi muốn có một thứ gì đó tồn tại duy nhất ở mức class, ko phụ thuộc vào object. Cụ thể một ví dụ là sử dụng static là Singleton pattern. Giả sử đến một lúc nào đó, bạn muốn có một object mà sẽ khởi tạo 1 lần duy nhất, tồn tại duy nhất tại bất kì đâu trong ứng dụng của bạn, khi bạn cần dùng tới nó bạn chỉ việc lấy nó ra (không muốn dùng đến từ khóa new, vì việc dùng từ khóa new để khởi tạo một 1 object mới cho cùng một chức năng là dư thừa và phí phạm tài nguyên). Bạn có thể làm như sau: Code: public class Test { private static Test objInstance = null; protected Test () { } public static synchronized Test Singleton() { if (Test .objInstance == null) { Test .objInstance = new Test (); } return Test .objInstance; } public void print () { System.out.println ("Đây là hàm dùng chung"); } } ví dụ đoạn code trên bạn có class Test có một hàm đơn giản là print(), bạn muốn sử dụng method print(), tại nhiều nơi trong ứng dụng của bạn nhưng lại không muốn mỗi lần như vây phải new một object mới (lãng phí tài nguyên). Bạn để ý thấy class Test chứa 1 property là private static với type là chính nó. Hàm contructor của class Test được overwrite thành protected. Do đó bạn sẽ không thể tạo ra đối tượng kiểu Test bằng cách viết new Test(). Hàm Singleton() là một hàm static, làm một việc duy nhất là kiểm tra objInstance có null hay không, nếu có thì tạo mới và return nó về. Khi sử dụng class Test bạn chỉ cần viết như thế này: Code: Test obj = Test.Singleton(); obj.print(); và bạn có thể yên tâm là đối tượng được trả về qua hàm Singleton() là duy nhất. ps: theo mình thì cái mà bạn còn chưa thông là cái từ khóa static, sử dụng nó thế nào, nó dùng vào việc gì, và tại sao phải tồn tại nó ?

Giới thiệu lập trình Java

JDK 6u1 The Java SE Development Kit (JDK) includes the Java Runtime Environment (JRE) and command-line development tools that are useful for developing applets and applications. Mình down bản jdk-6u1-windows-i586-p.exe . Cài đặt tại thư mục C:\Java\J2SDK .Trong thư mục bin (nằm trong thư mục J2SDK) có chứa file + javac.exe : Đây là trình biên dịch của java. Bạn muốn biên dịch HelloWorld.java thì cần phải gọi chương trình này ra. Như sau: C:\>Java\J2SDK\bin\javac.exe C:\Java\javafiles\HelloWorld.java + java.exe : trình thông dịch các chương trình java. VD: C:\> cd Java\javafiles C:\Java\javafiles>C:\Java\J2SDK\bin\java.exe HelloWorld Rõ ràng là chẳng ai muốn mỗi lần chạy java lại phải gõ đầy đủ đường đẫn đến thư mục chứa file chạy java. Vì vậy, nên cập nhật cái đường dẫn này vào PATH. Để đưa đường dẫn ( giả sử lấy đường dẫn "C:\Java\J2SDK\bin" như IPv6 dùng ) vào PATH ta chỉ cần khai báo nó trong file "Autoexec.bat" theo mẫu : SET PATH=C:\Java\J2SDK\bin Có cách làm điều này : Cách 1 : vào Run -> gõ "sysedit" -> Enter -> chọn cửa sổ "C:\Autoexec.bat" -> nhập đường dẫn vào theo mẫu trên Cách 2 : Mở Windows Explorer -> vào ổ C: -> cho hiện tất cả các file ẩn và các file hệ thống ( bằng cách vào Folder Option -> View tab ) , khi đó sẽ nhìn thấy file Autoexec.bat hiện lên trong ổ C:-> chỉ việc mở ra (bằng cách nhấp phải chuột -> edit ) mà nhập đường dẫn vào thôi. Cách 3 : Vào Control Panel -> System -> chọn tab Advance -> Environment Variables -> trong ô phía dưới tìm dòng bắt đầu bởi Path -> Edit -> trong ô Variable Value, đừng xoá, hãy thêm vào cuối dòng đó đường dẫn của ta với dấu ";" ở trước, cụ thể : " ;C:\Java\J2SDK\bin " Normally, TextPad will automatically add commands to compile and run Java applications and applets in the Tools menu in textpad. Otherwise: Add "Compile Java" and "Run Java Application" commands in your TextPad Here we talk about how to add these commands manually: 1. Choose Configure menu and click "Preferences..." command
2. Click "Tools" in left column, click "Add" in right column and choose "Program..." command
3. In "Select a File" dialog, find "javac.exe" program which you have installed with Java SDK software on your computer, and click "Open"
4. You will see a "javac" in the middle column, click it and rename it to "Compile Java".
5. Click "Apply", and expand "Tools" option in left column, you will see "Compile Java" option is there. 6. Click "Compile Java" option, and check the configuration. Make sure that "Parameters:" is $File and "Initial folder:" is $FileDir. Select Capture output and Sound alert when completed. Ignore other options/parameters. Click "Apply" if you make any changes.
7. Click "Tools" in left column again, click "Add" in right column and choose "Program..." command.
8. In "Select a File" dialog, find "java.exe" program which you have installed with Java SDK software on your computer, and click "Open"
9. You will see a "java" in the middle column, click it and rename it to "Run Java Application".
10. Click "Apply", and expand "Tools" option in left column, you will see "Run Java Application" option is there. 11. Click "Run Java Application" option, and check the configuration. Make sure that "Parameters:" is $BaseName and "Initial folder:" is $FileDir. Unselect all options.
12. Click "Apply" if you make any changes. Click "OK" to exit configuration. Then you will see two commands have been added to your Tools menu in TextPad.
13. Now "Compile Java" and "Run Java Application" have been added in your TextPad.

Chủ Nhật, 25 tháng 11, 2007

Tìm hiểu về Registry của Windows 2003

Trong bài báo này, chúng tôi sẽ giới thiệu cho các bạn về Registry của Windows 2003, xem xét qua xem nó là gì, cách cấu hình từ xa, cách backup và restore nó như thế nào. Tài liệu này được dự định là một tài liệu tham khảo giúp bạn có thể tìm hiểu phần lõi hệ điều hành thế hệ sau của Microsoft.

Giới thiệu
Được giới thiệu ngay trong Windows 95, Registry là một trung tâm cho người dùng duy nhất và dữ liệu cấu hình máy tính. Trong các mục cơ bản, nó là một cơ sở dữ liệu lớn nắm giữ tất cả các thông tin cấu hình của Windows 2003 – các thiết lập có liên quan đến tài khoản người dùng, phần cứng máy và các ứng dụng. Mọi thứ từ sở thích của người dùng (như màu nền, bộ bảo vệ màn hình,…) đến các mật khẩu tài khoản được mã hóa đều nằm trong đó. Registry được đưa ra để thay thế các file .INI cũ (file lưu các thiết lập cấu hình bên trong). Các file .INI cũng có một số ưu điểm vì chúng ngắn và dễ soạn thảo, tuy nhiên cũng có một số hạn chế như các giới hạn về kích thước và không hỗ trợ cho nhiều người dùng. Với registry, chúng ta có thể loại bỏ những hạn chế đó và làm cho mọi thứ trở nên dễ dàng hơn khi khôi phục các thiết lập sau khi có hỏng hóc xuất hiện, điều khiển truy cập và kiểm tra các thay đổi của hệ thống. Registry có một số ưu điểm, nếu bạn đang cài đặt một ứng dụng, lúc đang ghi một chùm khóa vào thanh registry có một lỗi về nguồn cấp thì mọi thứ đều không bị ảnh hưởng khi hệ thống được backup và chạy trở lại.

Lưu ý: Một số ứng dụng vẫn sử dụng file .INI để lưu các thiết lập người dùng hoặc các ngôn ngữ cho GUI. Ví dụ, tại thời điểm viết bài này, tôi đã mở language.ini , file được tìm thấy trong thư mục của một trong những ứng dụng đã được cài đặt của tôi và đã thay đổi một số chuỗi trong đó. Sau đó khi mở ứng dụng thì GUI đã thể hiện văn bản của tôi trên nó thay vì văn bản mặc định. Đa số các thông tin trong Registry được đặt một cách tự động bởi Windows khi cài đặt hệ điều hành. Phần còn lại đến từ các tiện ích và ứng dụng thông qua trình cài đặt của họ. Bạn cũng có thể tự soạn thảo dữ liệu Registry, điều đó cho phép có thể điều chỉnh, kích hoạt hoặc sửa một số thiết lập nào đó.

Cảnh báo! Bất kỳ thay đổi nào thực hiện với Registry bằng Registry Editor đều là cố định, không có nút “undo”, vì vậy bạn phải cẩn thận với những gì thực hiện ở đây. Chỉ can thiệp vào Registry nếu bạn biết mình đang thực hiện những gì, bởi vì hậu quả cho các lỗi gây ra với Registry có thể rất nghiêm trọng (ví dụ tồi tệ nhất là bạn sẽ phải cài đặt lại Windows). Nguyên tắc chủ chốt khi thực hiện các thao tác với Registry là bạn luôn thực hiện một bản backup để phòng khi tình huống xấu có thể xảy ra. Dưới đây là một hình ảnh thể hiện cấu trúc của Registry, nó được tạo thành bằng 5 nhánh con (sẽ được thảo luận trong phần tiếp theo của bài viết này). Bạn có thể duyệt đến một khóa từ phần bên trái và các giá trị của nó sẽ được hiển thị bên cửa sổ phía phải. Để mở Registry Editor, bạn kích Start > Run… và đánh vào đó “regedit.exe”.


Hình 1: Regedit.exe đang hiển thị cấu trúc của Registry

Thiết lập các cho phép
Bạn có thể thiết lập cho phép trên các nhánh con hoặc khóa riêng biệt để người dùng được phép hoặc không được phép truy cập. Mặc định, người dùng được phép truy cập đọc trong khi các quản trị viên được phép đọc và ghi trên hầu hết các khóa. Khi kiểm tra một ứng dụng .NET gần đây, tôi đã phát hiện ra rằng hành vi cài đặt không gán đúng các cho phép cho một khóa nào đó thì một phần của ứng dụng có thể bi hỏng. Khi thiết lập đúng các cho phép, mọi thứ lại làm việc bình thường trở lại. Trong trường hợp này nó là lỗi của hãng và may mắn thay tôi lại có thể sửa được lỗi này thông qua regedit.exe. Để thiết lập các cho phép, bạn mở regedit.exe, kích phải vào khóa và chọn “Permissions…”. Windows lúc này sẽ hiển thị một danh sách ACL cho khóa đó và bạn có thể soạn thảo các cho phép như thực hiện trên file NTFS hay thư mục.


Hình 2: Danh sách ACL cho thiết lập các cho phép trên khóa SOFTWARE

Cũng không thừa khi nói rằng bạn phải cẩn thận với những ai, cái gì mà bạn cho phép và hạn chế cho phép.

5 nhánh nhỏ của Registry
5 nhánh nhỏ dưới đây của Registry gồm nhóm logic thông tin Registry được gọi là các nhánh nhỏ (SubTrees). Có 5 phần chính của Registry và mỗi phần trong chúng giữ một tập các khóa con. Khi tiến hành thay đổi, bạn có khả năng thực hiện hầu hết công việc trong nhánh _MACHINE và _USER.

Nhánh Mô tả
HKEY_CLASSES_ROOT HKEY_CLASSES_ROOT là nhánh gồm có dữ liệu liên quan tới các kiểu file với các ứng dụng và cấu hình cho đối tượng COM.
HKEY_LOCAL_USER Nhánh này cũng được biết đến với tên viết tắt HKCU, HKEY_LOCAL_USER gồm các thiết lập và sở thích cho người dùng hiện đã đăng nhập vào hệ thống. Các thiết lập này là động và duy nhất với mỗi người dùng.
HKEY_LOCAL_MACHINE Được viết tắt là HKLM, HKEY_LOCAL_MACHINE gồm các thông tin về phần cứng hiện đã được cài đặt và các thiết lập cho hệ thống đang chạy trên máy. Bình thường nó tĩnh tại đối với tất cả người dùng cho tới khi có môt sự thay đổi nào đó được thực hiện.
HKEY_USERS Nhánh này gồm có một con trỏ trỏ đến HKEY_LOCAL_USER và profile người dùng mặc định (một mẫu đã sử dụng khi gán một profile cho những người dùng mới).
HKEY_CURRENT_CONFIG Nhánh này lưu dữ liệu cấu hình cho phần cứng hiện tại và trỏ đến HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles

Các kiểu dữ liệu đã định nghĩa cho Registry
Phía bên phải của trình soạn thảo Registry, bạn sẽ thấy nhiều kiểu dữ liệu khác nhau và các giá trị của chúng.

Kiểu dữ liệu Mô tả
REG_SZ Chuỗi giá trị đơn giản. thường là một URL, đường dẫn hoặc số cổng.
REG_BINARY Dữ liệu nhị phân biểu diễn trong định dạng hexa.
REG_DWORD Kiểu dữ liệu khác của REG_BINARY nhưng có chiều dài 4 byte
REG_MULTI_SZ Một chuỗi ký tự kích thước cho phép bạn có thể nhập vào số các tham số trong thực thể giá trị đơn này.
REG_EXPAND_SZ Là một chuỗi ký tự kích thước thay đổi có thể gồm có các thông tin động thay đổi khi khởi động (như %username%, thành phần có kích thước khác nhau đối với mỗi tên)

Cấu hình Registry từ xa
Regedit.exe cho phép bạn cấu hình từ xa Registry của các máy tính khác một cách nhanh chóng và dễ dàng. Tất cả những gì bạn cần là quyền phê chuẩn (quyền quản trị) để thực hiện. Mẹo: Hãy bảo đảm rằng Group Policy không nằm ở vị trí không cho phép các kết nối Registry từ xa. Mở regedit.exe và từ menu File bạn chọn “Connect Network Registry…”. Đánh tên máy tính hoặc nhấn [Advanced…] và tìm kiếm máy tính, sau đó nhấn OK. Sau khi nhập vào đúng các thông tin chi tiết, registry của máy tính điều khiển xa được nạp vào giao diện điều khiển như nó là máy tính cục bộ. Khi bạn đã thực hiện xong việc thay đổi, hãy chọn từ “Disconnect Network Registry…” menu File khi đó regedit.exe sẽ dừng kết nối. Bạn nên nhớ rằng bất kỳ thay đổi nào tạo ra đểu sẽ ảnh hưởng trên máy tính từ xa ngay lập tức, hoặc một số trường hợp sau khi khởi động lần kế tiếp.


Hình 3: Màn hình hiển thị kết nối Registry từ xa

Khi bạn kết nối một Registry từ xa, bạn chỉ có thể chỉnh sửa trong các khóa HKEY_LOCAL_MACHINE và HKEY_USERS. Trong ví dụ này, từ một máy tính cục bộ, được kết nối đến một máy chủ khác có tên gọi là ZTABONA và có thể tạo những thay đổi cần thiết đối với các khóa đã đề cập ở trên.

Việc sao lưu dự phòng và khôi phục Registry
Có ba phương pháp sao lưu dự phòng (backup) Registry trong Windows 2003. Bạn có thể backup/restore toàn bộ Registry bằng tiện ích Windows Backup, import/export các nhánh nào đó hoặc khóa từ regedit.exe, hoặc sử dụng một công cụ nhỏ là reg.exe từ dòng lệnh. Phần sử dụng công cụ này sẽ được giải thích chi tiết hơn ở phần dưới.

Tiện ích Backup and Restore
Từ menu Start, bạn điều hướng đến Programs > Accessories > System Tools và mở Backup - để vào tiện ích Backup and Restore Wizard hoặc có thể đi thẳng vào tiện tích Backup and Restore (phụ thuộc vào các thiết lập bạn đã chọn từ trước).


Hình 4: Tiện ích Backup and Restore

Từ tab Backup, bạn mở My Computer và chọn hộp kiểm System State. Lưu ý: Trên bộ điều khiển miền, việc sao chép dự phòng trạng thái hệ thống cũng sao chép dự phòng luôn cả Active Directory, các file khởi động, Certificate Server (nếu đã cài đặt), Registry của lớp đối tượng COM và SYSVOL, một phần của Registry đầy đủ. Chọn một vị trí để file backup được lưu tại đó (thường là thiết bị lưu trữ di động hoặc partition khác) và kích Start Backup. Một hộp thoại mới sẽ xuất hiện hiển thị trạng thái của thủ tục backup. Khi backup được hoàn tất, nhấn OK và đóng cửa sổ lại. Để khôi phục một file backup, bạn vào tab Restore and Manage Media và chọn Tools > Catalog a backup file. Duyệt đến vị trí của file backup đã được lưu và chọn nó. Chọn những gì bạn muốn khôi phục (trong trường hợp này nó là toàn bộ trạng thái hệ thống) và nhấn nút Start Restore Import/Export các File của Registry Khi export một phần của Registry, nó được lưu bởi một file .reg, khi được thực thi sẽ đưa các giá trị của nó quay trở lại Registry. Điều này thường được sử dụng khi một hãng phần mềm nào đó cần một máy khách để kích hoạt “Chế độ debug”. Để export một file Registry, bạn chọn khóa mong muốn từ panel bên trái của regedit.exe, kích chuột phải vào nó và chọn Export. Chọn nơi bạn muốn file .reg được lưu và nhấn Save. Khi file đã được export, bạn có thể chỉnh sửa nó bằng Notepad.exe hoặc bất kỳ phần mềm soạn thảo văn bản nào. Ví dụ một file .reg:

Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Control Panel\Accessibility\MouseKeys] "Flags"="62" "MaximumSpeed"="80" "TimeToMaximumSpeed"="3000"

Để inport một file .reg, bạn chỉ cần kích đúp vào nó sau đó nhấn Yes. Thông tin sau đó sẽ được bổ sung vào Registry.


Hình 5: Thông báo xác nhận của bộ soạn thảo Registry

Chỉ import các thông tin cho Registry nếu bạn biết chính xác khóa gồm những gì. Lưu ý: Bạn cũng có thể import/export một file Registry bằng công cụ dòng lệnh reg.exe.

Sử dụng dòng lệnh
Sử dụng reg.exe, bạn có thể backup và restore các phần của Registry bằng một số lệnh đơn giản. Công cụ này sẽ cho phép bạn backup một nhánh con trong khi đó hệ thống vẫn đang chạy. Với mục đích giải thích, chúng tôi sẽ minh chứng về cách sử dụng REG SAVE và REG RESTORE. REG save Sử dụng lệnh REG save để lưu các khóa gốc cho việc khôi phục sau này. Cú pháp của lệnh này là:

reg save

Trong ví dụ của chúng tôi, sử dụng cú pháp ở trên để lưu HKEY_CLASSES_ROOT, HKEY_CLASSES_CONFIGHKEY_CLASSES_USER (bạn có thể xem hình bên dưới).


Hình 6: Sử dụng công cụ dòng lệnh reg.exe để lưu các khóa Registry

Các file Registry sẽ được lưu vào thư mục cụ thể nào đó, như thể hiện trong hình dưới đây.


 Hình 7: Thư mục lưu các khóa Registry

Sử dụng lệnh “reg restore”, bạn có thể khôi phục các khóa đã lưu từ trước. Trong ví dụ của chúng tôi, nếu muốn khôi phục HKEY_CLASSES_ROOT tôi phải chạy lệnh dưới đây tại dấu nhắc lệnh.

Reg restore hkcr c:\regbackup\hkcr

Thực hiện tương tự như vậy với các khóa khác.

Kết luận
Tìm hiều về registry như thế nào, cách backup và restore ra sao sẽ mang đến cho bạn những kiến thức có giá trị. Đặc biệt với một quản trị viên bạn cần phải thấy được rằng việc chỉnh sửa registry đôi khi có thể trả lời được khá nhiều vấn đề. Nhiều người thích tìm hiểu registry nhưng có những người không muốn dính dáng tới nó vì chưa hiểu. Không nên quá sợ khi thực hiện các thay đổi, chỉ cần một điều là bạn phải cẩn thận và biết được chính xác những gì mình đang thực hiện.