當前位置:首頁 » 編程語言 » java虛函數

java虛函數

發布時間: 2022-12-13 02:15:37

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");
}
}

② java里有虛函數這個概念嗎

沒有,是C++特權,不過跟JAVA抽象類的方法或介面中的方法有一定的相似度,但是有深層次的意義即:動態聯編。也就是在程序的運行階段動態地選擇合適的成員函數

③ 5. 請講一講java析構函數和虛函數的用法和作用。

java沒有析構函數和虛函數,析構函數和虛函數是c++中的。

不過,java中的抽像方法,就相當於c++中的虛函數

④ java中虛函數和虛繼承底層實現有沒有虛表

Java 所有非 final 方法(final class 中的所有方法被視為 final 方法) 的話,它就是 virtual 的,可以被子類覆蓋。在創建對象時類型是 new 語句後面的類型,你調用的方法就優先根據 new 後面的語句類型來找,沒找到就向父類層次中找的。

JVM 中有每個類和其中的每個方法的清單,調用時會去按多態的概念去查找方法。

⑤ 為什麼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中則是根據同名函數的簽名(參數列表/返回值)判斷是否為多態/重載。

⑥ 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!");
}
}

熱點內容
Qt用ftp傳文件 發布:2025-01-22 19:23:28 瀏覽:731
校園卡密碼是什麼 發布:2025-01-22 19:14:43 瀏覽:658
內存大小的存儲 發布:2025-01-22 18:58:17 瀏覽:393
tampermonkey腳本 發布:2025-01-22 18:53:17 瀏覽:117
windows7共享文件夾 發布:2025-01-22 18:53:17 瀏覽:479
如何調節安卓手機的內存 發布:2025-01-22 18:49:30 瀏覽:639
佳能相機存儲卡怎麼取消 發布:2025-01-22 18:40:59 瀏覽:569
天貓寶貝上傳 發布:2025-01-22 18:35:09 瀏覽:545
ipad如何登錄金鏟鏟安卓賬號 發布:2025-01-22 18:32:09 瀏覽:320
加密溝通 發布:2025-01-22 18:31:22 瀏覽:556