當前位置:首頁 » 編程語言 » java的虛方法

java的虛方法

發布時間: 2022-07-03 19:22:14

A. java中如何實現類似c++里的虛函數的方法

你說的是多態吧?java繼承之後就具有多態特性了,只需重寫父類方法就可以了,運行時會自動根據對象類型調用正確的方法的,這得益於java聲明變數(除基本變數外)時是基於引用的。
C++的虛函數是為了方便基類指針和引用能夠指向子類對象,從而根據指向的對象類型(而不是根據指針和引用類型)調用對象的方法。(這是C++的多態,由於C++中聲明普通變數與聲明指針和引用是不同的,所以才要這么做)

B. java的虛方法和重寫

C#的Virtual Function概念是從C++來的。對像我這樣直接學java的人來說,不是個好理解的東西,而且和java的面向對象有沖突。java里沒有類似的關鍵字。java的多態有兩個重要概念:overriding(重寫)和overloading(重載)。注意,不是關鍵字。順便說一下,上面有個匿名的朋友把這兩個搞混了,函數名相同、參數類型不同的是overloading,而且和返回類型無關。按我的理解是,你可以認為java里所有被overriding的方法都是virtual的,所有重寫的方法都是override的。舉個例子。class A { void func() { System.out.println("func in A"); }}class B extends A { void func() { System.out.println("func in B"); }}有這樣兩個類,執行下面的代碼會發現,和C#里加了virtual、override的效果相同。A a = new A();A b = new B();a.func();// 這里輸出func in Ab.func();// 這里輸出func in B

C. 關於java抽象方法

下面是抽象方法聲明時採用的語法:abstract void f();
如果從一個抽象類繼承,而且想生成新類型的一個對象,就必須為基礎類中的所有抽象方法提供方法定義。如果不這樣做(完全可以選擇不做),則衍生類也會是抽象的,而且編譯器會強迫我們用abstract 關鍵字標志那個類的「抽象」本質。即使不包括任何abstract 方法,亦可將一個類聲明成「抽象類」。如果一個類沒必要擁有任何抽象方法,而且我們想禁止那個類的所有實例,這種能力就會顯得非常有用。
在面向對象的概念中,我們知道所有的對象都是通過類來描繪的,但是反過來卻不是這樣。並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
抽象類往往用來表徵我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如:如果我們進行一個圖形編輯軟體的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬於形狀這樣一個概念,形狀這個概念在問題領域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表徵抽象概念的抽象類是不能夠實例化的。在面向對象領域,抽象類主要用來進行類型隱藏。我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。模塊可以操作一個抽象體。由於模塊依賴於一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴展此模塊的行為功能。熟悉OCP的讀者一定知道,為了能夠實現面向對象設計的一個最核心的原則OCP(Open-Closed Principle),抽象類是其中的關鍵所在。

D. 為什麼Java中的函數默認是虛擬函數

其實這個主要還是C#的問題而非Java問題。 多態的實現就是靠後綁定。當從父類中繼承的時候,虛函數和被繼承的函數具有相同的簽名。在運行期間根據情況(參數,返回值)決定調用函數的入口地址。 Java中「所有函數默認為虛函數」,也就是說所有的方法(除final)默認都是可以繼承的。 java代碼class A {public void func() { System.out.println(A);}} class B extends A { public void func() { System.out.println(B);}} class C extends A {} class Test { public static void main(String[] args) { A a = new A(); A b = new B(); A c = new C(); a.func(); //A b.func(); //B c.func(); //A}}C#代碼usingSystem;namespaceSouthWolf{classA{publicvirtualvoidFunc(){Console.WriteLine(A);}}classB:A{publicoverridevoidFunc()//注意override,表明重新實現了虛函數{Console.WriteLine(B);}}classC:B{}classD:A{publicnewvoidFunc()//注意new,表明覆蓋父類里的同名方法,而不是重新實現{Console.WriteLine(D);}}classprogram{staticvoidMain(){Aa;Ab;Ac;Ad;a=newA();b=newB();c=newC();d=newD(); a.Func();//執行a.Func:1.先檢查申明類A2.檢查到是虛擬方法3.轉去檢查實例類A,就為本身4.執行實例類A中的方法5.輸出結果A b.Func();//執行b.Func:1.先檢查申明類A2.檢查到是虛擬方法3.轉去檢查實例類B,有重載的4.執行實例類B中的方法5.輸出結果B c.Func();//執行c.Func:1.先檢查申明類A2.檢查到是虛擬方法3.轉去檢查實例類C,無重載的4.轉去檢查類C的父類B,有重載的5.執行父類B中的Func方法5.輸出結果B d.Func();//執行d.Func:1.先檢查申明類A2.檢查到是虛擬方法3.轉去檢查實例類D,無重載的(這個地方要注意了,雖然D里有實現Func(),但沒有使用override關鍵字,所以不會被認為是重載)4.轉去檢查類D的父類A,就為本身5.執行父類A中的Func方法5.輸出結果ADd1=newD();d1.Func();//執行D類里的Func(),輸出結果FuncInD Console.ReadLine();}}} 1、當調用一個對象的函數時,系統會直接去檢查這個對象申明定義的類,即申明類,看所調用的函數是否為虛函數; 2、如果不是虛函數,那麼它就直接執行該函數。而如果有virtual關鍵字,也就是一個虛函數,那麼這個時候它就不會立刻執行該函數了,而是轉去檢查對象的實例類。 3、在這個實例類里,他會檢查這個實例類的定義中是否有重新實現該虛函數(通過override關鍵字),如果是有,那麼OK,它就不會再找了,而馬上執行該實例類中的這個重新實現的函數。而如果沒有的話,系統就會不停地往上找實例類的父類,並對父類重復剛才在實例類里的檢查,直到找到第一個重載了該虛函數的父類為止,然後執行該父類里重載後的函數。 Java中則是根據同名函數的簽名(參數列表/返回值)判斷是否為多態/重載。

