方法的多態(tài)static理解 要強(qiáng)調(diào)的是,,多態(tài)性只發(fā)生于方法,而不發(fā)生于域.并且,對(duì)于方法,只有那些非static與非final方法才具有多態(tài)性.
這里討論的是static方法不能發(fā)生多態(tài).值得注意的是,所謂的static方法不能多態(tài)指的是:override的方法本身是不是static的,,而不是指調(diào)用override方法的方法是不是static的!比如以下程序: class Father { public void act() { System.out.println("Father.act()"); } }
class Son extends Father { public void act() { System.out.println("Son.act()"); } } public class Test { public static void test(Father i) { //static方法 i.act(); } public static void main(String[] a) { Son son = new Son(); test(son);
} } //輸出結(jié)果為:Son.act(),如果static不能多態(tài),那結(jié)果不就應(yīng)該是Father.act()嗎?
其實(shí),就象上面說的.我們要考慮的是 的act()方法是不是static,有沒有多態(tài),,而不是調(diào)用的方法(test())是不是static的 這跟test方法是否static無關(guān),,若把兩個(gè)act方法都修改成static,則輸出結(jié)果就是Father.act(),因?yàn)閟tatic 方法不能多態(tài)
static方法(與隱式static方法)
static方法就是沒有this的方法.在static方法的內(nèi)部不能調(diào)用非靜態(tài)方法,反過來,非靜態(tài)方法倒是可以調(diào)用static方法. !!! 值得注意的是:這里說的是在static方法內(nèi)部,不能直接調(diào)用非static方法,但可以通過生成對(duì)象來調(diào)用非靜態(tài)方法. 在static方法內(nèi)部,也不可以調(diào)用非static變量,其實(shí)道理很簡(jiǎn)單,因?yàn)閟tatic是面向全局的,相當(dāng)于全局方法,不可能只針對(duì)某個(gè)類中的一般變量而使用.
在static與非static方法內(nèi)部都不能聲明static變量.(全局變量),因?yàn)?在方法內(nèi)聲明的變量都是局部變量,不可能在里面定義一個(gè)全局變量.
=====了解上面的知識(shí)后,你可能會(huì)發(fā)現(xiàn)有一個(gè)特例:在編程思想第四版P157上,(還有很多地方都曾經(jīng)說過)構(gòu)造器隱式的就是static的!然而在構(gòu)造器內(nèi)部為什么可以直接調(diào)用非靜態(tài)方法?? static方法就是沒有this的方法.在static方法的內(nèi)部不能調(diào)用非靜態(tài)方法,反過來,非靜態(tài)方法倒是可以調(diào)用static方法. !!! 值得注意的是:這里說的是在static方法內(nèi)部,不能直接調(diào)用非static方法,但可以通過生成對(duì)象來調(diào)用非靜態(tài)方法. 在static方法內(nèi)部,也不可以調(diào)用非static變量,其實(shí)道理很簡(jiǎn)單,因?yàn)閟tatic是面向全局的,相當(dāng)于全局方法,不可能只針對(duì)某個(gè)類中的一般變量而使用.
在static與非static方法內(nèi)部都不能聲明static變量.(全局變量),因?yàn)?在方法內(nèi)聲明的變量都是局部變量,不可能在里面定義一個(gè)全局變量.
=====了解上面的知識(shí)后,你可能會(huì)發(fā)現(xiàn)有一個(gè)特例:在編程思想第四版P157上,(還有很多地方都曾經(jīng)說過)構(gòu)造器隱式的就是static的!然而在構(gòu)造器內(nèi)部為什么可以直接調(diào)用非靜態(tài)方法?? 所謂顯式隱式static,,是指類在實(shí)例化時(shí),,系統(tǒng)會(huì)執(zhí)行的代碼 比如 public class StaticTest { { //這樣沒有static關(guān)鍵字的,,叫隱式static,,系統(tǒng)執(zhí)行完顯式static后會(huì)接著執(zhí)行隱式static的代碼 System.out.println("hide static"); show(); // 這個(gè)方法不是static的,,但是在這里不會(huì)出錯(cuò) } static { //這樣有static關(guān)鍵字的叫顯式static,,系統(tǒng)會(huì)先執(zhí)行顯式static的代碼 System.out.println("static"); //show(); //這個(gè)方法不是static的,所以會(huì)出錯(cuò) } public StaticTest() { //執(zhí)行完顯式和隱式static后,,系統(tǒng)會(huì)執(zhí)行構(gòu)造器的代碼,,因?yàn)闃?gòu)造器沒有static,但也會(huì)被執(zhí)行,,跟隱式static一樣,,所以書上就把它說成隱式static了 System.out.println("constuctor"); } public void show() { System.out.println("show"); } public static void main(String[] args) { new StaticTest(); } }
所以所謂顯式隱式static,,只是對(duì)于類實(shí)例化執(zhí)行代碼的先后順序而言的,從某種意義上說,,不帶static的都可以叫隱式static,,隱式static可以調(diào)用隱式static
|