Phương thức tĩnh hoạt động ít nhiều giống như phương thức toàn cục, ta truy cập phương thức này mà không cần phải tạo bất cứ thể hiện hay đối tượng của lớp chứa phương thức toàn cục. Tuy nhiên, lợi ích của phương thức tĩnh vượt xa phương thức toàn cục vì phương thức tĩnh được bao bọc trong phạm vi của một lớp nơi nó được định nghĩa, do vậy ta sẽ không gặp tình trạng lộn xộn giữa các phương thức trùng tên do chúng được đặt trong namespace.
Ghi chú: Chúng ta không nên bị cám dỗ bởi việc tạo ra một lớp chứa toàn bộ các phương thức linh tinh. Điều này có thể tiện cho công việc lập trình nhưng sẽ điều không mong muốn và giảm tính ý nghĩa của việc thiết kế hướng đối tượng. Vì đặc tính của việc tạo các đối tượng là xây dựng các phương thức và hành vi xung quanh các thuộc tính hay dữ liệu của đối tượng.
Gọi một phương thức tĩnh:
Như chúng ta đã biết phương thức Main() là một phương thức tĩnh. Phương tĩnh được xem như là phần hoạt động của lớp hơn là của thể hiện một lớp. Chúng cũng không cần có một tham chiếu this hay bất cứ thể hiện nào tham chiếu tới. Như vậy phương thức tĩnh không có đối ngầm địh là this. Do vậy phương thức tĩnh không thể truy cập trực tiếp đến các thành viên không có tính chất tĩnh (nonstatic). Như vậy Main() không thể gọi một phương thức không tĩnh bên trong lớp.
Để xây dựng một phương thức là tĩnh ta thêm từ khóa static trong định nghĩ phương thức.
Ví dụ 2.5a: Cho P(x)=a[0]xn+a[1]xn-1+..+a[n]
Tính 3 3 ) (x P --- using System; public class DaThuc {
int n; double x;
double [] hs = new double [50]; public void nhap()
{
Console.Write("Nhap he so=");
n = Convert.ToInt16(Console.ReadLine());
Console.Write("Nhap x="); x = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Nhap cac he so");
for (int i = 0; i <=n; ++i) {
Console.Write("hs[{0}]=", i);
hs[i] = Convert.ToDouble(Console.ReadLine()); }
}
public static double mu(double x, int n) {
if (n == 0) return 1;
else return x * mu(x, n - 1); }
public static double can3(double x) {
if (x == 0) y = 0;
else if (x > 0) y = Math.Exp(1.0 / 3 * Math.Log(x)); else y = -Math.Exp(1.0 / 3 * Math.Log(-x));
return x; }
public double gtdt() {
double p = 0;
for (int i = 0; i <=n; ++i) p = p+hs[i]*mu(x,n-i); return p;
} }
public class Tester {
static void Main() {
DaThuc p = new DaThuc(); p.nhap();
Console.WriteLine("Gia tri cua da thuc ={0}", DaThuc.can3(p.gtdt()/3)); }
}
Như vậy phương thức tĩnh là phương thức chung cho tất cả các đối tượng của lớp, nó không thuộc bất kỳ đối tượng nào. Ta có thể coi phương thức tĩnh như là một phương thức toàn cục của lớp, các phương thức tình chỉ dùng để xử lý các thành phần tĩnh
Ví dụ trong phương thức can3 ta viết như sau là sai
public static double can3(double x) {
double y; n=10;
/* Sai vi n không phải là thuộc tính tĩnh. Nếu viết như này thì chương trình dịch hiểu là: this.n=10. Nhưng trong phương thức tĩnh thì không có đối ngầm định là this*/
if (x == 0) y = 0;
else y = -Math.Exp(1.0 / 3 * Math.Log(-x)); return x;
}