java虛方法
① java里有虛函數這個概念嗎
Java裡面的普通函數對應的就是C++裡面的虛函數。
Java裡面的抽象方法對應的是C++裡面的純虛函數。
② Java中的虛擬方法virtual method是什麼含義
虛方法就是沒實現的方法, 用在父類,為某一類對象定義統一的行為。
應該叫抽象方法才對。
③ Java虛方法是什麼
虛函數必須是基類的非靜態成員函數,其訪問許可權可以是protected或public,在基類的類定義中內定義虛函數的容一般形式:
virtual 函數返回值類型 虛函數名(形參表)
{ 函數體 }
虛函數的作用是實現動態聯編,也就是在程序的運行階段動態地選擇合適的成員函數。
純虛函數沒有函數體。
④ Java函數為什麼默認是虛函數
虛函數的存在是為了多態。
以C++與Java比對說明:
C++中普通成員函數加上virtual關鍵字就成為虛函數。
Java中其實沒有虛函數的概念,它的普通函數就相當於C++的虛函數,動態綁定是Java的默認行為。如果Java中不希望某個函數具有虛函數特性,可以加上final關鍵字變成非虛函數。
總結:java在最大限度地保留了面向對象三要素(封裝、繼承、多態)的基礎上,盡最大努力講語法進行簡化。C++為實現多態需要額外的關鍵字,而Java則直接提供了這種機制,是的封裝、繼承和多態變得更加容易使用。
⑤ 為什麼Java中的函數默認是虛擬函數
虛函數的存在是為了多態。
以C++與Java比對說明:
C++中普通成員函數加上virtual關鍵字就成為虛函版數。
Java中其實沒有權虛函數的概念,它的普通函數就相當於C++的虛函數,動態綁定是Java的默認行為。如果Java中不希望某個函數具有虛函數特性,可以加上final關鍵字變成非虛函數。
總結:java在最大限度地保留了面向對象三要素(封裝、繼承、多態)的基礎上,盡最大努力講語法進行簡化。C++為實現多態需要額外的關鍵字,而Java則直接提供了這種機制,是的封裝、繼承和多態變得更加容易使用。
⑥ java的虛方法和重寫
在多態的情況下,聲明為父類類型的引用變數只能調用父類中的方法,但如果此變數實專際引用的是子類屬對象,而子類對象中覆蓋了父類的方法,這時父類對象調用的是子類中的方法,這種機制就成為虛方法調用。所以,同樣的兩個引用變數調用相同的方法結果可能不同。
父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
子類函數的訪問修飾許可權不能少於父類的;
抽象類abstract定義特別注意abstract方法定義只需聲明,而不需要實現,即用分號(;)而不是用{},格式如下:
abstract returnType abstractMethod();
⑦ 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!");
}
}
⑧ C++中的虛函數和JAVA中的抽象方法有什麼區別
C++虛函數與JAVA中抽象函數比較
1:java中沒有虛函數的概念,但是有抽象函數的概念,用abstract關鍵字表示,java中抽象函數必須在抽象類中,而且抽象 函數不能有函數體,抽象類不能被實例化,只能由其子類實現抽象函數,如果某個抽象類的子類仍是抽象類,那麼該子類不需要實現其父類的抽象函數。
2:C++中的有虛函數的概念,用virtual 關鍵字來表示,每個類都會有一個虛函數表,該虛函數表首先會從父類中繼承得到父類的虛函數表, 如果子類中重寫了父類的虛函數(不管重寫後的函數是否為虛函數),要調用哪個虛函數,是根據當前實際的對象來判斷的(不管指針所屬類型是否為當前類,有可 能是父類型),指針當前指向的是哪種類型的對象,就調用哪個類型中類定義的虛函數。每個類只有一張虛擬函數表,所有的對象共用這張表。
C++的函數多態就是通過虛函數來實現的。
3:C++中,如果函數不是虛函數,則調用某個函數,是根據當前指針類型來判斷的,並不是根據指針所指向對象的類型。
4:Java中,如果函數不是抽象函數,而是一個普通函數,它是默認實現類似C++中虛函數功能的,也就是說,調用某個函數,是根據當前指針所指向對象的類型來判斷的,而不是根據指針類型判斷。正好與C++中的普通函數相反。即:JAVA里自動實現了虛函數。
C++ Java
虛函數 -------- 普通函數
純虛函數 -------- 抽象函數
抽象類 -------- 抽象類
虛基類 -------- 介面
純虛函數: 主要特徵是不能被用來聲明對象,是抽象類,是用來確保程序結構與應用域的結構據具有直接映射關系的設計工具。帶有純虛函數的類稱為抽象類,抽象類能被子類 繼承使用,在子類中必須給出純虛函數的實現,如果子類未給出該純虛函數的實現,那麼該子類也是抽象類,只有在子類不存在純虛函數時,子類才可以用來聲明對 象!抽象類也能用於聲明指針或引用,或用於函數聲明中。具有抽象類特性的類還有構造函數和析構函數,全部是保護的類。如果沒有給出純虛函數的實現,則在它 所在的類的構造函數或析構函數中不能直接或間接的調用它。純虛函數的實現可以在類聲明外進行定義。
5. C++中一般都是把析構函數聲明為虛函數。因為虛函數可以實現動態綁定,也就是到底調用哪個函數是根據指針當前指向哪個對象來確定的,不是根據指針的類型來確定。如果C++中不把析構函數聲明為虛函數,那麼其有個子類,重寫了虛函數,那麼當父類指針指向一個子類對象時,當調用析構函數時,只調用父類的析構函數,而無法調用子類的析構函數,所以一般情況是把析構函數聲明為虛函數,實現動態綁定。當然如果一個類不包含虛函數,這經常預示不打算將它作為基類使用。當一個類不打算作為基類時,將析構函數聲明為虛擬通常是個壞主意。
標准 string 類型不包含虛函數,如果把String作為基類繼承得到子類會出問題。
總之:多態基類應該聲明虛析構函數。如果一個類有任何虛函數,它就應該有一個虛析構函數;如果不是設計用於做基類或不是設計用於多態,這樣的類就不應該聲明虛析構函數。
關於介面與抽象類:
c++中沒有介面的概念,與之對應的是純虛類,即只含有純虛函數的類,c++抽象類的概念是含有純虛函數成員的類。這是因為c++提供多繼承,而像java、c#這些只提供單繼承(避免多繼承的復雜性和低效性)的語言為了模擬多繼承功能就提供了介面概念,介面可以繼承多個。
abstract class是抽象類,至少包含一個純虛函數的類就叫做抽象類。
但是如果一個類,所有的成員都是純虛函數,那麼它和一般的抽象類在用法上是有區別的。至少microsoft給的com介面定義全部都是僅由純虛函數構成的類。因此把這樣的類定義叫做純虛類也不算錯。
純虛函數和虛函數的區別在於前者不包含定義,而後者包含函數體。
那麼純虛類就是不包含任何實現(包括成員函數定義和成員變數定義。前者代表演算法,後者代表結構)。不包含任何演算法和結構的類叫做純虛類,應該沒有問題。
在java裡面的確沒有純虛類的概念,因為java里沒有純虛函數這個概念。java管虛函數叫做abstract function,管抽象類叫做abstract class,直接說來,java根本沒有virtual這個關鍵字,都用abstract代替,因此java裡面根本就沒有pure這個概念。有那就是interface。在interface裡面定義的函數都不能有函數體,這個在java裡面叫做介面。那麼c++裡面與interface等同的概念就是純虛類了,c++用純虛類來模擬interface這個抽象概念,因此這里說的「純虛類」與java的abstract class不同,與c++的一般抽象類也不同。「純虛類」與c++一般抽象類的區別就好比java裡面interface 和 abstract class的區別。
抽象類只能作為基類來使用,其純虛函數的實現由派生類給出。如果派生類中沒有重新定義純虛函數,而只是繼承基類的純虛函數,則這個派生類仍然還是一個抽象類。如果派生類中給出了基類純虛函數的實現,則該派生類就不再是抽象類了,它是一個可以建立對象的具體的類。
抽象類是不能定義對象的。
⑨ java中如何實現類似c++里的虛函數的方法
你說的是多態吧?java繼承之後就具有多態特性了,只需重寫父類方法就可以了,運行時會自動根據對象類型調用正確的方法的,這得益於java聲明變數(除基本變數外)時是基於引用的。
C++的虛函數是為了方便基類指針和引用能夠指向子類對象,從而根據指向的對象類型(而不是根據指針和引用類型)調用對象的方法。(這是C++的多態,由於C++中聲明普通變數與聲明指針和引用是不同的,所以才要這么做)
⑩ 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");
}
}