Trong cùng một lớp, các đối tượng khác nhau có những biến dữ liệu cùng tên, cùng kiểu nhưng được
cấp phát ở các vùng nhớ khác nhau và giá trị của chúng cũng có thể khác nhau. Trong khi đó, thành viên tĩnh (biến, phương thức) được coi là phần chung của các đối tượng trong cùng một lớp.
Mọi đối tượng thuộc lớp đều có thể truy cập thành viên tĩnh. Nói cách khác, các thành viên thể hiện được xem là toàn cục trong phạm vi từng đối tượng còn thành viên tĩnh được xem là toàn cục trong phạm vi một lớp. Để hiểu rõ hãy xem xét sự khác biệt của Static thông qua các ví du sau. Ta có 1 lớp Tester và 1 lớp Cat.
Ví dụ bình thường.
public class CatKết quả xuất ra như sau:
{
private int SoMeo = -6;
private string TenMeo;
public Cat(string T)
{
TenMeo = T;
Console.WriteLine("WOAW!!!! {0} day!", TenMeo);
SoMeo++;
}
public Cat()
{
Console.WriteLine("Bat dau lam thit meo !!!!");
SoMeo = 0;
}
public void HowManyCats()
{
Console.WriteLine("Dang lam thit {0} con meo!", SoMeo);
}
}
class Tester
{
static void Main(string[] args)
{
Cat tom = new Cat("Meo Tom" );
tom.HowManyCats( );
Cat muop = new Cat("Meo Muop");
muop.HowManyCats( );
Console.ReadLine();
}
}
WOAW!!!! Meo Tom day!
Dang lam thit -5 con meo!
WOAW!!!! Meo Muop day!
Dang lam thit -5 con meo!
Ví dụ 2 dùng Static đơn giản.
public class CatKết quả xuất ra như sau:
{
private static int SoMeo = -6;
private string TenMeo;
public Cat(string T)
{
TenMeo = T;
Console.WriteLine("WOAW!!!! {0} day!", TenMeo);
SoMeo++;
}
public Cat()
{
Console.WriteLine("Bat dau lam thit meo !!!!");
SoMeo = 0;
}
public static void HowManyCats()
{
Console.WriteLine("Dang lam thit {0} con meo!", SoMeo);
}
}
class Tester
{
static void Main(string[] args)
{
Cat tom = new Cat("Meo Tom" );
Cat.HowManyCats( );
Cat muop = new Cat("Meo Muop");
Cat.HowManyCats( );
Console.ReadLine();
}
}
WOAW!!!! Meo Tom day!
Dang lam thit -5 con meo!
WOAW!!!! Meo Muop day!
Dang lam thit -4 con meo!
Giải thích:
- Dòng 3: Khai báo biến tĩnh static (dùng chung cho tất cả các object thuộc lớp CAT). Tương tự như biến toàn cục.
- Dòng 16: Method HowManyCats() muốn dùng được biến tĩnh SoMeo thì phải là method tĩnh (cơ bản).
- Dòng 27, 29: Nguyên tắc gọi method tĩnh của lớp. Vì là phương thức tĩnh dùng chung của Class nên không được gọi đối tượng mà được gọi qua Class.
Ví dụ 3 dùng Static nâng cao.
public class CatKết quả:
{
private static int SoMeo = -6;
private string TenMeo;
public Cat(string T)
{
TenMeo = T;
Console.WriteLine("WOAW!!!! {0} day!", TenMeo);
SoMeo++;
}
static Cat()
{
Console.WriteLine("Bat dau lam thit meo !!!!");
SoMeo = 0;
}
public static void HowManyCats()
{
Console.WriteLine("Dang lam thit {0} con meo!", SoMeo);
}
}
class Tester
{
static void Main(string[] args)
{
Cat tom = new Cat("Meo Tom" );
Cat.HowManyCats( );
Cat muop = new Cat("Meo Muop");
Cat.HowManyCats( );
Console.ReadLine();
}
}
Bat dau lam thit meo !!!!
WOAW!!!! Meo Tom day!
Dang lam thit 1 con meo!
WOAW!!!! Meo Muop day!
Dang lam thit 2 con meo!
Giải thích:
Tương tự như trên nhưng ta khởi tạo thêm 1 Constructor tĩnh (Dòng 11). Kết quả xuất hiện thêm giá trị trong Constructor tĩnh định nghĩa "Bat dau lam thit meo !!!" và SoMeo = 0. Điều đó có nghĩa là Constructor tĩnh vừa khởi tạo đã được gọi. Thật vậy, dù cho trong Class Tester không gọi nó nhưng nguyên tắc là Constructor tĩnh sẽ tự động được thực thi. Nên có kết quả như trên.
0 Nhận xét