欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java與c#的區(qū)別、兩者有什么不同?

 更新時(shí)間:2013年04月11日 15:30:47   作者:  
Java和C#都是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,Java更多地借鑒了C++的優(yōu)點(diǎn),而摒棄了它的一些不太容易被人掌握的知識(shí)點(diǎn)(有些不能說(shuō)是缺點(diǎn)),并且增加了一些自己的特點(diǎn),而C#則是更多地借鑒了Java的優(yōu)點(diǎn),而增加了一些自己的特點(diǎn)

Java 的設(shè)計(jì)者是因?yàn)橛憛扖++的復(fù)雜,于是Java 非常簡(jiǎn)潔,GC 也讓內(nèi)存管理非常方便,C# 是看中了Java 的GC,和虛擬機(jī)技術(shù),希望把微軟的幾大語(yǔ)言集成到.NET 上來(lái)。 因此C#從語(yǔ)言上來(lái)講并不簡(jiǎn)單甚至可以算的上復(fù)雜。

兩種語(yǔ)言的設(shè)計(jì)思路也不一樣,Java 是編譯解釋語(yǔ)言,C#是編譯然后編譯運(yùn)行語(yǔ)言。Java 沒(méi)有委托,C# 有委托。Java 傾向于用Interface 實(shí)現(xiàn)委托的功能,而 在C# 中,Abstract Class 比Interface 發(fā)揮了更大功能。

Java 遵循camel 命名規(guī)則,C#遵循Pascal 命名規(guī)則。但是如今越來(lái)越多的Java 人開(kāi)始使用C#, 同時(shí)也把camel 命名規(guī)則帶到了C#,這可能會(huì)讓C#代碼越來(lái)越難讀。為什么當(dāng)初C#為什么不遵循camel 呢? 我看不出camel 命名規(guī)則有什么不好的。

一. 類(lèi)名.this 與內(nèi)部類(lèi)

在 java 中,經(jīng)??吹筋?lèi)似類(lèi)名.this 的用法,this 就是當(dāng)前對(duì)象實(shí)例,為什么前面會(huì)出現(xiàn)類(lèi)名呢?對(duì)此 C# 程序員會(huì)很納悶。

在 Java 中,很多地方使用到了內(nèi)部類(lèi),甚至可以在在內(nèi)部類(lèi)中訪問(wèn)外部類(lèi)中的成員,這個(gè)時(shí)候,在內(nèi)部類(lèi)中使用 this 的時(shí)候,就會(huì)出現(xiàn) this 到底是誰(shuí)的問(wèn)題,到底是表示內(nèi)部類(lèi)的當(dāng)前對(duì)象實(shí)例,還是外部類(lèi)的當(dāng)前對(duì)象實(shí)例問(wèn)題。

在 Java 中,通過(guò)在 this 的前面加上外部類(lèi)的類(lèi)名,表示在內(nèi)部類(lèi)中使用外部類(lèi)的當(dāng)前對(duì)象實(shí)例。

我們看下面的一個(gè)例子。

復(fù)制代碼 代碼如下:

package core.sisheng;

// 外部類(lèi)定義
public class OuterClass {

    // 內(nèi)部類(lèi)定義
    private class InnerClass
    {
        // 內(nèi)部類(lèi)中沒(méi)有定義 id 成員,這里訪問(wèn)外部類(lèi)中的成員
        public int getId(){    return OuterClass.this.id;    }
        public void setId(int id) { OuterClass.this.id = id;}

        // 內(nèi)部類(lèi)中定義了 name 成員,直接訪問(wèn)內(nèi)部類(lèi)中的成員, 默認(rèn) this 訪問(wèn)當(dāng)前類(lèi)中的成員
        private String name;
        public String getName() { return this.name;}
        // 可以在 this 的前面加上一個(gè)內(nèi)部類(lèi)的名稱(chēng)
        public void setName(String name) { InnerClass.this.name = name;}

        // 內(nèi)部類(lèi)中也可以訪問(wèn)外部類(lèi)中同名的成員,需要加上外部類(lèi)的名稱(chēng)
        public String getOuterName() { return OuterClass.this.name;}
        public void setOuterName(String name) { OuterClass.this.name = name;}

        @Override
        public String toString()
        {
            return "Id: " + this.getId() + ", Inner Name: " + this.getName() + ", Outer Name: " + this.getOuterName();
        }
    }

    // 外部類(lèi)中定義的成員 id 和 name
    private int id;
    private String name;

    private InnerClass innerInstance;
    public OuterClass()
    {
        this.innerInstance = new InnerClass();
        this.innerInstance.setId(20);
        this.innerInstance.setName("Tom");
        this.innerInstance.setOuterName("Alice");
    }

