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ó ?

Không có nhận xét nào: