導航:首頁 > 知識科普 > java靜態方法怎麼實現多態

java靜態方法怎麼實現多態

發布時間:2022-08-01 14:08:36

❶ java多態性問題

java繼承里,如果子類與父類有同名的成員變數、靜態變數、靜態方法,不會發生覆蓋,調用誰的就是誰的,而普通方法會發生重寫,這時候調用的就是子類的方法

❷ Java語言中靜態多態性可以在非靜態成員方法上實現嗎

非靜態成員是屬於對象的,每個對象的同一成員值並不一定相同,在內存中也存儲在不同的地址,因此此對象的成員A,不同於彼對象的成員A。 那麼問題來了:靜態的方法不和對象綁定,無法確知要訪問哪個對象的成員。this關鍵字代表當前對象本身,在這里代表了當前的類,而this()則是調用當前類的默認構造方法 就是不帶參數的構造方法。 所以2者是不同的。 你可以訪問 this.變數 this.方法 但this()只不過是調用了構造方法 首先static的成員是在類載入的時候初始化的,而非static的成員是在創建對象的時候,即new 操作的時候才初始化的。 相對而言,非static的成員都是程序開始運行以後 晚一點再動態創建的。 所以程序載入順序就是 先生成各種靜態的變數和方法 再根據代碼創建其他的 所以如果你靜態的方法去訪問非靜態的成員。那程序載入這個靜態方法去訪問的成員根本沒創建。這就錯了。
靜態方法不可以調非靜態全局變數,從內存的角度看,就是當類被載入的時候靜態方法和靜態屬性(全局靜態變數)被載入到內存中,就是在內存中開辟一段內存地址用來保存靜態方法和靜態屬性,這時候沒有被實例化的類在內存中是不存在的,所以靜態方法是不能訪問非靜態的全局變數,在類被實例化的時候,就是new 某個類的時候,在內存中給這個類開辟一些內存空間保存這個類的對象,這個時候就可以用靜態方法去訪問非靜態的全部變數。

❸ 在JAVA中有兩種多態指的是什麼

在JAVA中有兩種多態是指:運行時多態和編譯時多態。

關於類的多態性簡介如下:

多態(polymorphism)意為一個名字可具有多種語義.在程序設計語言中,多態性是指」一種定義,多種實現」.例如,運算符+有多種含義,究竟執行哪種運算取決於參加運算的操作數類型:

1+2 //加法運算符

「1」 + 「2」 //字元串連接運算,操作數是字元串

多態性是面向對象的核心特徵之一,類的多態性提供類中成員設計的靈活性和方法執行的多樣性.

1、類多態性表現

(1)方法重載

重載表現為同一個類中方法的多態性.一個類生命多個重載方法就是為一種功能提供多種實現.編譯時,根據方法實際參數的數據類型\個數和次序,決定究竟應該執行重載方法中的哪一個.

(2)子類重定義從父類繼承來的成員

當子類從父類繼承來的成員不適合子類時,子類不能刪除它們,但可以重定義它們,使弗雷成員適應子類的新需求.子類重定義父類成員,同名成員在父類與子類之間表現出多態性,父類對象引用父類成員,子類對象引用子類成員,不會產生沖突和混亂.

子類可重定義父類的同名成員變數,稱子類隱藏父類成員變數.子類也可以重定義父類的同名成員方法,當子類方法的參數列表與父類方法參數列表完全相同時,稱為子類方法覆蓋(override)父類方法。覆蓋父類方法時,子類方法的訪問許可權不能小於父類方法的許可權。

由於Object類的equals()方法比較兩個對象的引用是否相等而不是值是否相等,因此一個類要覆蓋Object類的equals()方法,提供本類兩個對象比較相等方法.

覆蓋表現為父類與子類之間方法的多態性.java 尋找執行方法的原則是:從對象所屬的類開始,尋找匹配的方法執行,如果當前類中沒有匹配的方法,則逐層向上依次在父類或祖先類中尋找匹配方法,直到Object類.

2、super 引用

在子類的成員方法中,可以使用代詞super引用父類成員.super引用的語法如下:

super([參數列表]) //在子類的構造方法體中,調用父類的構造方法

super.成員變數 //當子類隱藏父類成員變數時,引用父類同名成員變數

super.成員方法([參數列表]) //當子類覆蓋父類成員方法時,調用父類同名成員方法

*注意:super引用沒有單獨使用的語法

3、多態性有兩種:

1)編譯時多態性

對於多個同名方法,如果在編譯時能夠確定執行同名方法中的哪一個,則稱為編譯時多態性.

2)運行時多態性

如果在編譯時不能確定,只能在運行時才能確定執行多個同名方法中的哪一個,則稱為運行時多態性.

方法覆蓋表現出兩種多態性,當對象獲得本類實例時,為編譯時多態性,否則為運行時多態性,例如:

XXXX x1 = new XXXX(參數列表); //對象獲得本類實例,對象與其引用的實例類型一致

XXX xx1 = new XXX(參數列表);

x1.toString(); //編譯時多態性,執行XXX類的方法.

xx1.toString(); //編譯時多態性,執行XXXX類覆蓋的方法.

XXXX為XXX的父類.

由於子類對象既是父類對象,父類對象與子類對象之間具有賦值相容性,父類對象能夠被賦值為子類對象.例如,

XXXX x2 = new XXX(參數列表); //父類對象獲得子類實例,子類對象即是父類對象

x2.toString(); //運行時多態

x2聲明為父類對象卻獲得子類XXX的實例,那麼x2.toString()究竟執行父類方法還是執行子類覆蓋的方法呢?

這分為兩種情況:

取決於子類是否覆蓋父類方法.如果子類覆蓋父類方法,則執行子類方法;

如果沒有覆蓋,則執行父類方法.

在編譯時,僅僅依據對象所屬的類,系統無法確定到底應該執行那個類的方法,只有運行時才能確定,因此這是運行時多態.

父類對象並不能執行所有的子類方法,只能執行那些父類中聲明\子類覆蓋的子類方法.

❹ 求詳解java中的介面與多態

多態是面向對象的核心之一,面向介面編程也是以面向對象編程為核心。
介面就是一種規范,我們平時編程要融入生活,比如說電腦的主板,上面有很多介面,插CPU得介面只要插上CPU就可以工作,不管它是哪個廠家生產的CPU,不管它內部如何工作,只要是CPU就可以用。好比你寫個介面,裡面有個fly方法,實現此介面的類都要實現這個方法,至於你如何飛是你的問題,不管你用翅膀飛,還是騎掃把飛,只要實現』fly飛『就可以。
上面是讓你將編程融入生活,說說編程的東西。
多態就是父類或者介面的引用指向子類的對象的情況。比如child類 extends Fahter類
那麼可以Father f=new Child(); 如果一段代碼可以用父類運行,當換成子類時,功能不變,那麼就是多態。多態主要一定要記得兩段話,編譯時看引用,運行時看對象。這句話的意思是在IDE編譯階段,你用f點出來的方法(f.這里會提示Father類有得實例方法)都是Fahter類自己有得,而Child類里自己有得方法不會被自動提示出來。但是如果子類重寫父類的方法了(重寫:就是子類定義了一個與父類一模一樣的方法,只是方法體不同),運行時還要看後面new出來的是誰,new Child();那麼執行要執行Child類重寫的方法體,這樣做的好處是我可以在一個方法里寫f.fly();(比如Father和Child都有fly方法)
public void test(Father f){
f.fly();
} 在這樣的代碼下 我裡面代碼不用動,但是可以讓f.fly()效果不同,因為我傳進去的子類對象可以不同,比如test(new Child1()); test(new Child2()); test(new Child3());然而這三個子類裡面的fly都有自己的具體實現,這就是多態的表現,同一個引用調用同一個方法而表現出多種狀態。介面換成父類是一樣的。 再有不懂得地方追問。 呵呵

❺ Java中靜態方法不具有多態性

對靜態方法的調用不存在任何動態的分派機制。當一個程序調用了一個靜態方法,要被調用的方法都是在編譯時就被選定的,即調用哪個方法是根據該引用被聲明的類型決定的。

❻ Java靜態多態性和動態多態性有何區別

靜態多態性指的是程序在編譯時,系統就能決定調用哪個函數,如重載。
動態多態性指在運行中才能動態確定操作指針所指的對象,主要通過虛函數和重寫來實現。
java 的多態機制遵循一個原則:當父類對象引用變數引用子類對象時,被引用對象的類型而不是引用變數的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法
概念理解起來有點抽象。還是看個例子吧。
靜態多態性:
add(int a);
add(int a,int b);
add(double a);
add(double a,double b);

