A. 實例方法可以直接訪問靜態成員
class A { static int b=3,c=4; public int sum() { return c+b; } public static void main(String [] args) { A a=new A(); System.out.println(a.sum()); } }
求採納
B. 在C#中,類的Static成員可以通過該類的實例來引用嗎為什麼
static成員不能用類的實例來引用!只能用類來引用!就好比一個站點的訪問量 整個網站訪問都採用的整個數據,如果張三來了實例化一個站點訪問量,李四來了實例化一個站點訪問量,到底是張三的訪問量正確還是李四的?訪問量這個既不屬於張三,也不屬於李四屬於所有的訪問人員的共有的屬性!
C. 怎麼調用靜態方法
靜態方法不能訪問非靜態的實例變數和實例方法。實例方法可以訪問靜態成員和非靜態成員。
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();
}
}
D. 靜態方法和實例方法的區別
靜態方法和實例方法的區別主要體現在兩個方面:x0dx0a x0dx0a在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有後面這種方式。也就是說,調用靜態方法可以無需創建對象。x0dx0a x0dx0a靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問實例成員變數和實例方法;實例方法則無此限制。x0dx0a x0dx0a下面幾個例子展示了這一區別。x0dx0a x0dx0a1、調用靜態方法示例。x0dx0a x0dx0a//-----------hasStaticMethod.java-----------------x0dx0apublic class hasStaticMethod{x0dx0a//定義一個靜態方法x0dx0apublic static void callMe(){x0dx0aSystem.out.println("This is a static method.");x0dx0a}x0dx0a} x0dx0a下面這個程序使用兩種形式來調用靜態方法。x0dx0a//-----------invokeStaticMethod.java-----------------x0dx0apublic class invokeStaticMethod{x0dx0apublic static void main(String args[]){x0dx0ahasStaticMethod.callMe(); //不創建對象,直接調用靜態方法 x0dx0ahasStaticMethod oa = new hasStaticMethod(); //創建一個對象x0dx0aoa.callMe(); //利用對象來調用靜態方法x0dx0a}x0dx0a} 程序兩次調用靜態方法,都是允許的,程序的輸出如下:x0dx0aThis is a static method.This is a static method. x0dx0a x0dx0a允許不創建對象而調用靜態方法,是Java為了減少程序員調用某些常用方法時的麻煩,而允許程序員按照傳統的C語言中使用函數的方式來使用方法。典型的例子是前面某些程序中使用"Math.ramdon()"來獲取隨機數。x0dx0a還有一個很典型的代表就是數組的處理工具Arraysx0dx0a2、靜態方法訪問成員變數示例。x0dx0a x0dx0a//-----------accessMember.java-----------------x0dx0aclass accessMember{x0dx0aprivate static int sa; //定義一個靜態成員變數x0dx0aprivate int ia; //定義一個實例成員變數x0dx0a//下面定義一個靜態方法x0dx0astatic void statMethod(){x0dx0aint i = 0; //正確,可以有自己的局部變數sa = 10; x0dx0a//正確,靜態方法可以使用靜態變數x0dx0aotherStat(); x0dx0a//正確,可以調用靜態方法x0dx0aia = 20; //錯誤,不能使用實例變數x0dx0ainsMethod(); //錯誤,不能調用實例方法x0dx0a}x0dx0astatic void otherStat(){} x0dx0a//下面定義一個實例方法 x0dx0avoid insMethod(){x0dx0aint i = 0; //正確,可以有自己的局部變數x0dx0asa = 15; //正確,可以使用靜態變數x0dx0aia = 30; //正確,可以使用實例變數x0dx0astatMethod(); //正確,可以調用靜態方法x0dx0a}x0dx0a} x0dx0a本例其實可以概括成一句話:靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變數,是因為實例成員變數是屬於某個對象的,而靜態方法在執行時,並不一定存在對象。同樣,因為實例方法可以訪問實例成員變數,如果允許靜態方法調用實例方法,將間接地允許它使用實例成員變數,所以它也不能調用實例方法。基於同樣的道理,靜態方法中也不能使用關鍵字this。x0dx0a x0dx0amain()方法是一個典型的靜態方法,它同樣遵循一般靜態方法的規則,所以它可以由系統在創建對象之前就調用。x0dx0ax0dx0a希望多多交流,多多關注,共同成就夢想
E. 靜態方法的方法使用
靜態方法與靜態變數一樣,屬於類本身,而不屬於那個類的一個對象。調用一個被定義為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. 沒有屬性的類,一般會定義靜態方法,這樣在使用時,通過類名::方法名即可調用,
而不用先定義對象,再調用,這樣可以省去一行代碼。