public class StaticTest
{
public static void main(String[] args)
{
System.out.println("\n\t\t如何實(shí)現靜態(tài)方法調用非靜態(tài)方法有哪些\n");
//開(kāi)始調用,匿名調用!
new StaticTest().show();
//創(chuàng )建對象調用!
StaticTest st=new StaticTest();
st.show();
}
//非靜態(tài)方法!
void show()
{
System.out.println("非靜態(tài)方法show。..!");
}
}
public class StaticTest { public static void main(String[] args) { System.out.println("\n\t\t如何實(shí)現靜態(tài)方法調用非靜態(tài)方法有哪些\n"); //開(kāi)始調用,匿名調用! new StaticTest().show(); //創(chuàng )建對象調用! StaticTest st=new StaticTest(); st.show(); } //非靜態(tài)方法! void show() { System.out.println("非靜態(tài)方法show。
..!"); }}。
靜態(tài)方法與靜態(tài)變量一樣,屬于類(lèi)本身,而不屬于那個(gè)類(lèi)的一個(gè)對象。
調用一個(gè)被定義為static的方法,可以通過(guò)在它前面加上這個(gè)類(lèi)的名稱(chēng),也可以像調用非靜態(tài)方法一樣通過(guò)類(lèi)對象調用。實(shí)例方法必須通過(guò)類(lèi)的實(shí)例來(lái)使用。
實(shí)例方法可以使用類(lèi)的非靜態(tài)成員,也可以使用類(lèi)的靜態(tài)成員。類(lèi)的靜態(tài)方法,靜態(tài)變量是在類(lèi)裝載的時(shí)候裝載的。
但是要特別注意,類(lèi)的靜態(tài)變量是該類(lèi)的對象所共有的,即是所有對象共享變量。所以建議盡量少用靜態(tài)變量。
盡量在靜態(tài)方法中使用內部變量。 其中static關(guān)鍵字即表示靜態(tài)的。
聲明靜態(tài)方法的語(yǔ)法如下:static返回類(lèi)型 方法名(參數列表){//方法體} 靜態(tài)方法與實(shí)例方法唯一不同的,就是靜態(tài)方法在返回類(lèi)型前加static關(guān)鍵字。靜態(tài)方法的調用有兩種途徑:(1)通過(guò)類(lèi)的實(shí)例對象去調用調用格式為: 對象名.方法名(2) 通過(guò)類(lèi)名直接調用調用格式為: 類(lèi)名::方法名 我們在使用時(shí)要注意:靜態(tài)方法只能訪(fǎng)問(wèn)類(lèi)的靜態(tài)成員,不能訪(fǎng)問(wèn)類(lèi)的非靜態(tài)成員;非靜態(tài)方法可以訪(fǎng)問(wèn)類(lèi)的靜態(tài)成員,也可以訪(fǎng)問(wèn)類(lèi)的非靜態(tài)成員;靜態(tài)方法既可以用實(shí)例來(lái)調用,也可以用類(lèi)名來(lái)調用。
#include 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. 有靜態(tài)屬性的類(lèi),一般會(huì )定義靜態(tài)方法。2. 沒(méi)有屬性的類(lèi),一般會(huì )定義靜態(tài)方法,這樣在使用時(shí),通過(guò)類(lèi)名::方法名即可調用,而不用先定義對象,再調用,這樣可以省去一行代碼。
package com.text_3;
//靜態(tài)方法不能直接調用實(shí)例方法和變量,但可以間接調用(即在靜態(tài)方法中創(chuàng )建類(lèi)的實(shí)例,然后調用)
class Demo_12 {
public static void main(String[] args) {
Circle c=new Circle();
Demo_12 d=new Demo_12();
method1();//此處報錯,靜態(tài)方法不能直接調用非靜態(tài)方法
d.method1(); //間接調用,無(wú)錯
c.setRadius(5.0); //間接調用,無(wú)錯
}
public void method1(){
method2();
}
public static void method2(){
Circle c=new Circle();
System.out.println("what is radius " +c.getRadius());
}
}
class Circle{
private double radius;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
public class Test {
private int a;
public int getnumber() {
setnumber(8);
return this.a;
}
public int setnumber(int a) {
return this.a = a;
}
public static void main(String args[]) {
Test t = new Test();
// t.setnumber(10);
int a = t.getnumber();
System.out.println(a);
}
}
1、靜態(tài)方法屬于類(lèi)所有,類(lèi)實(shí)例化前即可使用;
2、非靜態(tài)方法可以訪(fǎng)問(wèn)類(lèi)中的任何成員,靜態(tài)方法只能訪(fǎng)問(wèn)類(lèi)中的靜態(tài)成員;
3、因為靜態(tài)方法在類(lèi)實(shí)例化前就可以使用,而類(lèi)中的非靜態(tài)變量必須在實(shí)例化之后才能分配內存;
4、static內部只能出現static變量和其他static方法!而且static方法中還不能使用this等關(guān)鍵字,因為它是屬于整個(gè)類(lèi);
5、靜態(tài)方法效率上要比實(shí)例化高,靜態(tài)方法的缺點(diǎn)是不自動(dòng)進(jìn)行銷(xiāo)毀,而實(shí)例化的則可以做銷(xiāo)毀;
6、靜態(tài)方法和靜態(tài)變量創(chuàng )建后始終使用同一塊內存,而使用實(shí)例的方式會(huì )創(chuàng )建多個(gè)內存。
主要區別:靜態(tài)方法在創(chuàng )建對象前就可以使用了,非靜態(tài)方法必須通過(guò)new出來(lái)的對象調用。
如:
public class Per{
public static String getType(){
return "人類(lèi)";
}
public String getName(){
return "張三";
}
}
上面這個(gè)類(lèi)中的getType方法,在沒(méi)有new對象前這就可以這樣用:
String type=Per.getType();//type="人類(lèi)";
而getName方法則不能這樣使用,編譯都不會(huì )通過(guò)
getName必須這樣:
Per p=new Per();
String name=p.getName();//name="張三";
當然,getType方法也可能通過(guò)對象調用:
String type=p.getType();//type="人類(lèi)";
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據《信息網(wǎng)絡(luò )傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個(gè)月內通知我們,我們會(huì )及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習?shū)B(niǎo). 頁(yè)面生成時(shí)間:3.314秒