    public String toString()
    {
        return this.innerInstance.toString();
    }   
}

在C#中,類(lèi)區(qū)分為嵌套類(lèi)和非嵌套類(lèi),前者是聲明在其他數(shù)據(jù)類(lèi)型內(nèi)部的類(lèi)。后者是直接定義在某一個(gè)命名空間的類(lèi)。C# 中很少定義嵌套類(lèi)。


非內(nèi)嵌類(lèi)只允許使用public和internal的訪問(wèn)控制,而內(nèi)置類(lèi)則允許使用所有的五種訪問(wèn)控制符,private, protected , internal protected,public和internal。內(nèi)部類(lèi)也可以訪問(wèn)外部類(lèi)的所有方法,包括instance方法和private方法,但是需要顯式 的傳遞一個(gè)外部類(lèi)的實(shí)例。

C#中的內(nèi)部類(lèi)能夠使用外部類(lèi)定義的類(lèi)型和靜態(tài)方法,但是不能直接使用外部類(lèi)的實(shí)例方法,因此,不存在上面的問(wèn)題。

在C#中,外部類(lèi)對(duì)于內(nèi)部類(lèi)的作用更像是一個(gè)命名空間,只要訪問(wèn)控制允許,就可以使用下面的方法創(chuàng)建內(nèi)部類(lèi)對(duì)象實(shí)例。

OuterClass.InnerClass  obj = new OuterClass.InnerClass();這個(gè)實(shí)例與外部類(lèi)的任何實(shí)例沒(méi)有任何直接的關(guān)系。類(lèi)似于Java中的靜態(tài)內(nèi)部類(lèi)。

二、類(lèi)名.class 與類(lèi)型

在 java 中還經(jīng)??吹筋?lèi)名.class 的用法,這個(gè)用法相當(dāng)于  C# 中的 typeof( 類(lèi)名 ),用來(lái)獲取類(lèi)型的類(lèi)型對(duì)象實(shí)例引用。

java中,每個(gè)class都有一個(gè)相應(yīng)的Class對(duì)象,當(dāng)編寫(xiě)好一個(gè)類(lèi),編譯完成后,在生成的.class文件中,就產(chǎn)生一個(gè)Class對(duì)象,用來(lái)表示這個(gè)類(lèi)的類(lèi)型信息。獲得Class實(shí)例的三種方式:

通過(guò)調(diào)用對(duì)象實(shí)例的 getClass() 方法獲取該對(duì)象的Class實(shí)例。

使用Class的靜態(tài)方法forName(),用類(lèi)的名字獲取一個(gè)Class實(shí)例。Class.forName(xxx.xx.xx) 返回的是一個(gè)類(lèi), 作用是要求JVM查找并加載指定的類(lèi),也就是說(shuō)JVM會(huì)執(zhí)行該類(lèi)的靜態(tài)代碼段。

類(lèi)名.calss的方式獲取Class實(shí)例,對(duì)基本數(shù)據(jù)類(lèi)型的封裝類(lèi),還可以采用.TYPE來(lái)獲取對(duì)應(yīng)的基本數(shù)據(jù)類(lèi)型的Class實(shí)例。

C# 中獲取類(lèi)型對(duì)象實(shí)例的方式更加簡(jiǎn)單明確一些。

通過(guò)調(diào)用數(shù)據(jù)實(shí)例的 GetType() 方法獲取,這個(gè)方法繼承自O(shè)bject,所以C#中任何對(duì)象都具有GetType()方法,x.GetType(),其中x為變量名。

typeof(x)中的x,必須是具體的類(lèi)名、類(lèi)型名稱(chēng)等,不可以是變量名稱(chēng)。

通過(guò) System.Type 的靜態(tài)方法 System.Type.GetType()。

 三、匿名類(lèi)

在 java 中,匿名類(lèi)的使用也比較多,比如在 Android 中,實(shí)現(xiàn)按鈕的監(jiān)聽(tīng),經(jīng)常會(huì)看到類(lèi)似這樣的代碼。

復(fù)制代碼 代碼如下:

this.listener0 = new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        Intent intent = new Intent( MainActivity.this, ActivityFrameLayout.class);
        setTitle("FrameLayout");
        startActivity( intent );
    }
};

在這里,OnClickListenter 實(shí)際上是一個(gè)接口,接口能用來(lái)創(chuàng)建對(duì)象實(shí)例嗎?當(dāng)然不能。


所以,java 在這里自動(dòng)創(chuàng)建一個(gè)實(shí)現(xiàn)接口的匿名類(lèi),我們創(chuàng)建出來(lái)的實(shí)際上就是這個(gè)匿名類(lèi)的對(duì)象實(shí)例。

