靜態(tài)方法沒(méi)有對象,也就沒(méi)有對象的數據,無(wú)法用于多個(gè)實(shí)例,或是數組之類(lèi)的場(chǎng)合。
而非靜態(tài)方法,必須建立實(shí)例后才可以使用,在很多場(chǎng)合會(huì )非常繁瑣。
你可以理解為,非靜態(tài)方法用于對象。靜態(tài)方法用于工具類(lèi)。
再有一個(gè)理解,這兩者的區別是,非靜態(tài)方法隱式的將當前對象作為參數傳遞了進(jìn)去。
如果全部都是靜態(tài)方法,那么代碼其實(shí)就類(lèi)似C或者BASIC了,不是面向對象了。
全部都不是靜態(tài)方法,其實(shí)可以實(shí)現,只是代碼量會(huì )增加很多。
(1)Java靜態(tài)對象和非靜態(tài)對象有什么區別? 比對如下: 靜態(tài)對象 非靜態(tài)對象 擁有屬性: 是類(lèi)共同擁有的 是類(lèi)各對象獨立擁有的 內存分配: 內存空間上是固定的 空間在各個(gè)附屬類(lèi)里面分配 分配順序: 先分配靜態(tài)對象的空間 繼而再對非靜態(tài)對象分配空間,也就是初始化順序是先靜態(tài)再非靜態(tài). java靜態(tài)對象到底有什么好處? A,靜態(tài)對象的數據在全局是唯一的,一改都改。
如果你想要處理的東西是整個(gè)程序中唯一的,弄成靜態(tài)是個(gè)好方法。 非靜態(tài)的東西你修改以后只是修改了他自己的數據,但是不會(huì )影響其他同類(lèi)對象的數據。
B,引用方便。直接用 類(lèi)名.靜態(tài)方法名 或者 類(lèi)名.靜態(tài)變量名就可引用并且直接可以修改其屬性值,不用get和set方法。
C,保持數據的唯一性。此數據全局都是唯一的,修改他的任何一處地方,在程序所有使用到的地方都將會(huì )體現到這些數據的修改。
有效減少多余的浪費。 D,static final用來(lái)修飾成員變量和成員方法,可簡(jiǎn)單理解為“全局常量”。
對于變量,表示一旦給值就不可修改;對于方法,表示不可覆蓋。(2)靜態(tài)變量、靜態(tài)方法和靜態(tài)塊 通常情況下,類(lèi)成員必須通過(guò)它的類(lèi)的對象訪(fǎng)問(wèn),但是可以創(chuàng )建這樣一個(gè)成員,它能夠被它自己使用,而不必引用特定的實(shí)例。
在成員的聲明前面加上關(guān)鍵字static就能創(chuàng )建這樣的成員。如果一個(gè)成員被聲明為static,它就能夠在它的類(lèi)的任何對象創(chuàng )建之前被訪(fǎng)問(wèn),而不必引用任何對象(跟類(lèi)是否有static修飾無(wú)關(guān))。
你可以將方法和變量都聲明為static。static 成員的最常見(jiàn)的 例子是main( ) 。
因為在程序開(kāi)始執行時(shí)必須調用main() ,所以它被聲明為static。 聲明為static的變量實(shí)質(zhì)上就是全局變量。
聲明為static的方法有以下幾條限制: · A,它們僅能調用其他的static 方法 B,它們只能訪(fǎng)問(wèn)static數據 C,它們不能以任何方式引用this 或super(this涉及到對象,super 與繼承有關(guān)) 示例:如果你需要通過(guò)計算來(lái)初始化你的static變量,你可以聲明一個(gè)static塊。Static 塊僅在該類(lèi)被加載時(shí)執行一次。
下面的例子顯示的類(lèi)有一個(gè)static方法,一些static變 量,以及一個(gè)static 初始化塊。 public class TestNew { static int a = 3; static int b; static void meth(int x){ System.out.println("x = "+x); System.out.println("a = "+a); System.out.println("b = "+b); } static { System.out.println("static block initialized"); b = a*4; } public static void main(String[] args) { // TODO Auto-generated method stub meth(42); } } 執行結果是: static block initialized x = 42 a = 3 b = 12 上述class TestNew的執行順序是:首先,a被設置為3,接著(zhù)static 塊執行(打印一條消息),最后b被初始化為a*4 成12。
然后調用main(),main () 調用meth() ,把值42傳遞給x。3個(gè)println ( ) 語(yǔ)句引用兩個(gè)static變量a和b,以及局部變量x 。
(3)外部使用靜態(tài)變量或者靜態(tài)方法 在定義它們的類(lèi)的外面,static 方法和變量能獨立于任何對象而被使用,你只要在類(lèi)的名字后面加點(diǎn)號運算符即可。可以看到,這種格式與通過(guò)對象引用變量調用非static方法或者變量的格式類(lèi)似。
這就是Java 如何實(shí)現全局功能和全局變量的一個(gè)控制版本。示例: class StaticDemo{ static int a = 42; static int b = 99; static void callme(){ System.out.println("a = "+a); } } public class TestNew { public static void main(String[] args) { // TODO Auto-generated method stub StaticDemo.callme(); System.out.println("b = "+StaticDemo.b); } } 執行結果: a = 42 b = 99 (4)靜態(tài)類(lèi)是指在一個(gè)類(lèi)的內部,又定義了一個(gè)用static修飾的類(lèi)。
那靜態(tài)類(lèi)的功能又體現在哪里呢?可以用C中的結構體內嵌結構體來(lái)理解,其次需要了解2個(gè)概念:內部類(lèi)和靜態(tài)修飾符static。A,首先,用內部類(lèi)是因為內部類(lèi)與所在外部類(lèi)有一定的關(guān)系,往往只有該外部類(lèi)調用此內部類(lèi)。
所以沒(méi)有必要專(zhuān)門(mén)用一個(gè)Java文件存放這個(gè)類(lèi)。 B,靜態(tài)都是用來(lái)修飾類(lèi)的內部成員的。
比如靜態(tài)方法、靜態(tài)成員變量。它唯一的作用就是隨著(zhù)類(lèi)的加載(而不是隨著(zhù)對象的產(chǎn)生)而產(chǎn)生,以致可以用類(lèi)名+靜態(tài)成員名直接獲得。
這樣靜態(tài)內部類(lèi)就可以理解了,它可以直接被用 外部類(lèi)名+內部類(lèi)名 獲得。舉例如下: public class Build { 。
.. public static class VERSION { 。
. public static final String RELEASE = getString("ro.build.version.release"); 。
. } 。
. }。
1。
靜態(tài)方法的特點(diǎn): 直接調用類(lèi)名+方法名,不需要實(shí)例化類(lèi)對象。如: Hello.P();非靜態(tài)方法則必須實(shí)例化一個(gè)對象出來(lái),再通過(guò)對象調用該方法如: Hello hello=new Hello(參數1~n); hello.P();2。
程序被打包成.jar文件后(相當于.exe文件),給外界唯一的接口就是main方法。使用者雙擊.jar文件,其實(shí)就是讓虛擬機執行main方法。
3。main方法不是提供給程序員的,而是提供給虛擬機和使用客戶(hù)的。
一個(gè)軟件你沒(méi)法讓客戶(hù)知道你內部的詳情,當然客戶(hù)也就沒(méi)辦法知道怎么去實(shí)例化對象,更不知道實(shí)例化對象時(shí)需要輸入什么參數了。所以只能采用靜態(tài)方法。
1。靜態(tài)方法的特點(diǎn): 直接調用類(lèi)名+方法名,不需要實(shí)例化類(lèi)對象。
如: Hello.P();
非靜態(tài)方法則必須實(shí)例化一個(gè)對象出來(lái),再通過(guò)對象調用該方法如: Hello hello=new Hello(參數1~n); hello.P();
2。程序被打包成.jar文件后(相當于.exe文件),給外界唯一的接口就是main方法。使用者雙擊.jar文件,其實(shí)就是讓虛擬機執行main方法。
3。main方法不是提供給程序員的,而是提供給虛擬機和使用客戶(hù)的。 一個(gè)軟件你沒(méi)法讓客戶(hù)知道你內部的詳情,當然客戶(hù)也就沒(méi)辦法知道怎么去實(shí)例化對象,更不知道實(shí)例化對象時(shí)需要輸入什么參數了。所以只能采用靜態(tài)方法。
靜態(tài)方法是使用公共內存空間的,就是說(shuō)所有對象都可以直接引用,不需要創(chuàng )建對象再使用該方法。
例如,我創(chuàng )建一個(gè)類(lèi),里面有一個(gè)靜態(tài)方法:
class Test{
public static int z(int xx,int yy){
return xx+yy;
}
public int zz(int xx,int yy){
return xx+yy;
}
}
然后在含有main方法的類(lèi)中使用這個(gè)類(lèi)時(shí),對與以上非靜態(tài)和靜態(tài)方法的引用方式是不同的,如下:
import Test;
public class mainClass{
int sum;
public static void main(String args[]){
sum=Test.z(1,2); //直接用 類(lèi).方法或者屬性就可以使用該方法或屬性。
System.out.println(sum);
Test t=new Test();
sum=t.zz(1,2); //因為zz不是靜態(tài)方法,所以只能只能用Test類(lèi)創(chuàng )建一個(gè)t對象,然后調用該對象的方法。
System.out.println(sum);
}
}
ls他們說(shuō)的也是有道理的,靜態(tài)方法只能被靜態(tài)方法調用。
1。
靜態(tài)方法的特點(diǎn): 直接調用類(lèi)名+方法名,不需要實(shí)例化類(lèi)對象。如: Hello.P();非靜態(tài)方法則必須實(shí)例化一個(gè)對象出來(lái),再通過(guò)對象調用該方法如: Hello hello=new Hello(參數1~n); hello.P();2。
程序被打包成.jar文件后(相當于.exe文件),給外界唯一的接口就是main方法。使用者雙擊.jar文件,其實(shí)就是讓虛擬機執行main方法。
3。main方法不是提供給程序員的,而是提供給虛擬機和使用客戶(hù)的。
一個(gè)軟件你沒(méi)法讓客戶(hù)知道你內部的詳情,當然客戶(hù)也就沒(méi)辦法知道怎么去實(shí)例化對象,更不知道實(shí)例化對象時(shí)需要輸入什么參數了。所以只能采用靜態(tài)方法。
轉:
靜態(tài)方法和實(shí)例方法的區別主要體現在兩個(gè)方面:
在外部調用靜態(tài)方法時(shí),可以使用"類(lèi)名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實(shí)例方法只有后面這種方式。也就是說(shuō),調用靜態(tài)方法可以無(wú)需創(chuàng )建對象。
靜態(tài)方法在訪(fǎng)問(wèn)本類(lèi)的成員時(shí),只允許訪(fǎng)問(wèn)靜態(tài)成員(即靜態(tài)成員變量和靜態(tài)方法),而不允許訪(fǎng)問(wèn)實(shí)例成員變量和實(shí)例方法;實(shí)例方法則無(wú)此限制。
下面幾個(gè)例子展示了這一區別。
1、調用靜態(tài)方法示例。
//-----------文件名hasstaticmethod.java,程序編號1-----------------public class hasstaticmethod{//定義一個(gè)靜態(tài)方法public static void callme(){system.out.println("this is a static method.");}}
下面這個(gè)程序使用兩種形式來(lái)調用靜態(tài)方法。
//-----------文件名invokestaticmethod.java,2-----------------public class invokestaticmethod{public static void main(string args[]){hasstaticmethod.callme(); //不創(chuàng )建對象,直接調用靜態(tài)方法 hasstaticmethod oa = new hasstaticmethod(); //創(chuàng )建一個(gè)對象oa.callme(); //利用對象來(lái)調用靜態(tài)方法}}
程序3.36兩次調用靜態(tài)方法,都是允許的,程序的輸出如下:
this is a static method.this is a static method.
允許不創(chuàng )建對象而調用靜態(tài)方法,是java為了減少程序員調用某些常用方法時(shí)的麻煩,而允許程序員按照傳統的c語(yǔ)言中使用函數的方式來(lái)使用方法。典型的例子是前面某些程序中使用"math.ramdon()"來(lái)獲取隨機數。
2、靜態(tài)方法訪(fǎng)問(wèn)成員變量示例。
//-----------文件名accessmember.java,程序編號3.37-----------------class accessmember{private static int sa; //定義一個(gè)靜態(tài)成員變量private int ia; //定義一個(gè)實(shí)例成員變量//下面定義一個(gè)靜態(tài)方法static void statmethod(){int i = 0; //正確,可以有自己的局部變量sa = 10; //正確,靜態(tài)方法可以使用靜態(tài)變量otherstat(); //正確,可以調用靜態(tài)方法ia = 20; //錯誤,不能使用實(shí)例變量insmethod(); //錯誤,不能調用實(shí)例方法}static void otherstat(){} //下面定義一個(gè)實(shí)例方法 void insmethod(){int i = 0; //正確,可以有自己的局部變量sa = 15; //正確,可以使用靜態(tài)變量ia = 30; //正確,可以使用實(shí)例變量statmethod(); //正確,可以調用靜態(tài)方法}}
本例其實(shí)可以概括成一句話(huà):靜態(tài)方法只能訪(fǎng)問(wèn)靜態(tài)成員,實(shí)例方法可以訪(fǎng)問(wèn)靜態(tài)和實(shí)例成員。之所以不允許靜態(tài)方法訪(fǎng)問(wèn)實(shí)例成員變量,是因為實(shí)例成員變量是屬于某個(gè)對象的,而靜態(tài)方法在執行時(shí),并不一定存在對象。同樣,因為實(shí)例方法可以訪(fǎng)問(wèn)實(shí)例成員變量,如果允許靜態(tài)方法調用實(shí)例方法,將間接地允許它使用實(shí)例成員變量,所以它也不能調用實(shí)例方法。基于同樣的道理,靜態(tài)方法中也不能使用關(guān)鍵字this。
main()方法是一個(gè)典型的靜態(tài)方法,它同樣遵循一般靜態(tài)方法的規則,所以它可以由系統在創(chuàng )建對象之前就調用。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據《信息網(wǎng)絡(luò )傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個(gè)月內通知我們,我們會(huì )及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習?shū)B(niǎo). 頁(yè)面生成時(shí)間:2.714秒