動態多態性
public class A{ }

public class AB extends A{ }

public class AC extends A{ }

public class test{
go(A a);

❼ Java程序如何實現多態

多態,就是重載和重寫.重載發生在一個類中.重寫發生在子類,意思就是子類重寫父類相同名稱的方法.剛學語言有的東西,不必搞得那麼清楚,只有知道怎麼用就行了,有的問題你要想真正把它搞得很懂,短時間是不可能的,比如說介面,沒有幾年工作經驗你根本不可能真正理解什麼是介面,甚至有的人工作四,五年也沒搞明白什麼是介面,不要花太多時間去搞這些不容易搞懂的問題.
重載的特性,方法名相同.返回類型,傳入方法的參數不同(包括個數和類型).
重寫的特性,方法名相同,返回類型,參數均相同,必須發生在子類.

1.Java語言允許某個類型的引用變數引用子類的實例,而且可以對這個引用變數進行類型轉換。
Animal animal=new Dog(); //引用變數animal引用一個Animal子類Dog的實例
Dog dog=(Dog)animal; //向下轉型,把Animal類型轉換為Dog類型
Creature creature=animal; //向上轉型,把Animal類型轉換為 Creature類型
animal=new Cat(); //引用變數animal引用另一個Animal子類Cat的實例
註:Creature這里指的是生物。

2.如果把引用變數轉換為子類類型,稱為向下轉型,如果把引用變數轉換為父類類型,稱為向上轉型。

3.在進行引用變數的類型轉換時,會受到各種限制。而且在通過引用變數訪問它所引用的實例的靜態屬性、靜態方法、實例屬性、實例方法,以及從父類中繼承的方法和屬性時,Java虛擬機會採用不同的綁定機制。

4.成員變數、靜態方法按照引用變數聲明的類型靜態綁定;實例方法按照引用變數引用的實例動態綁定。
例如,對於以下這段代碼:
Fathers f=new Sons();
System.out.println(「f.var=」+f.var);
System.out.println(「f.staticVar=」+f.staticVar);
f.method();
f.staticMethod();
運行時將會輸出如下結果:
f.var=FatherVar
f.staticVar=StaticFaterVar
Son method
Static Father method

class Fathers{
String var="FatherVar";
static String staticVar="StaticFatherVar";
void method(){System.out.println("Father method");}
static void staticMethod(){System.out.println("Static Father method");}
}

class Sons extends Fathers{
String var="SonVar";
static String staticVar="StaticSonVar";

void method(){System.out.println("Son method");}
static void staticMethod(){System.out.println("Static Son method");}

String sonVar=null;
void sonMethod(){}
}

❽ Java 為什麼靜態的方法不會有多態行為

Java中,多態有兩種方式: 重載和重寫
重載是發生同一個類內,方法同名,但參數不同
重寫則發生在子類內,靜態方法是屬於類方法,由類直接調用,子類無法調用父類的靜態方法
靜態方法可以重載,不可以重寫,因此是有多態的

閱讀全文

與java靜態方法怎麼實現多態相關的資料

熱點內容
男士怎麼能瘦下來的方法 瀏覽:734
信息系統需求分析方法 瀏覽:139
用項目管理的方法分析電影 瀏覽:870
霧化葯圖片使用方法w 瀏覽:467
地腳螺栓簡易安裝方法 瀏覽:248
cnmr是什麼檢測方法 瀏覽:229
目前發達國家治癌方法是哪些 瀏覽:817
如何控制類風濕方法 瀏覽:922
葡萄量筒測量方法 瀏覽:995
統計研究運用各種方法 瀏覽:283
尋找研究生碩士老師的方法 瀏覽:704
蘋果平板按鍵音在哪裡設置方法 瀏覽:379
快速減小腿肚的方法 瀏覽:143
牛排肉怎麼腌制的方法 瀏覽:880
油性指甲油凝固解決方法 瀏覽:263
杜仲茶的功效與作用及食用方法 瀏覽:816
壓小胯訓練方法 瀏覽:548
蘋果手機相機有水印功能在哪裡設置方法 瀏覽:86
空氣開關常見故障及解決方法 瀏覽:174
騎自行車是鍛煉身體的好方法英文 瀏覽:948