青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 195,  comments - 30,  trackbacks - 0

http://hi.baidu.com/knowtohow/blog/item/520a5e3e2808753e70cf6c46.html

關于C#,C++,Java在繼承,覆蓋和多態,抽象類等幾個方面的比較歸納。
C#,C++用visual studio2005編譯通過;java代碼用JDK1.4.2編譯通過。


一、繼承中的帶參數構造函數
=============================
C#示例:
//myClass.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace myClass
    class myFirst{
        int value_myFirst;
        public myFirst(int f)
        {
            value_myFirst = f;   
        }
    }
    
    class mySecond : myFirst{
        int value_mySecond;
        
        //構造函數傳遞參數時,采用base關鍵字,s在base()中不需重新聲明類型int
        public mySecond(int s)
            : base(s)   
        {
            value_mySecond = s;       
        }
    }
        
    class Program
    {
        static void Main(string[] args)
        {
           
        }
    }
}


============================

C++示例:
#i nclude "stdafx.h"

class myFirst{
private:
    int value_myFirst;
public:
    myFirst(int f){
        value_myFirst = f;   
    }
};

//繼承需要聲明繼承的方式,此處是public
class mySecond : public myFirst{ 
private:
    int value_mySecond;
public:
    //構造函數傳遞參數時,用基類類名,s基類類名()中不需聲明類型int
    mySecond(int s) : myFirst(s){ 
        value_mySecond = s;       
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

=============================

java示例:
package com;

class myFirst{
    int value_myFirst;
    public myFirst(int f){
        value_myFirst = f;   
    }
}

//繼承采用extends關鍵字
class mySecond extends myFirst{
    int value_mySecond;
    public mySecond(int s){
        //傳遞給基類構造函數時,采用super關鍵字,而且必須是第一條語句。
        super(s); 
        value_mySecond = s;               
    }
}

public class myCon{
    public static void main(String[] args){
        
    }
}

注意:
1.注釋中給出了三者的不同點。
2.另外,C++語法中定義的類后面必須加上分號";"
3.訪問控制權限public等的格式,C#和java比較類似,C++相差很大。

二、方法覆蓋與多態

C#示例:
//myClass.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace myClass
{
    class myFirst
    {
        int value_myFirst;
        public myFirst(int f)
        {
            value_myFirst = f;
        }
        public void f1()
        {
            System.Console.WriteLine("myFirst.f1()!");
        }
        public virtual void f2() //virtual也可以提到最前面
        {
            System.Console.WriteLine("myFirst.f2()!");
        }
    }

    class mySecond : myFirst
    {
        int value_mySecond;

        public mySecond(int s)
            : base(s)
        {
            value_mySecond = s;
        }
        
        //使用關鍵字new覆蓋基類中的同名方法
        public new void f1()     //new也可以提到最前面
        {
            System.Console.WriteLine("mySeconde.f1()!");
        }
        
        //error當基類函數myFirst.f1()沒有聲明為virtual,abstract時不能override!
        //public override void f1() 
        //{
        //    System.Console.WriteLine("mySeconde.f1()!");
        //}
        
        //基類函數中雖然聲明是virtual,但是仍然可以用new覆蓋。
        //public new void f2()
        //{
        //    System.Console.WriteLine("mySeconde.f2()!");
        //}
        
        ////基類函數中雖然聲明是virtual,用override覆蓋。
        public override void f2()   //override也可以提到最前面
        {
            System.Console.WriteLine("mySeconde.f2()!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            myFirst mf = new myFirst(1);
            mySecond ms = new mySecond(2);
            mf.f1(); //myFirst.f1()!
            mf.f2(); //myFirst.f2()!
            ms.f1(); //mySeconde.f1()!
            ms.f2(); //mySeconde.f2()!

            mf = ms; //向上轉型之后
            mf.f1(); //myFirst.f1()!
            
            //mySeconde.f2()! 這是用override的運行結果;
            //如果是new那么,結果是myFirst.f2()!
            mf.f2(); 
        }
    }
}

=============================

C++示例

#i nclude "stdafx.h"
#i nclude <iostream>
using namespace std;

class myFirst{
private:
    int value_myFirst;
public:
    myFirst(int f){
        value_myFirst = f;   
    }

void f1(){
cout<<"myFirst.f1()!"<<endl;
}
vitual void f2(){ //聲明為虛函數
cout<<"myFirst.f2()!"<<endl;
}
};

class mySecond : public myFirst{
private:
    int value_mySecond;
public:
    mySecond(int s) : myFirst(s){
        value_mySecond = s;       
    }
    
    //直接覆蓋基類函數,無需C#中的new
void f1(){
cout<<"mySecond.f1()!"<<endl;
}
    
    //覆蓋基類需函數
void f2(){
cout<<"mySecond.f2()!"<<endl;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
myFirst *mf = new myFirst(1);
mySecond *ms = new mySecond(1);
mf->f1(); //myFirst.f1()!
mf->f2(); //myFirst.f2()!

ms->f1(); //mySecond.f1()! 
ms->f2(); //mySecond.f2()!

mf = ms; //向上轉型
mf->f1(); //myFirst.f1()!
mf->f2(); //mySecond.f2()!

myFirst mf1(1); //也可以
mf1.f1();

return 0;
}

=============================

java示例
//myCon.java

package com;

class myFirst{
    int value_myFirst;
    public myFirst(int f){
        value_myFirst = f;   
    }
    public void f1(){
        System.out.println("myFirst.f1()!");    
    }       
}


class mySecond extends myFirst{
    int value_mySecond;
    public mySecond(int s){        
        super(s); 
        value_mySecond = s;               
    }
    public void f1(){
        System.out.println("mySecond.f1()!");    
    }    
}

class myThird extends myFirst{
    int value_myThird;
    public myThird(int t){        
        super(t); 
        value_myThird = t;               
    }
    public void f1(){
        System.out.println("myThird.f1()!");    
    }     
}

public class myCon{
    public static void main(String[] args){
        myFirst mf = new myFirst(1);
        mySecond ms = new mySecond(1);
        myThird mt = new myThird(1);
                
        mf.f1(); //myFirst.f1()!             
        ms.f1(); //mySecond.f1()!      
        mt.f1(); //myThird.f1()!      
        
        //向上轉型,由于java的動態綁定機制,
        //使得java能夠調用派生類mySecond的f1()       
        mf = ms; 
        mf.f1(); //mySecond.f1()!
        
        mf = mt;
        mf.f1(); //myThird.f1()!      
               
    }
}

為了實現多態:
1.C#基類方法要聲明為virtual,派生類覆蓋時要用override;
2.C++基類方法要聲明為virtual,派生類方法直接覆蓋;
3.java直接覆蓋就可以實現多態。

三、抽象類

C#示例
上面已經說明,雖然基類方法聲明為virtual,以便派生類用override覆蓋,但是派生類仍然可以用
new關鍵字覆蓋(不具有多態性)。
可以強制讓派生類覆蓋基類的方法,將基類方法聲明為抽象的,采用abstract關鍵字。
抽象方法沒有方法體,由派生類來提供。

如果派生類不實現基類的抽象方法,則派生類也需要聲明為abstract類

//myClass.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace myClass{
    
    //類中只要存在抽象方法,就必須聲明為抽象類
    abstract class myFirst 
    {
        int value_myFirst;
        public myFirst(int f)
        {
            value_myFirst = f;
        }
        
        //抽象方法沒有方法體,以分號結尾。
        public abstract void f1();
        
        public void f2()
        {
            System.Console.WriteLine("myFirst.f2()!");
        }

        public virtual void f3()
        {
            System.Console.WriteLine("myFirst.f3()!");
        }
    }

    class mySecond : myFirst
    {
        int value_mySecond;

        public mySecond(int s)
            : base(s)
        {
            value_mySecond = s;
        }
        
        //覆蓋基類抽象方法
        public override void f1()   
        {
            System.Console.WriteLine("mySeconde.f1()!");
        } 
         
        //覆蓋基類一般方法     
        public new void f2()
        {
            System.Console.WriteLine("mySeconde.f2()!");
        }

        //覆蓋基類虛擬方法
        public override void f3()
        {
            System.Console.WriteLine("mySecond.f3()!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //抽象類和接口不能聲明對象
            //myFirst mf = new myFirst(1); 
            mySecond ms = new mySecond(2);
            
            ms.f1(); //mySeconde.f1()!
            ms.f2(); //mySeconde.f2()!
            ms.f3(); //mySecond.f3()!

            //這里向上轉型采用強類型轉換的方式
            ((myFirst)ms).f1();   //mySeconde.f1()! 
            ((myFirst)ms).f2();   //myFirst.f2()!
            ((myFirst)ms).f3();   //mySecond.f3()!
            
        }
    }
}

=============================

C++示例

純虛函數是在基類中只宣布某個虛函數的原型,并且為了明確通知編譯系統,
該虛函數在基類中不再定義具體操作代碼,而在函數原型結束分號的左側寫
"=0"標識。這個不包含任何代碼的虛函數被成為純虛函數。

抽象類是含有純虛函數的類,這種類不能聲明任何對象,其作用就是為它的
派生類提供一種規定輸入數據和返回類型接口的模板。

從抽象類派生的派生類,必須對基類的純虛函數進行覆蓋;否則編譯系統將
報錯。

基類中虛函數被派生類覆蓋,則派生類對象調用的是派生類中重新定義的函
數代碼。
基類中虛函數沒有被派生類覆蓋,則派生類對象調用的是基類中定義的函數
代碼。
基類的純虛函數在其派生類中必須被覆蓋。

#i nclude "stdafx.h"
#i nclude <iostream>
using namespace std;

class myFirst{   //抽象類
private:
    int value_myFirst;
public:
    myFirst(int f){
        value_myFirst = f;   
    }

void f1(){            //一般函數
cout<<"myFirst.f1()!"<<endl;
}
virtual void f2(){   //虛函數
cout<<"myFirst.f2()!"<<endl;
}

virtual void f3()=0; //純虛函數
};

class mySecond : public myFirst{
private:
    int value_mySecond;
public:
    mySecond(int s) : myFirst(s){
        value_mySecond = s;       
    }

void f1(){         //覆蓋基類一般函數
cout<<"mySecond.f1()!"<<endl;
}

void f2(){         //覆蓋基類虛函數
cout<<"mySecond.f2()!"<<endl;
}
void f3(){         //覆蓋基類純虛函數
cout<<"mySecond.f3()!"<<endl;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
//myFirst *mf = new myFirst(1); //抽象類不能創建對象
mySecond *ms = new mySecond(1);

ms->f1(); //mySecond.f1()!
ms->f2(); //mySecond.f2()!
ms->f3(); //mySecond.f3()!

    //向上轉型采用強類型轉換
((myFirst *)ms)->f1(); //myFirst.f1()!
((myFirst *)ms)->f2(); //mySecond.f2()!
((myFirst *)ms)->f3(); //mySecond.f3()!

return 0;
}

=============================

java示例

java提供了抽象方法的機制abstract method,這種方法不完整,僅有聲明
沒有方法體
abstract void f();
包含抽象方法的類叫抽象類,如果類中包含一個或多個抽象方法,則該類必
須被聲明為抽象類,用abstract來修飾抽象類。
如果從一個抽象類繼承,并創建這個新類的對象,必須給抽象基類中所有抽
象方法提供方法定義,否則,派生類也是抽象類,也用abstract修飾。

package com;

abstract class myFirst{
    int value_myFirst;
    public myFirst(int f){
        value_myFirst = f;   
    }
    public void f1(){
        System.out.println("myFirst.f1()!");    
    } 
    public abstract void f2();    //抽象方法   
}

//繼承采用extends關鍵字
class mySecond extends myFirst{
    int value_mySecond;
    public mySecond(int s){
        //傳遞給基類構造函數時,采用super關鍵字,而且必須是第一條語句。
        super(s); 
        value_mySecond = s;               
    }
    public void f1(){
        System.out.println("mySecond.f1()!");    
    } 
    
    public void f2(){ //覆蓋基類抽象方法
        System.out.println("mySecond.f2()!");     
    }   
}

//如果不實現基類抽象方法,那么此派生類也必須用abstract修飾
abstract class myThird extends myFirst{ 
    int value_myThird;
    public myThird(int t){        
        super(t); 
        value_myThird = t;               
    }
    public void f1(){
        System.out.println("myThird.f1()!");    
    }     
}

public class myCon{
    public static void main(String[] args){
        
        //myFirst mf = new myFirst(1); //抽象函數不能創建對象
        mySecond ms = new mySecond(1);
        //myThird mt = new myThird(1); 
        
        ms.f1(); //mySecond.f1()!
        ms.f2(); //mySecond.f2()!
        
        ((myFirst)ms).f1(); //mySecond.f1()!
        ((myFirst)ms).f2(); //mySecond.f2()!
    }
}


關于抽象方法和抽象類java和C#比較類似;
而C++叫純虛函數和抽象類。


四、接口
C++中的沒有接口的概念,它本身就可以多繼承。

java中接口interface比抽象類abstract更進了一步,可看做"純粹的抽象類"。
它允許創建者為一個類建立其形式,方法名,參數列表,返回類型,但沒有
任何方法體。接口中也可以包含成員函數,但是他們都是隱含的public和
final。

創建接口時用interface來代替class,前面可以有public,如果不加訪問權
限,那么它就是默認的包訪問權限。
接口中的方法默認為public。

類實現接口要用implements關鍵字。

接口便于實現多重繼承的效果,此處不作具體討論。

package com;

interface myFirst{
    int value_myFirst=1;    
    public void f1();
}

class mySecond implements myFirst{
    int value_mySecond;
    public mySecond(int s){        
        value_mySecond = s;               
    }
    public void f1(){
        System.out.println("mySecond.f1()!");    
    }
}

public class myCon{
    static void play(myFirst mf){
        mf.f1();   
    }
    public static void main(String[] args){
        
        
        //myFirst mf = new myFirst(1);
        mySecond ms = new mySecond(1); 
        
        ms.f1();   //mySecond.f1()!       
        play(ms); //向上轉型 mySecond.f1()!
        
        ((myFirst)ms).f1(); ////向上轉型 mySecond.f1()!
    }
}

posted on 2011-04-08 18:43 luis 閱讀(301) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

文章分類

文章檔案

友情鏈接

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美久久久久久久久久| 亚洲一二三区精品| 欧美刺激性大交免费视频| 欧美专区福利在线| 欧美一级午夜免费电影| 亚洲女性裸体视频| 欧美有码视频| 欧美一区二区三区另类| 久久久www成人免费毛片麻豆| 欧美一区高清| 美女日韩在线中文字幕| 欧美剧在线免费观看网站| 欧美午夜电影在线| 国产日韩欧美精品一区| 亚洲清纯自拍| 亚洲免费在线观看| 久久躁狠狠躁夜夜爽| 亚洲欧洲三级电影| 中文日韩在线视频| 久久精品日产第一区二区三区| 美女国产一区| 国产精品日韩欧美综合| 亚洲第一精品夜夜躁人人爽| 亚洲一级片在线看| 久久久之久亚州精品露出| 久久久水蜜桃| 欧美激情在线狂野欧美精品| 免费h精品视频在线播放| 亚洲国产成人一区| 亚洲一区在线播放| 男人天堂欧美日韩| 国产农村妇女精品一二区| 亚洲电影专区| 性色av一区二区三区红粉影视| 久久人人97超碰人人澡爱香蕉| 亚洲三级影院| 久久久精品日韩| 国产精品久久99| 亚洲国产精品va| 欧美在线视频免费| 韩国自拍一区| 亚洲综合首页| 亚洲精品一区二区三区99| 久久久久青草大香线综合精品| 欧美亚州在线观看| 亚洲高清久久久| 久久精彩免费视频| 亚洲五月婷婷| 欧美午夜精品电影| 99精品99| 亚洲高清中文字幕| 麻豆精品视频在线| 136国产福利精品导航| 久久久久久高潮国产精品视| 99re热这里只有精品免费视频| 久热精品在线| 在线欧美影院| 免费成人在线观看视频| 欧美一区成人| 国产人久久人人人人爽| 欧美一区国产一区| 亚洲自拍偷拍网址| 国产精品日韩在线一区| 亚洲视频在线视频| 宅男噜噜噜66一区二区| 欧美午夜不卡视频| 亚洲欧美一区二区激情| 亚洲一二三级电影| 国产欧美在线观看| 久久久91精品国产一区二区三区| 欧美伊人久久大香线蕉综合69| 黑人巨大精品欧美黑白配亚洲 | 亚洲一区二区三区在线| 欧美色综合天天久久综合精品| 一区二区三区成人精品| 亚洲精品一区二区网址| 欧美色图天堂网| 亚洲男人的天堂在线aⅴ视频| 在线综合亚洲欧美在线视频| 国产精品婷婷| 久久久人成影片一区二区三区观看 | 亚洲色图在线视频| 国产精品久久久久久亚洲调教 | 国语自产在线不卡| 免费影视亚洲| 欧美日韩国产专区| 久久精品免费电影| 久久亚洲一区二区| 一区二区三区三区在线| 亚洲综合久久久久| 亚洲丰满在线| 亚洲私人影院在线观看| 韩国女主播一区| 亚洲激情中文1区| 国产精品专区第二| 亚洲国产视频一区| 国产日韩欧美综合在线| 91久久精品国产91久久| 国产精品麻豆成人av电影艾秋| 狼狼综合久久久久综合网 | 在线中文字幕不卡| 亚洲国产日本| 亚洲免费网址| 日韩一级精品视频在线观看| 欧美亚洲自偷自偷| 在线综合视频| 欧美不卡视频一区发布| 久久精品一级爱片| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 午夜精品成人在线视频| 久久久久网站| 小嫩嫩精品导航| 欧美激情一区二区三区在线视频| 欧美一区二区观看视频| 欧美视频1区| 亚洲激情影视| 亚洲国产99精品国自产| 午夜在线a亚洲v天堂网2018| 日韩视频在线播放| 久久伊人精品天天| 久久久久亚洲综合| 国产精品久久久久天堂| 亚洲精品自在在线观看| 欧美在线免费观看| 亚洲一区一卡| 欧美激情在线| 亚洲国产精品欧美一二99| 欧美影院成年免费版| 亚洲一区二区三区精品视频 | 国产精品久久久久久福利一牛影视| 亚洲第一级黄色片| 91久久极品少妇xxxxⅹ软件| 久久久欧美一区二区| 国产精品一区二区男女羞羞无遮挡 | 亚洲韩国一区二区三区| 亚洲国产精品一区二区第四页av| 欧美一级成年大片在线观看| 亚洲曰本av电影| 欧美性做爰毛片| 一区二区三区高清在线观看| 亚洲一区三区视频在线观看| 欧美日韩一视频区二区| 99精品热6080yy久久| 亚洲视屏一区| 国产欧美一区二区三区国产幕精品| 亚洲——在线| 久久久www成人免费精品| 黄色一区二区在线| 久久网站热最新地址| 亚洲第一在线视频| 一级日韩一区在线观看| 欧美三级在线播放| 亚洲免费影视| 免费观看30秒视频久久| 亚洲国产一区视频| 欧美日韩亚洲一区二区三区四区| 亚洲一区二区成人| 久久色在线播放| 亚洲精品一二三| 国产精品免费电影| 久久天堂精品| 在线一区亚洲| 欧美1区2区| 一区二区三区欧美视频| 国产日韩精品一区| 久久亚洲综合色一区二区三区| 亚洲成人在线视频播放 | 国产精品色一区二区三区| 亚洲欧美日韩精品久久奇米色影视| 久久免费视频一区| 日韩视频精品在线| 国产伦精品一区二区三| 久久夜色精品亚洲噜噜国产mv| 亚洲区中文字幕| 欧美日韩一区三区四区| 久久黄色网页| 日韩视频国产视频| 麻豆精品一区二区综合av | 亚洲精品免费看| 国产精品视频男人的天堂| 久久综合网hezyo| 制服丝袜激情欧洲亚洲| 欧美激情片在线观看| 午夜久久久久久| 91久久精品国产91久久| 国产欧美日韩在线| 欧美日韩国产另类不卡| 久久久999| 亚洲午夜国产成人av电影男同| 欧美日韩在线精品一区二区三区| 亚洲高清123| 亚洲免费网址| 在线视频观看日韩| 国产精品亚洲综合一区在线观看| 蜜臀久久久99精品久久久久久 | 欧美不卡三区| 久久精品成人| 午夜精品久久| 一区二区高清在线观看| 亚洲激情视频网站|