㈠ 靜態方法的方法使用
靜態方法與靜態變數一樣,屬於類本身,而不屬於那個類的一個對象。調用一個被定義為static的方法,可以通過在它前面加上這個類的名稱,也可以像調用非靜態方法一樣通過類對象調用。
實例方法必須通過類的實例來使用。實例方法可以使用類的非靜態成員,也可以使用類的靜態成員。
類的靜態方法,靜態變數是在類裝載的時候裝載的。但是要特別注意,類的靜態變數是該類的對象所共有的,即是所有對象共享變數。所以建議盡量少用靜態變數。盡量在靜態方法中使用內部變數。 其中static關鍵字即表示靜態的。聲明靜態方法的語法如下:
<訪問修飾符>static返回類型 方法名(參數列表)
{//方法體} 靜態方法與實例方法唯一不同的,就是靜態方法在返回類型前加static關鍵字。靜態方法的調用有兩種途徑:
(1)通過類的實例對象去調用
調用格式為: 對象名.方法名
(2) 通過類名直接調用
調用格式為: 類名::方法名 我們在使用時要注意:
靜態方法只能訪問類的靜態成員,不能訪問類的非靜態成員;
非靜態方法可以訪問類的靜態成員,也可以訪問類的非靜態成員;
靜態方法既可以用實例來調用,也可以用類名來調用。 #include<iostream>using namespace std;
class CStaticTest{public:CStaticTest(int a){this->a = a;}~CStaticTest(){}
static int add(CStaticTest& c1, CStaticTest& c2){return c1.a + c2.a;}
private:int a;};
int main(){CStaticTest tmp1(1);CStaticTest tmp2(2);int sum1 = tmp1.add(tmp1, tmp2);int sum2 = CStaticTest::add(tmp1, tmp2);
cout << sum1 << endl;cout << sum2 << endl;return 0;} 1. 有靜態屬性的類,一般會定義靜態方法。
2. 沒有屬性的類,一般會定義靜態方法,這樣在使用時,通過類名::方法名即可調用,
而不用先定義對象,再調用,這樣可以省去一行代碼。
㈡ JAVA中使用靜態方法
編程時我們心裡一定要清楚靜態方法和類的非靜態方法方法的區別:
最根本區別從編譯角度來說吧:
1)靜態(static)方法是編譯時直接載入載入到內存中(離cpu最近的一塊內存區域也稱為堆棧),比如程序的public static main(args []){}方法,你能實例話嗎?
靜態方法不能被實例化,也不允許被實例化!
現在很多Java集成工具邊寫邊編譯的
因此 你可以通過「類名」+「.」+「靜態方法的名()」來調用
2)非靜態方法(類的非靜態方法)通過關鍵字 「new」 字來實例化一個對象(object),這個對象放在 內存的另一塊區域 堆(heap)中。
也就是說編譯時,非靜態方法必須先實例化類的一個對象,通過「對象名」+「非靜態方法名()」來調用;
public class Student
{
private String name;
/************************************************************
*下面兩個方法是類的非靜態方法封裝 屬性name,看一下在 main()
*如何調用
************************************************************/
public set(string init_name)
{
this.name = init_name;
}
publc String get()
{
return this.name;
}
//構造函數
public Student(){}
public Student(String init_name)
{
this.name = init_name;
}
//下面是一個靜態方法,看一下它在main()中如何調用
public static void PrintClassName()
{
System.out.print("該類的名字:Student");
}
}
//MainClass類
pubic class MainClass
{
public static void main(args[])
{
//先調用靜態方法,不需要實例化對象
Student.PrintClassName();
//現在調用非靜態方法,一定要實例化對象
Student stu1 = new Student();
stu1.set("Join");
String stu1_name = stu1.get();
}
}
㈢ Java中的靜態方法是什麼
靜態方法是在類中使用staitc修飾的方法,在類定義的時候已經被裝載和分配。
靜態方法為類所有,可以通過對象來使用,也可以通過類來使用。
我們之前一直寫的mian方法仔細看看,它就是一個靜態方法,靜態方法使用如下:
㈣ 靜態方法怎麼調用
先在eclipse中創建一個Java工程文件。並在src下創建demo包,在demo包下創建類DemoClass。創建後的工程目錄如圖。
02
接下來在DemoClass類中添加一個靜態屬性和靜態方法。被static修飾的屬性或方法就是靜態的。
03
對於靜態方法的調用,可以使用調用非靜態方法的方式去調用,即創建一個類的對象,然後再調用靜態方法,具體代碼如下圖。
04
編輯好代碼後,通過java應用程序的方式運行DemoClass.java文件,運行結果如圖2,說明成功調用了靜態方法。
05
不過,上面調用靜態方法的方式是不推薦的。如果使用上面的方式調用靜態方法,在eclipse中,你可以看到下圖的警告,大概的意思是要你使用正確的調用靜態方法的方式去調用該方法。
06
對於靜態方法,正確調用的方式是直接通過類名來調用的。用調用例子中的staticFunction為例,正確調用該方法的代碼為
DemoClass.staticFunction。當用類來調用靜態方法時,可以看到eclipse就不報警告了。
07
再次運行該文件,運行結果和剛剛一樣,說明也成功調用了靜態方法。
08
多說一句,對於靜態屬性的調用,也是用類名+點+靜態屬性的方式來調用的,正常都不會先創建一個對象,然後再通過對象來調用靜態屬性。
㈤ 怎麼調用靜態方法
靜態方法不能訪問非靜態的實例變數和實例方法。實例方法可以訪問靜態成員和非靜態成員。
1在本來中直接調用靜態方法
2可以通過類名來調用該類的靜態方法
3通過實例調用靜態方法
// 外部類,不能是靜態的
public class OuterClass {
// 靜態方法,又稱為類方法,屬於Test類
public static void staticFun() {
}
// 非靜態方法,又稱為實例方法,屬於Test類的具體實例
public void nonStaticFun() {
}
// 靜態內部類,靜態類只能是內部類
public static class StaticInnerClass {
// 靜態方法,屬於StaticInnerClass類
public static void staticFun() {
}
// 非靜態方法,屬於StaticInnerClass類的實例
public void nonStaticFun() {
}
}
// 非靜態內部類,不能有靜態方法
public class NonStaticInnerClass {
// 非靜態方法,屬於NonStaticInnerClass的實例
public void nonStaticFun() {
}
}
// 測試代碼如下:
public static void main(String[] args) {
// 對於靜態方法,使用類直接訪問
OuterClass.staticFun();
StaticInnerClass.staticFun();
// 對於非靜態方法,需要使用類的實例訪問
new OuterClass().nonStaticFun();
new StaticInnerClass().nonStaticFun();
// 對於非靜態內部類,必須創建外部類後才能使用
OuterClass outerClass = new OuterClass();
NonStaticInnerClass nonStaticInnerClass = outerClass.new NonStaticInnerClass();
nonStaticInnerClass.nonStaticFun();
}
}
㈥ 靜態方法怎麼調用
C++中,若類的 方法 前加了static關鍵字,則該方法稱為靜態方法,反之為實例方法。那麼,靜態方法怎麼調用?
C#的類中可以包含兩種方法:靜態方法和非靜態方法。
使用了static 修飾符的方法為靜態方法,反之則是非靜態方法。
靜態方法是一種 特殊的成員方法,它不屬於類的某一個具體的實例,而是屬於類本身。
所以對靜態方法不需要 首先創建一個類的實例,而是採用類名.靜態方法的格式 。
1.static方法是類中的一個成員方法,屬於整個類,即不用創建任何對象也可以直接調用!
static內部只能出現static變數和其他static方法!而且static方法中還不能使用this....等關鍵字..因為它是 屬於整個類!
2.靜態方法效率上要比實例化高,靜態方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。
3.靜態方法和靜態變數創建後始終使用同一塊內存,而使用實例的方式會創建多個內存.
4.C#中的方法有兩種:實例方法,靜態方法. 類的方法代碼只有一份,它們的生命周期和類是一致的.實例方法是通過對象名調用的,靜態方法與類關聯而不是 與對象名關聯.
5.那麼在程序中什麼地方可以利用靜態欄位和靜態構造方法,通常適用於於一些不會經常變化而又頻繁使用的數 據,比如連接字元串,配置信息等,當滿足上面所 說的兩點時,進行一次讀取,以後就可以方便的使用了,同 時也節約了託管資源,因為對於靜態成員,一個靜態欄位只標識一個存儲位置。
對一個類無論創建了多少 個實 例,它的靜態欄位永遠都只有一個副本(副本我理解為只有一塊內存 靜態成員存在於內存,非靜態成員需要實例化才會分配內存,所以靜態成員不能訪問非靜態的成員..因為靜態成員 存在於內存,所以非靜態成員可以直接訪問類中靜態的成員.
公用的處理函數,使用靜態方法應該沒有問題..牽涉 到數據共享,靜態變數的函數要多考慮...靜態變數要小心使用..
靜態方法 原理就是共享代碼段 共享代碼段不會產生任何問題 因為代碼段都是給CPU作為"讀取"用的,除非你進行惡意"修改"運行時的代碼段 所以靜態方法是可以放心使用的
靜態變數 原理就是共享數據段 同上 只要沒有進行"寫入"操作就不會產生問題 但是數據通常都是用於讀和寫 所以靜態變數要注意使用
下面是一個使用靜態方法的例子
復制代碼代碼如下:
class Class1 {
[STAThread]
static void Main(string[] args)
{
int i = MyClass.Add(3,5); //調用靜態方法
Console.WriteLine(i);
}
}
class MyClass
{
public static int Add(int x,int y )
{ return x + y ;
}
㈦ JAVA緙栫▼涓璼tatic鐨勭敤閫斾笌鐢ㄦ硶
1淇楗扮static
1錛夐潤鎬佺被鍙橀噺錛堜慨楗版垚鍛樺彉閲忥級錛
1.Static int data璇鍙ヨ存槑data涓虹被鍙橀噺錛屼負涓涓綾葷殑鍏變韓鍙橀噺錛屾槸鎵鏈夊硅薄鍏變韓鐨勶紝瀹冧笉
灞炰簬浠諱綍瀵硅薄錛屾槸灞炰簬鏁翠釜綾葷殑錛堥潤鎬佹柟娉曚篃鏄涓鏍鳳級銆
2.Static瀹氫箟鐨勬槸涓鍧椾負鏁翠釜綾誨叡鏈夌殑涓鍧楀瓨鍌ㄥ尯鍩熴
3.鍏跺彉閲忓彲浠ラ氳繃綾誨悕鍘昏塊棶錛氱被鍚.鍙橀噺鍚嶏紙涓庨氳繃瀵硅薄寮曠敤璁塊棶鍙橀噺鏄絳変環鐨勶級銆
2錛夐潤鎬佹柟娉曪紙淇楗版柟娉曪級錛
1.Public static void printData(){}錛氳〃鏄庢ょ被鏂規硶涓虹被鏂規硶錛堥潤鎬佹柟娉曪級錛岃塊棶鏄鍦ㄧ紪璇戞湡
瀹屾垚錛屾墽琛屾晥鐜囨瘮杈冮珮銆
2.闈欐佹柟娉曚笉闇瑕佹湁瀵硅薄錛屽彲浠ヤ嬌鐢ㄧ被鍚嶈皟鐢錛堜笉闇瑕佸疄渚嬩篃鍙浠ヨ皟鐢ㄩ潤鎬佹柟娉曪級銆3.闈欐佹柟娉曚腑涓嶈兘璁塊棶綾葷殑闈為潤鎬佹垚鍛橈紝鍖呮嫭鎴愬憳鍙橀噺鍜屾柟娉曪紱鍙鑳借塊棶鏈綾諱腑鐨勯潤鎬
鍙橀噺鍜屽叾瀹冮潤鎬佹柟娉曘傚洜涓烘ゆ椂鏄閫氳繃綾昏皟鐢ㄧ殑錛屾病鏈夊硅薄鐨勬傚康銆傛柟娉曚腑this.data鍜
super.data鏄涓嶅彲鐢ㄧ殑銆
鍘熷洜錛氫粠鏍規湰涓婅達紝闈欐佸彉閲忎笉綆$被鏄鍚﹀疄渚嬪寲閮戒細瀛樺湪錛岃屽疄渚嬪彉閲忓彧鏈夌被瀹炰緥鍖栦簡
鎵嶅瓨鍦ㄣ傜洿鎺ヨ皟鐢ㄩ潤鎬佹柟娉曟椂騫朵笉紜瀹氬疄渚嬪彉閲忔槸鍚﹀瓨鍦ㄣ
4. 涓鑸鎯呭喌涓嬶紝涓繪柟娉曟槸闈欐佹柟娉曪紝鎵浠JVM鍙浠ョ洿鎺ヨ皟鐢ㄥ畠錛屼富鏂規硶涓洪潤鎬佹柟娉曟槸鍥
涓哄畠鏄鏁翠釜杞浠剁郴緇熺殑鍏ュ彛錛岃岃繘鍏ュ叆鍙f椂緋葷粺涓娌℃湁浠諱綍瀵硅薄錛屽彧鑳戒嬌鐢ㄧ被璋冪敤銆
5.闈欐佹柟娉曚笉鑳借瑕嗙洊錛屽傛灉瀛愮被涓鏈夊拰鐖剁被閲嶅悕鐨勯潤鎬佹柟娉曪紝鉶界劧緙栬瘧閫氳繃錛屼絾瀹冨苟
涓嶈兘瀹炵幇澶氭侊紝鎵浠ヤ笉鑳界О浣滆嗙洊銆備緥濡傦細class Super{
static public void show(){System.out.println("in Super");}
}class Sub extends Super{
static public void show(){System.out.println("in Sub");}
}
public class Test {
public static void main(String[] arg) {
Super s = new Sub();
s.show();
}
}
鎵ц岀粨鏋滄槸錛 in Super3錛夐潤鎬佷唬鐮佸潡錛堜慨楗版病鏈夊悕瀛楃殑浠g爜鍧楋級錛
1.鍙琚鎵ц屼竴嬈★紱
2.鍒濆嬪寲鍧楀湪綾昏鍔犺澆鍚庨栧厛琚榪愯岋紝涓嶇$被鏄鍚﹀疄渚嬪寲錛岃屼笖鍙鎵ц岃繖涓嬈
3.浣滅敤錛氫竴鑸鐢ㄦ潵鍒濆嬪寲涓浜涘嶆潅綾誨瀷鐨勯潤鎬佸彉閲忋
4錛夐潤鎬佸唴閮ㄧ被錛堟敞鎰忥細鍙鑳戒慨楗版垚鍛樺唴閮ㄧ被錛夛細
class Out{
public static class Inner{}
}5錛塖tatic閫氬父鐢ㄤ簬Singleton妯″紡寮鍙戱細
Singleton妯″紡(鍗曚緥妯″紡)錛氭槸涓縐嶈捐℃ā寮忥紝楂樹簬璇娉曪紝鍙浠ヤ繚璇佷竴涓綾誨湪鏁翠釜緋葷粺
涓浠呮湁涓涓瀵硅薄銆
1.闂棰樺煙錛
緋葷粺涓浣犻渶瑕佽幏寰楁煇涓綾葷殑鍞涓瀹炰緥錛屾墍鏈夊㈡埛絝瀵瑰畠鐨勮塊棶閮藉皢閫氳繃涓涓鍏鍏辯殑璁塊棶鐐硅幏寰椼
2.瑙e喅鏂規堬細鍒涘緩涓涓綾誨苟浣垮叾
a.瀹氫箟涓涓縐佹湁鐨勬瀯閫犲櫒錛
b.瀹氫箟涓涓縐佹湁銆侀潤鎬佺殑瀹炰緥鍙橀噺鎸囧悜鑷宸(綾誨瀷鏄鑷宸辯殑綾誨瀷)錛
c.瀹氫箟涓涓鍏鏈夈侀潤鎬佺殑璁塊棶鏂規硶getInstance()鐢ㄤ簬榪斿洖璇ョ被鐨勫敮涓瀹炰緥(娉錛
鎳掓眽寮忛渶鍚屾)銆 3.鍒嗙被錛
a.楗挎眽寮忥細鍦ㄧ被瑁呰澆鐨勬椂鍊欏氨榪涜屽疄渚嬪寲錛
b.鎳掓眽寮忥細鍦ㄥ叕鏈夈侀潤鎬佺殑璁塊棶鏂規硶(鍚屾ワ細鐢╯ynchronized淇楗)涓榪涜屽疄渚嬪寲錛
鐢ㄧ殑澶氫竴浜涖 瀹炵幇1錛
public class ConnectionFactory{
private static Connection conn;
private Connection(){
if(conn==null)
conn = new Connction();
}
public Connection getInstance(){
return conn;
}
}瀹炵幇2錛
public class ConnectionFactory{
private static Connection conn;
static{
conn = new Connection();
}
public static Connection getInstance(){
return conn;
}
}