E. Java語言的虛函數是怎麼樣的

java中並沒有virtual關鍵字指示一個函數就是虛函數,java中的普通函數就相當於C++中的虛函數,抽象函數相當於C++中的純虛函數。


publicclassDemo2{
publicstaticvoidmain(String[]args){

Parentp=newChild();
p.print();
p.func1();
}
}

abstractclassParent{

//抽象函數
publicabstractvoidprint();

//普通函數
publicvoidfunc1(){
System.out.println("Parentfunc1");
}
}

classChildextendsParent{

//實現抽象函數
publicvoidprint(){
System.out.println("Child");
}

//覆蓋父類的func1函數
publicvoidfunc1(){
System.out.println("Childfunc1");
}
}

F. java裡面有虛方法么

java中沒有明確說明什麼是虛方法;
虛方法是C++來的
java虛方法你可以理解為java里所有被overriding的方法都是virtual的,所有重寫的方法都是override的
class Program
{
static void Main(string[] args)
{

Person p = new Person("test1");
p = Person.Find("Aseven");
int Age = p.GetAge();
p.Say();
Console.ReadKey();

}
}
public class Person
{
private string _name;
private int _age;

public string Name
{
get { return _name; }
set { _name = value; }
}
public virtual void Say()
{
Console.WriteLine("******");
}
public static Person Find(string name)
{
return new Chinese(name);//模擬資料庫查找
}
public int GetAge()
{
return _age;
}
public Person() { }
public Person(string name)
{
this._name = name;
}
}

public class Chinese : Person
{
public Chinese(string name)
{
this.Name = name;
}
public override void Say()
{
Console.WriteLine("你好!");
}
}
public class American : Person
{
public American(string name)
{
this.Name = name;
}
public override void Say()
{
Console.WriteLine("Hello!");
}
}

G. Java函數為什麼默認是虛函數

虛函數的存在是為了多態。

以C++與Java比對說明:
C++中普通成員函數加上virtual關鍵字就成為虛函數。
Java中其實沒有虛函數的概念,它的普通函數就相當於C++的虛函數,動態綁定是Java的默認行為。如果Java中不希望某個函數具有虛函數特性,可以加上final關鍵字變成非虛函數。

總結:java在最大限度地保留了面向對象三要素(封裝、繼承、多態)的基礎上,盡最大努力講語法進行簡化。C++為實現多態需要額外的關鍵字,而Java則直接提供了這種機制,是的封裝、繼承和多態變得更加容易使用。

H. JAVA中,有沒有虛方法的概念,還是C#的概念

java沒有虛方法的概念的,c#中有虛方法,是從c++過來的,虛方法在c#中是實現多態的一種方式而已,java中實現多態使用的是跟c#中一樣的抽象方法。當然重載也是多態的一種,希望能幫到你~

熱點內容
安裝linuxoracle11g 發布:2024-04-20 22:29:02 瀏覽:532
android設置權重 發布:2024-04-20 22:20:08 瀏覽:724
什麼手機安卓系統80 發布:2024-04-20 21:37:29 瀏覽:379
浙江萬里的伺服器地址 發布:2024-04-20 21:16:59 瀏覽:407
ndklinux下載 發布:2024-04-20 21:05:22 瀏覽:566
王者榮耀解壓資源包97 發布:2024-04-20 20:46:10 瀏覽:397
蘋果手機沒有密碼怎麼打開 發布:2024-04-20 20:45:25 瀏覽:93
如何用濃硝酸配置百分之2的硝酸 發布:2024-04-20 20:44:39 瀏覽:797
微信商城java源碼下載 發布:2024-04-20 20:27:35 瀏覽:121
用友軟體sql 發布:2024-04-20 20:10:01 瀏覽:933