Spark_算子調優
932
2025-04-01
目錄
1、聲明static屬性
2、聲明static方法
3、分析主方法
3、static應用案例
1、聲明static屬性
static關鍵字,主要描述全局的概念,利用該屬性可以定義屬性和方法,但是90%情況下很少直接編寫static。
現在假設定義一個只描述中國人的類,類中包含:姓名、年齡、國家,按之前的概念設計如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Person perA = new Person("張三",10);
Person perB = new Person("李四",20);
Person perC = new Person("王五",10);
System.out.println(perA.getInfo());
System.out.println(perB.getInfo());
System.out.println(perC.getInfo());
}
class Person{
private String name;
private int age;
String country = "中華人民共和國"; //該屬性暫時不封裝
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getInfo(){
return "姓名:"+this.name+",年齡:"+this.age+",國家:"+this.country;
}
}
以上代碼很簡單,但是分析內存關系時就會發現問題:
以上紅色標記的是重復的信息,在對象數量少的情況下沒什么問題,但是在數據量大的情況下要修改屬性信息,比如20億,20億對象要修改country屬性,那是巨大的操作量~對整個代碼 的維護很不友好。
造成以上問題的根源主要是:類中的普通屬性是每一個對象獨自擁有的,這樣的設計不符號當前的環境,最好是將country設置為公共屬性,所有對象都共享此屬性,這時就可以通過static關鍵字實現。
【舉例】:使用static關鍵字實現
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Person perA = new Person("張三",10);
Person perB = new Person("李四",20);
Person perC = new Person("王五",10);
perA.country = "中國-唐朝";
System.out.println(perA.getInfo());
System.out.println(perB.getInfo());
System.out.println(perC.getInfo());
}
class Person{
private String name;
private int age;
static String country = "中國"; //該屬性暫時不封裝
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getInfo(){
return "姓名:"+this.name+",年齡:"+this.age+",國家:"+this.country;
}
}
由以上結果可知,修改了一個對象的屬性后,所有對象的屬性都一起更改,這樣的屬性稱為公共屬性,該屬性必須通過static關鍵字定義,對于公共屬性的內容保存不會在堆棧中,而是保存在全局數據區中,所有的方法保存在全局代碼區之中。內存分析如下:
但是有這樣一個問題,既然static屬于全局屬性,那么由一個對象進行修改很明顯不合適,最好的做法是利用所有對象的一個最高代表進行操作,即類。對于static定義的屬性可以由類.屬性直接調用。這是比較標準的操作:
Person.country = "中國-唐朝";
此時類中存在static和非static屬性:
所有的普通屬性都是在對象實例化的時候進行內存分配;
而static可以在沒有實例化對象產生的情況下直接使用。
System.out.println(Person.country);
Person.country = "中國-北宋";
System.out.println(Person.country);
System.out.println(new Person("張三",20).getInfo());
由以上操作可知,雖然static屬性定義在類中,但它是完全獨立的,不受對象實例化的控制。
大多數情況下類的設計都會使用非static屬性,只有表示公共 屬性或與類實例化無關的情況下才會考慮使用static。
2、聲明static方法
利用static定義的屬性可以直接通過類名稱進行訪問,static也可以用于方法的定義上,這個方法也同樣可以由類名稱直接進行調用。
【舉例】:定義static方法
class Person{
private String name;
private int age;
private static String country = "中華人民共和國"; //該屬性暫時不封裝
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getInfo(){
return "姓名:"+this.name+",年齡:"+this.age+",國家:"+this.country;
}
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
Person.country = country;
}
}
static的方法依然不受實例化的限制,所以可以直接由類名稱直接調用。但是此類的方法就存在有兩種了:static與非static,兩者之間的訪問就會出現問題,有如下語法規定:
所有非static方法可以直接調用此類中的static方法或static屬性。
static方法不能直接調用此類中的非static方法或非static屬性。
【什么時候使用static方法】:
類設計過程中,90%都使用非static方法;
若類中沒有任何屬性,此類不需要定義普通方法,只需要定義static方法(比如開發中常用的自定義工具類,無需實例化對象,無需開辟無用的內存空間);
3、分析主方法
最早講解方法定義的時候,實際上給出了兩種方案:
某方法定義在主類中,由主方法直接調用,格式:public static 返回值類型 方法名稱(){};
某方法定義在子類中,由實例化對象直接調用,格式:public 返回值類型 方法名稱(){};
實際開發中,主類基本不會寫太多方法,大部分方法都會封裝在類中。
Java中的主方法是最長的:
static:執行類的時候輸入:"java 類名稱",表示由類直接調用;
void:主方法是程序的起點,無返回值;
main:系統定義好的方法名稱;
String args[]:表示程序執行時的輸入參數,初始化輸入參數。
3、static應用案例
static在一些系統類庫中大量出現,這些可能是因為定義static方法所導致。本次重點看static屬性,該屬性的一個最好的特點是公共屬性,所有對象均可以對其進行修改。
【舉例】:實現一個對象個數的統計
所有新的實例化對象產生時都會調用構造方法,可以在其中增加一個統計功能。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new Person();
new Person();
}
class Person{
private static int count = 0;
public Person() {
System.out.println("對象個數:"+count++);
}
}
【舉例】:為屬性自動命名
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println(new Person().getName());
System.out.println(new Person("張三").getName());
}
class Person{
private static int count = 0;
private String name;
public Person(){
this("無名氏-"+count++);
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4、總結
1)類的設計過程中,首先可以不去考慮static屬性或方法;
2)使用static方法,大部分情況下有兩種可能性:
希望不受類實例化的控制;
類中沒有普通屬性;
作于202004061520,已歸檔
———————————————————————————————————
本文為博主原創文章,轉載請注明出處!
若本文對您有幫助,輕抬您發財的小手,關注/評論//,就是對我最大的支持!
祝君升職加薪,鵬程萬里!
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。