聲明static屬性
static是Java中定義的一個關(guān)鍵字抑诸,主要是描述全局的概念,所以利用static關(guān)鍵字可以定義屬性與方法
利用static定義屬性
首先我們舉個例子秉馏,創(chuàng)建一個Person類宵喂,其屬性包括姓名、年齡以及國家,對國家使用static關(guān)鍵字并進行研究
代碼如下:
class Person{
private String name;
private int age;
static String country = "俄羅斯";//利用static關(guān)鍵字將country設(shè)置為公共屬性荐吵,且暫不封裝
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getInfo(){
return "姓名:"+name+",年齡"+age+"赊瞬,國家:"+country;
}
}
public class MyClass {
public static void main(String[] args) {
System.out.println(Person.country);//無需實例化對象直接輸出國家
System.out.println(Person.country = "中國");//公共屬性可以直接進行修改
System.out.println(new Person("張三",10).getInfo());
}
}
//輸出結(jié)果:俄羅斯
// 中國
// 姓名:張三先煎,年齡:10,國家:中國
通過以上代碼我們可以發(fā)現(xiàn)巧涧,在修改了國家這個屬性后薯蝎,任意對象的國家屬性均發(fā)生了變化,這就叫做公共屬性谤绳,公共屬性必須通過static
定義占锯,且無需實例化對象直接通過類名稱就可訪問袒哥,而對于公共屬性的內(nèi)容保存既不在堆內(nèi)存也不在棧內(nèi)存中,而是會存在于全局數(shù)據(jù)區(qū)之中(所有的方法保存在全局代碼區(qū)之中)
內(nèi)存分析圖如下:
雖然static的屬性定義在類之中消略,但是其是完全獨立的堡称,不受實例化對象的控制。在90%的情況下都無需使用其關(guān)鍵字艺演,而在需要設(shè)置公共屬性時才適用)
利用static定義方法
利用static定義的屬性可以直接通過類名稱進行訪問却紧,但是static也可以用于方法的定義上,且這個方法也可以直接通過類名稱進行調(diào)用
代碼如下:
class Person{
private String name;
private int age;
private static String country = "俄羅斯";//利用static關(guān)鍵字將country設(shè)置為公共屬性
public Person(String name,int age){
this.name = name;
this.age = age;
}
public static void setCountry(String country) {//創(chuàng)建static關(guān)鍵字的方法
Person.country = country;
}
public static String getCountry() {
return country;
}
public String getInfo(){
return "姓名:"+name+"胎撤,年齡"+age+"晓殊,國家:"+country;
}
}
public class MyClass {
public static void main(String[] args) {
System.out.println(Person.getCountry());//無需實例化對象直接輸出屬性
Person.setCountry("中國");//無需實例化對象直接改變屬性
System.out.println(Person.getCountry());
System.out.println(new Person("張三",10));
}
}
//輸出結(jié)果:
//俄羅斯
//中國
//張三,10伤提,中國
static的方法依然不受到實例化對象的限制巫俺,可以直接通過類名稱調(diào)用,但此時就會出現(xiàn)static方法肿男、非static方法介汹,這兩種方法之間的相互訪問就會一些差異:
- 所有的非static方法都可以直接調(diào)用static方法或static屬性
- static方法不能夠直接調(diào)用非static方法或者是非static屬性
為什么會出現(xiàn)如上差異:
- 所有的static屬性或方法可以在類沒有實例化對象的時候進行直接調(diào)用
- 所有非static屬性或方法必須在類產(chǎn)生實例化對象之后才可以進行調(diào)用
在類設(shè)計的過程之中90%的方法都是用非static方法定義,如果一個類中沒有任何的屬性次伶,那么這個類不需要定義普通方法痴昧,只需要定義static方法
觀察分析主方法(了解)
定義方法時有兩種方案:
-
某一個方法定義在主類中赶撰,并且由主方法直接調(diào)用:
public static 返回值類型 方法名稱(){}
由于主類中主方法是static方法,因此在主方法里面的方法只能是static方法柱彻,或者是普通方法進行實例化對象調(diào)用豪娜,因為static方法不能直接調(diào)用非static方法
某一種方法定義在類中,并且由實例化對象進行調(diào)用:
public 返回值類型 方法名稱(){}
Java主方法拆分:
public:是一種訪問權(quán)限哟楷,表示所有的操作者都可以看見
static:執(zhí)行一個類的時候輸入:"java 類名稱"瘤载,表示由類直接調(diào)用
void:主方法是一切的起點,無需返回值
main:是由系統(tǒng)定義好的方法名稱
String[] args:程序執(zhí)行時的輸入?yún)?shù)卖擅,初始化參數(shù)的
static關(guān)鍵字應(yīng)用:
static屬性有一個最好的特點:公共屬性鸣奔,所有的對象都可以對其修改
范例:將沒有名字的人的姓名從null設(shè)置為無名氏-編號
代碼如下:
class Person{
private String name;
private static int count = 1;//使用static關(guān)鍵字實現(xiàn)全局屬性用于統(tǒng)計個數(shù)
public Person(){
this("無名氏-" + count++);
}
public Person(String name){
this.name = name;
System.out.println(getInfo());
}
public String getInfo(){
return "姓名:"+this.name;
}
}
public class MyClass {
public static void main(String[] args) {
new Person();
new Person();
new Person("張三");
new Person();
}
}
//輸出結(jié)果 姓名:無名氏-1
// 姓名:無名氏-2
// 姓名:無名氏-3
// 姓名:張三
// 姓名:無名氏-4
總結(jié)
1.在類的首要設(shè)計過程之中不要去考慮static屬性或者是方法
2.使用static方法大部分情況下有兩種可能性:
可以不受到類實例化對象的控制
類中沒有提供普通屬性