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(); //該方法也是對父類中的靜態方法的覆蓋
}
}