這樣做的好處就是我們沒(méi)有必須再定義一個(gè)只使用一次的類(lèi),然后再通過(guò)這個(gè)類(lèi)創(chuàng)建對(duì)象實(shí)例,簡(jiǎn)化了程序的開(kāi)發(fā)。

比如,我們有下面的一個(gè)接口。

復(fù)制代碼 代碼如下:

public interface myInterface {
    void onClick();
}

就可以通過(guò)接口創(chuàng)建一個(gè)實(shí)現(xiàn)接口的匿名類(lèi)的對(duì)象實(shí)例,然后使用這個(gè)對(duì)象實(shí)例。

復(fù)制代碼 代碼如下:

myInterface instance = new myInterface(){
    @Override
    public void onClick()
    {
        System.out.println("Clicked!");
    }
};

instance.onClick();在 C# 中,我們根本就不會(huì)使用這種形式,通過(guò)委托,可以非常簡(jiǎn)單地實(shí)現(xiàn)同樣的功能。

 注意,java 中是沒(méi)有委托的。

如果我們輸出一下這個(gè)實(shí)例的類(lèi)型,你會(huì)看到這個(gè)匿名類(lèi)的實(shí)際類(lèi)型的。

復(fù)制代碼 代碼如下:

System.out.println( instance.getClass());
// class core.sisheng.Study1$1四、屬性(Property)


屬性的概念對(duì)大家來(lái)說(shuō)應(yīng)該是很熟悉的,類(lèi)成員函數(shù)可以自由地訪問(wèn)本類(lèi)中的任何屬性成員。不過(guò)若要從一個(gè)類(lèi)中去訪問(wèn)另一個(gè)類(lèi)中的屬性,那就比較麻煩了,所以很多時(shí)候我們使用Getxxx和Setxxx方法,這樣看起來(lái)顯得極不自然,比如用Java或者C++,代碼是這樣的:

復(fù)制代碼 代碼如下:

foo.setSize (getSize () + 1);
label.getFont().setBold (true);


但是,在C#中,這樣的方法被“屬性化”了。同樣的代碼,在C#就變成了:  
foo.size++;  
label.font.bold = true; 
    可以看出來(lái),C#顯然更容易閱讀和理解。我們從這個(gè)“屬性方法”的子程序代碼中,也可以看到類(lèi)似情況:

Java/C++:  

復(fù)制代碼 代碼如下:

