1. 程式人生 > >java 靜態(static)方法與非靜態方法

java 靜態(static)方法與非靜態方法

1、靜態方法中可以引用靜態方法和靜態變數,不可以引用非靜態方法與變數。

 這很好理解:因為靜態方法不需要例項化類,可以直接用(類名.方法名)的方式呼叫。 假設靜態方法可以操作非靜態方法與變數,那麼對於(類名.方法名)的這種方法呼叫方式, 那麼其中的非靜態變數就沒有被例項化。(我們知道靜態變數是不需要例項化的)。   老師上課的時候講因為靜態方法中沒有this指標。

2、非靜態方法中可以引用靜態方法和靜態變數(可以直接呼叫訪問本類靜態方法),也可以引用非靜態方法與變數(可以直接呼叫訪問本類非靜態方法 )。

(1).類名.靜態方法名或物件.方法名(在本類時。直接呼叫靜態方法)

(2).物件名.非靜態方法名

(3).靜態方法在訪問本類的成員時,只允許訪問靜態方法,不能訪問非靜態的方法,儘管非靜態的方法內部又呼叫了靜態的方法

public class StaticMethod {
 //定義一個非靜態方法
 public void callMe2()
 {
  System.out.println("This is a nonstatic method");
 }
 //定義一個靜態方法
 public static void callMe()  //靜態方法
 {
  System.out.println("This is a static method");
 }
 public void Test(){
  callMe();         //正確,可以直接呼叫訪問本類靜態方法
  callMe2();        //正確,可以直接呼叫訪問本類非靜態方法 
  StaticMethod.callMe();  //呼叫靜態物件無需建立物件,可以直接用“類名。方法名”訪問
  StaticMethod mob=new StaticMethod();
  mob.callMe2();      //呼叫非靜態的使用“物件。方法名”訪問
 }
 public static void main(String[] args){
  StaticMethod.callMe();     //靜態方法在訪問本類的成員時,只允許訪問靜態方法,在靜態方法中不能呼叫非靜態的方法和引用非靜態的成員變數
  callMe();   //正確,可以直接呼叫訪問本類靜態方法                
  //callMe2(); //靜態方法在訪問本類的成員時,只允許訪問靜態方法,所以不能直接訪問callMe2();因為callMe2()是非靜態的。  
  StaticMethod oa=new StaticMethod();
  oa.Test(); //靜態方法在訪問本類的成員時,只允許訪問靜態方法,Test是非靜態的,儘管Test內部又呼叫了靜態的CallMe()
 }  

}

class  Run{
 public void RunTest(){
//  callMe();          //錯誤
//  callMe2();         //錯誤
  StaticMethod.callMe();       //呼叫靜態物件無需建立物件,可以直接用“類名。方法名”訪問
  //StaticMethod.callMe2();    //錯誤
  StaticMethod ob=new StaticMethod();//呼叫非靜態物件要先例項化物件
  ob.callMe2();       //呼叫非靜態的使用“物件。方法名”訪問
 }
 public static void Run_main(String[] args){
  StaticMethod.callMe();      //靜態方法在訪問本類的成員時,只允許訪問靜態方法,在靜態方法中不能呼叫非靜態的方法和引用非靜態的成員變數
  //StaticMethod.callMe2();    //靜態方法在訪問本類的成員時,只允許訪問靜態方法,所以不能直接訪問callMe2();因為callMe2()是非靜態的。
  StaticMethod oa=new StaticMethod();
  oa.callMe();                //呼叫靜態物件無需建立物件,可以直接用“類名。方法名”訪問,也可以使用“物件。方法名”訪問
  oa.callMe2();     //呼叫非靜態的使用“物件。方法名”訪問
  oa.Test();      //靜態方法在訪問本類的成員時,只允許訪問靜態方法,Test是非靜態的,儘管Test內部又呼叫了靜態的CallMe()
 }  
}


3、子類不能重寫父類的靜態方法,但可以宣告與該靜態方法相同的方法,從而將父類的靜態方法隱藏。

這讓我聯想起了記下的一個關於private 方法的經驗

public class ClassA {
	private void method1(){
		System.out.println("called ClassA's method1!!!");
	}
    static void method2(){
    	System.out.println("called ClassA's method2!!!");
    }
}
class SubClassA extends ClassA{
	
	void method1(){
		System.out.println("called Sub's method1!!!");
		
	}
	static void method2(){
		System.out.println("called Sub's method1!!!");
	}
	public static void main(String args[]){
	SubClassA a=new SubClassA();
	a.method1();  //SubClassA類中無法呼叫父類的method1,因為該方法為私有(private)
	a.method2();  //該方法也是對父類中的靜態方法的覆蓋
	}
	
}