Vấn đề này không khó, nhưng rất ít khi các bạn gặp khi làm các bài tập trong lớp, chỉ có khi đụng chạm đến thực tế thì các bạn mới có thể hiểu hơn và áp dụng trơn tru đc.
Mình chỉ giải thik đoạn code hôm bữa thực hành, vì sao lại có cái dòng:
- Code:
-
static int TinhTien(int sophut)
Đây là nguyên bài, mình xin post lại:
- Code:
-
/**
* @(#)DIENTHOAI.java
*
* DIENTHOAI application
*
* @Edward
* @version 1.00 2010/9/16
*/
import java.util.Scanner;
class DIENTHOAI {
public static void main(String[] args) {
int sophut;
System.out.print("Nhap Vao So Phut: ");
Scanner in = new Scanner(System.in);
sophut = in.nextInt();
int tien = TinhTien(sophut);
System.out.print("Tong Tien = " + tien + " VND");
}
static int TinhTien(int sophut)
{
int tong = 27000;
if(sophut > 200)
{
sophut -= 200;
tong += 200 * 120;
if(sophut > 200)
{
sophut -= 200;
tong += 200 * 80;
tong += sophut * 40;
}
else
{
tong += sophut * 80;
}
}
else
{
tong += sophut * 120;
}
return tong;
}
}
Chúng ta thấy trong phương thức main và phương thức TinhTien nằm trong cùng 1 class. và trong main, ta lại gọi TinhTien.
Chú ý rằng, đây không phải lập trình cấu trúc, và Java nó là thuần hướng đối tượng, nên sẽ không có chuyện bạn làm gì ngoài các class, ví dụ khai báo 1 biến, hay viết 1 phương thức mà ko có cái vỏ bọc của class.Và tiếp theo, mọi member (gồm thuộc tính và phương thức) không tính static members, thì đều được truy xuất thông qua 1 thể hiện (Instance) của 1 class.
Ví dụ ta có 1 class sau:
- Code:
-
class A
{
public void S()
{
//Do something...
}
}
khi đó, ta muốn gọi S thì phải thông qua 1 thể hiện của class A, nghĩa là phải tạo ra 1 đối tượng thuộc class A và truy xuất thông qua đối tượng đó.
- Code:
-
A obj1 = new A();
obj1.S();
OK, và tiện đây mình cũng nói luôn về KDL tham trị và KDL tham chiếu trong Java. (lát nói vậy)
Tiếp tục chủ đề chính.
Ta không thể làm thế này với phương thức S():
- Code:
-
A.S();
Sẽ không hợp lệ vì S() cần 1 Instance thuộc lớp A để truy xuất nó.
Và cũng như ở bài code ở trên, giả sử ta viết lại hàm:
- Code:
-
static int TinhTien(int sophut)
thay bằng:
- Code:
-
int TinhTien(int sophut)
thì khi ta gọi chú này trong main, tất nhiên là cũng gặp trường hợp như đã nói nghĩa là TinhTien cần được thực hiện thông qua 1 thể hiện của class.
Nhưng khi ta thêm static thì mọi chuyện lại khác. Khi đó, ta có thể thoải mái gọi nó như thế này.
Nếu trong phạm vi class thì chỉ cần gọi lên và xài thôi. Và ở ngoài lớp thì sẽ là như vầy, chú ý:
- Code:
-
static int TinhTien(int sophut)
các bạn nên thay bằng
- Code:
-
public static int TinhTien(int sophut)
Để có thể truy xuất được ở ngoài, và ở ngoài, chúng ta có thể gọi thông qua tên lớp:
- Code:
-
DIENTHOAI.TinhTien(1234);
Nhưng ta không thể làm
- Code:
-
DIENTHOAI A = new DIENTHOAI();
A.TinhTien();
Không giống bên C++, phương thức static bên C++ có thể được gọi bởi class hay 1 thể hiện nào đó của class, còn Java == C#, nó không cho phép gọi 1 static method thông qua 1 instance của 1 class.
Vậy mục đích của static members là gì?1. Để làm cái việc như ở trên
2. Khi chúng ta muốn lưu lại dữ liệu đã tính toán bên class này, và sẽ mang qua class kia để tính, đọc trông khó hỉu quá nhỉ?
Mình sẽ làm 1 ví dụ, mình đã từng làm với static với lập trình Winform.
Giả sử mình có 2 form: form2 chọn máy chủ kết nối vào Server, và form2 làm nhiệm vụ đăng nhập vào Server thông qua thông tin bên form1 (gồm tên Server, ID, pass,...). Vậy phải làm sao? Có nhiều cách để truyền dữ liệu giữa các form với nhau, nhưng cách đơn giản và hiệu quả là dùng static members.
Cách làm: khi chúng ta đã gõ đầy đủ thông tin bên form1 rồi, và lưu nó và 1 public static string S. khi đó string S này là static field của form1, và trong form2, nếu chúng ta muốn kết nối vào Server thông qua thông tin đã nhập bên form1 thì chỉ cần tạo 1 chuỗi string D bên form2, và gán: D = form1.S; thế là OK, ta đã có thể dùng được dữ liệu bên form1 rồi.
Mệt rồi, đơn giản vậy thôi. Túm lại 1 câu: static members là thành viên của class, ko là riêng của đối tượng nào, và chúng ta chỉ có thể truy xuất thông qua tên lớp!