public int getSize()  
{  
return size;  
}  
public void setSize (int value)  
{  
size = value;  

C#:  

復(fù)制代碼 代碼如下:

public int Size  
{  
 get{return size;}  
 set{size = value;}  

為了區(qū)分這種屬性化的方法和類(lèi)的屬性成員,在C#中把屬性成員稱(chēng)作“域(field)”,而“屬性”則成為這種“屬性化的方法”專(zhuān)用的名詞。順便說(shuō)一句,其實(shí)這樣的屬性化方法在VB和DELPHI中是經(jīng)常碰到的,在VB中它也就叫屬性。另外,在C#中Get和Set必須成對(duì)出現(xiàn),一種屬性不能只有Get而沒(méi)有Set(在Java和C++中就可以只有Get或者只有Set),C#中這樣做的好處在于便于維護(hù),假如要對(duì)某種屬性進(jìn)行修改,就會(huì)同時(shí)注意Get和Set方法,同時(shí)修改,不會(huì)改了這個(gè)忘了那個(gè)。

五、對(duì)象索引機(jī)制(Indexer)

C#中引入了對(duì)象索引機(jī)制。說(shuō)得明白點(diǎn),對(duì)象索引其實(shí)就是對(duì)象數(shù)組。這里和上一節(jié)中的屬性聯(lián)系起來(lái)講一下,屬性需要隱藏Get和Set方法,而在索引機(jī)制中,各個(gè)對(duì)象的Get或者Set方法是暴露出來(lái)的。比如下面的例子就比較清楚地說(shuō)明了這一點(diǎn)。以上介紹C#和Java不同點(diǎn)

復(fù)制代碼 代碼如下:

public class Skyscraper 

 Story[] stories; 
 public Story this [int index] { 
get { 
 return stories [index]; 

set { 
 if (value != null) { 

stories [index] = value; 
 } 

 } 
... 
}


以上介紹C#和JAVA得不同點(diǎn),希望對(duì)你了解C#和JAVA有所幫助。

相關(guān)文章

  • 微信支付jsapi缺少參數(shù) total_fee 錯(cuò)誤分析與解決方法

    微信支付jsapi缺少參數(shù) total_fee 錯(cuò)誤分析與解決方法

    這篇文章主要介紹了微信支付jsapi缺少參數(shù) total_fee 錯(cuò)誤分析與解決方法,需要的朋友可以參考下
    2018-03-03
  • 詳解提升場(chǎng)景文本識(shí)別中的語(yǔ)言模型

    詳解提升場(chǎng)景文本識(shí)別中的語(yǔ)言模型

    語(yǔ)言模型即根據(jù)當(dāng)前語(yǔ)境的上下文推斷當(dāng)前句子的意思。文本圖像中包含兩層信息:視覺(jué)紋理信息和語(yǔ)言信息。由于單純根據(jù)視覺(jué)紋理信息進(jìn)行文字識(shí)別缺少了對(duì)上下文的字符語(yǔ)義信息的挖掘,時(shí)常會(huì)導(dǎo)致錯(cuò)誤的文本識(shí)別結(jié)果(之后會(huì)詳細(xì)說(shuō)明)。
    2021-05-05
  • Hbuilder配置Avalon和Vue指令提示的方法詳解

    Hbuilder配置Avalon和Vue指令提示的方法詳解

    HBuilder是DCloud(數(shù)字天堂)推出的一款支持HTML5的Web開(kāi)發(fā)IDE,下面這篇文章主要給大家介紹了關(guān)于Hbuilder如何配置Avalon和Vue指令提示的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-10-10
  • chrome開(kāi)發(fā)者助手插件v2.10發(fā)布提升開(kāi)發(fā)效率不再只是口號(hào)

    chrome開(kāi)發(fā)者助手插件v2.10發(fā)布提升開(kāi)發(fā)效率不再只是口號(hào)

    這篇文章主要介紹了chrome開(kāi)發(fā)者助手插件v2.10發(fā)布提升開(kāi)發(fā)效率不再只是口號(hào),這個(gè)版本重點(diǎn)提升了常用工具的使用效率,需要的朋友可以參考下
    2021-03-03
  • java與c#的區(qū)別、兩者有什么不同?

    java與c#的區(qū)別、兩者有什么不同?

    Java和C#都是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,Java更多地借鑒了C++的優(yōu)點(diǎn),而摒棄了它的一些不太容易被人掌握的知識(shí)點(diǎn)(有些不能說(shuō)是缺點(diǎn)),并且增加了一些自己的特點(diǎn),而C#則是更多地借鑒了Java的優(yōu)點(diǎn),而增加了一些自己的特點(diǎn)
    2013-04-04
  • H5混合開(kāi)發(fā)手機(jī)Web App入門(mén):概念篇

    H5混合開(kāi)發(fā)手機(jī)Web App入門(mén):概念篇

    如果你開(kāi)始學(xué)習(xí)手機(jī) App 開(kāi)發(fā),就一定會(huì)聽(tīng)到 H5 這個(gè)詞。它是目前的主流開(kāi)發(fā)技術(shù)之一,容易上手,開(kāi)發(fā)周期短、成本低、兼容傳統(tǒng) Web 開(kāi)發(fā)。但是,很少有文章詳細(xì)介紹,H5 到底是什么技術(shù),有什么原理,跟其他技術(shù)的差異在哪里。
    2022-12-12
  • 深入分析java與C#底層控制能力區(qū)別及示例詳解

    深入分析java與C#底層控制能力區(qū)別及示例詳解

    這篇文章主要為大家深入分析java與C#底層控制能力不同的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • HBuilder打包App方法(圖文教程)

    HBuilder打包App方法(圖文教程)

    下面小編就為大家?guī)?lái)一篇HBuilder打包App方法(圖文教程)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • TCP 四種定時(shí)器(重傳定時(shí)器,堅(jiān)持計(jì)時(shí)器,?;疃〞r(shí)器,時(shí)間等待計(jì)時(shí)器)

    TCP 四種定時(shí)器(重傳定時(shí)器,堅(jiān)持計(jì)時(shí)器,?;疃〞r(shí)器,時(shí)間等待計(jì)時(shí)器)

    這篇文章主要介紹了TCP 四種定時(shí)器,重傳定時(shí)器,堅(jiān)持計(jì)時(shí)器,?;疃〞r(shí)器,時(shí)間等待計(jì)時(shí)器的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 聊聊自學(xué),那些讓你事半功倍的自學(xué)資源(干貨分享)

    聊聊自學(xué),那些讓你事半功倍的自學(xué)資源(干貨分享)

    B站是一個(gè)學(xué)習(xí)網(wǎng)站。一入B站深似海,從此游戲是路人。B站雖然視頻資源多,但是內(nèi)容也是五花八門(mén)、參差不齊,本文給大家收集了關(guān)于學(xué)習(xí)計(jì)算機(jī)編程的視頻,這里有我曾經(jīng)的入門(mén)視頻,也有跟朋友交流獲得的,特此篩選了下面這些視頻,分享給大家
    2021-04-04

最新評(píng)論