1. 程式人生 > >static 和new物件方法的區別

static 和new物件方法的區別

學完static以後,同學們都覺得用static修飾的成員特別方便,不用建立物件就可以使用,而不用static修飾的成員倒顯得麻煩了,非得建立物件才能使用,但我們平時定義方法時又很少使用static。為什麼呢,那什麼時候用static,又什麼時候不用static呢?

我們拋開static成員使用的特點,理解一下static修飾成員的意義。

類的一個成員被static修飾後,該成員就屬於類的成員了,被所有物件共享,如果成員是成員變數,那麼該成員以及該成員的值就被所有物件所共享;如果成員是成員方法,那麼該方法就被所有物件共享;相反如果成員沒有用static修飾,那麼每個物件就有自己的成員,這時可以說,每個物件的成員是他私有的,注意這和許可權控制裡的私有許可權是兩碼事。可以想象,共享的方法只能訪問共享的成員,是無法訪問物件私有的成員的,而物件私有的成員方法是可以訪問共享的成員的。打個比方,就像我們給公家幹活肯定花的是公家的錢,絕不會花私人的錢,而給自己幹活時,卻可以花公家的錢,只要公家不追究。這也就是為什麼static修飾的成員只能訪問static修飾的成員,如static修飾的成員方法,static修飾的初始化塊還有static修飾的內部類均如此。也有的人把static理解為靜態的或全域性的,其實差不多,因為靜態的對應者動態的,全域性的對應著區域性的,看你從哪個角度去理解。

在實際開發中,之所以給類定義成員變數,就是因為該類有不同狀態的物件,比如我們定義人這個類,一般會定義年齡、姓名等屬性,然後不同的人(這裡就是人這個類的物件了)雖然都有年齡和姓名,但各有各的年齡,各有各的姓名,這就是上面說的每個物件的成員是該物件私有的。如果把年齡和姓名定義成static的,那就導致所有的人都有相同的年齡和姓名,顯然這沒有意義。

現在回答什麼時候使用static修飾成員方法。

       我個人的理解很簡單,只要該成員方法不需要與非static的成員打交道,就可以使用static。換句話說,只要該方法的執行與物件本身的狀態沒有關係,就可以使用static(這個結論可能過於草率)。這類方法通常只對傳入的引數作處理,執行過程和自身狀態毫無關係,比如我們熟知的Integer和String。

                     Integer.toBinaryString(10);

String.valueOf(12);

Integer和String雖然都有非static的成員,但是這兩個方法都不與非static的成員打交道,所以可以定義成static的。

通常,我們在定義一個工具類時,一般把它的方法定義成static的,因為這種類只用作工具,只關注他的行為,不關注他的狀態,所以不需要定義成員變數。使用這種工具類的方法時無需建立物件,既簡單又節省資源。建立物件來呼叫反而麻煩且浪費資源,所以這種類被設計出來後就乾脆不允許建立物件,因為其構造方法被設計成private許可權了。比如我們用的Math和Arrays,還有Collections。這三個類時我們java中最常見的三個工具類。

       static在實際開發中有很多巧妙的用法,只有理解了static的意義,我們才能領略其中的巧妙。

相關推薦

static new物件方法區別

學完static以後,同學們都覺得用static修飾的成員特別方便,不用建立物件就可以使用,而不用static修飾的成員倒顯得麻煩了,非得建立物件才能使用,但我們平時定義方法時又很少使用static。為什麼呢,那什麼時候用static,又什麼時候不用static呢?我們拋開static成員使用的特點,理解一下

PHP中new static() new self() 的區別

