java中有靜態(tài)成員和對(duì)象成員兩種類型的成員變量和方法,它們之間有許多區(qū)別。
首先,靜態(tài)成員是屬于整個(gè)類的,而不是某一個(gè)對(duì)象,可以通過(guò)類名直接訪問(wèn),而對(duì)象成員只能通過(guò)創(chuàng)建對(duì)象后才能訪問(wèn)。靜態(tài)成員在類被加載時(shí)就已經(jīng)被初始化,可以在main方法之外直接被調(diào)用,而對(duì)象成員只有在構(gòu)造方法中被初始化。
public class Example { static int staticVar = 10; //靜態(tài)成員 int instanceVar = 20; //對(duì)象成員 public Example() { //對(duì)象成員在構(gòu)造方法中被初始化 instanceVar = 30; } public static void main(String[] args) { //靜態(tài)成員可以在main方法之外調(diào)用 System.out.println(Example.staticVar); //對(duì)象成員必須先創(chuàng)建對(duì)象再調(diào)用 Example obj = new Example(); System.out.println(obj.instanceVar); } }
其次,靜態(tài)成員可以被所有對(duì)象共享,而對(duì)象成員是每個(gè)對(duì)象獨(dú)有的。修改一個(gè)對(duì)象的靜態(tài)成員會(huì)影響到所有對(duì)象,而修改對(duì)象成員只會(huì)影響到該對(duì)象。
public class Example { static int staticVar = 10; //靜態(tài)成員 int instanceVar = 20; //對(duì)象成員 public static void main(String[] args) { Example obj1 = new Example(); Example obj2 = new Example(); obj1.staticVar = 50; obj1.instanceVar = 60; System.out.println(obj1.staticVar); //50 System.out.println(obj1.instanceVar); //60 System.out.println(obj2.staticVar); //50 System.out.println(obj2.instanceVar); //20 } }
最后,靜態(tài)成員可以在沒(méi)有對(duì)象的情況下使用,而對(duì)象成員必須先有對(duì)象才能使用。這使得靜態(tài)成員經(jīng)常被用于共享數(shù)據(jù)和工具函數(shù)。
public class MathUtils { public static int add(int x, int y) { return x + y; } public static int subtract(int x, int y) { return x - y; } } public class Example { public static void main(String[] args) { System.out.println(MathUtils.add(3, 4)); //7 System.out.println(MathUtils.subtract(8, 5)); //3 } }
綜上所述,靜態(tài)成員和對(duì)象成員在訪問(wèn)方式、生命周期、共享性等方面都有不同,選用哪種類型成員要根據(jù)實(shí)際需求來(lái)進(jìn)行合理選擇。