pub 堆內存 func sel urn ret 通過 ati php self 指的是self所在的類 new static 實例化的是當前使用的類,有點像$this ,從堆內存中提取出來。 還是通過實例說明一下: class A { public static f

new static new self的區別

 new static    new self   都是例項化當前類, 但是new static只有程式碼所在的類,就是子類如果沒有重寫的話那麼例項化的就是父類。 而ne

方法staticnew區別

(一)靜態變數:執行緒非安全 1、靜態變數:使用static關鍵字定義的變數。static可以修飾變數和方法,也有static靜態程式碼塊。被static修飾的成員變數和成員方法獨立於該類的任何物件。也就是說,它不依賴類特定的例項,被類的所有例項共享。只要這個類

staticextern的使用區別

col color 不可訪問 全局 結束 改變 初始 font spa 1. static: 局部:只會初始化一次,內存只有一份內存;改變不了局部變量的作用域但可延長其生命周期至程序結束才被銷毀。 全局:僅限於當前文件的作用域,外部

C#中的overridnew修飾符區別(代碼)

之間 using stat ide post 不同的 虛擬 spa 代碼 在C#的繼承中嘗嘗會用到相關的修飾詞:override和new。這兩個修飾符都可以在新的子類中,重寫同名的父類方法。 override: 擴展或修改繼承的方法、屬性、索引器或事件的抽象或虛擬

Java中String直接賦字符串new String的區別 如String str=new String("a")String str = "a"有什麽區別

this his The tin ase name ++ 常量池 TE 百度的面試官問 String A="ABC"; String B=new String("ABC"); 這兩個值,A,B 是否相等,如果都往HashSet裏面放,能放下嗎? 答:A==B 不等,

evalnew Function的區別

light console ole 運行環境 相同 fun glob rip UNC eval和new Function都可以動態解析和執行字符串。但是它們對解析內容的運行環境判定不同。  var a = ‘global scope‘ function b()

c#靜態方法非靜態方法區別

特殊 靜態成員 pan 們的 gpo ase sna eth key c#靜態方法和非靜態方法區別 C#的類中可以包含兩種方法:C#靜態方法與非靜態方法。那麽他們的定義有什麽不同呢?他們在使用上會有什麽不同呢?讓我們來看看最直觀的差別:使用了static 修飾符的方法

C++ operator newnew operator的區別

new operator 當你寫這種程式碼: string *ps = new string("Memory Management"); 你使用的new是new  operator。 new操作符做兩件事,分配記憶體+呼叫建構函式初始化。   operator new 你所能

jQuery物件Dom物件區別與轉換

DOM是Document Object Model(文件物件模型)的簡寫,只有HTML,XML等文件結構的語言才具有DOM。 DOM中的節點通常分為三種類型:元素節點,屬性節點,文字節點。 1.元素節點:<html>,<body>,<p>,<ul&g

淺談String str = "" new String()的區別

關於String類的知識經常出現在面試題中,在此先記錄自己的理解。 首先明白一個事,java存在一個常量池,可以用來儲存字串常量。 1 建立的字串變數在記憶體中的區別 兩者看似都是建立了一個字串物件,但在記憶體中確是各有各的想法。 String str1= “abc”; 在編譯期

Dom物件,js物件jquery物件區別

原文:https://blog.csdn.net/kuangdacaikuang/article/details/72235747 一、DOM物件 文件物件模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴充套件置標語言的標準程式設計介面。

java中類方法物件方法區別

public class Test { /** * 下面這個方法就是靜態方法,應該就是樓主所說的類方法~~ * 靜態方法必須定義成static的,在類Test被例項化以前就已經存在於記憶體中 * 靜態方法使所有該類的例項也就是物件共有的方法 */ public static void f1() {

malloc/freenew/delete的區別

malloc與free是C++/C語言的標準庫函式,new/delete是C++的運算子

淺談String str = "" new String()的區別

關於String類的知識經常出現在面試題中,在此先記錄自己的理解。 首先明白一個事,java存在一個常量池,可以用來儲存字串常量。 1 建立的字串變數在記憶體中的區別 兩者看似都是建立了一個字串物件,但在記憶體中確是各有各的想法。 String str1= “abc”

GETPOST請求方法區別淺析(面試專用)

GET和POST是HTTP請求的兩種基本方法,要說它們的區別,接觸過WEB開發的人都能說出一二。 最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。 你可能自己寫過無數個GET和POST請求,或者已經看過很多權威網站總結出的

常用的Date物件Math物件方法

Date物件方法: 當前使用者本地時間 let time = new Date(); 獲取整數年 console.log(time.getFullYear()); 獲取當前月(月份要加1) console.log(time.getMonth()+1); 獲取當前周【

String 直接賦值new 物件

用一個簡單的例子表述Stirng直接賦值和new物件的區別 String a = new String(“a”); String b = new String(“a”); //此處是比較的是物件引用的地址 System.out.println(“比較記憶體地址是

malloc,freenew delete的區別

1.malloc和free是庫函式,以位元組為單位申請記憶體 2.new和delete是關鍵字,以型別為單位申請記憶體 3.malloc和free單純的對記憶體進行申請與釋放 4.對於基本型別new關鍵字會對記憶體進行初始化 5.對於類型別new和delete還負責建