日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

      首頁編程開發(fā)其它知識 → java 與 c#的區(qū)別、兩者有什么不同?

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

      前往專題相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2013/3/18 22:30:35字體大。A-A+

      作者:西西點擊:2次評論:0次標簽: java

      JavaC#都是一門面向?qū)ο蟮恼Z言,Java更多地借鑒了C++的優(yōu)點,而摒棄了它的一些不太容易被人掌握的知識點(有些不能說是缺點),并且增加了一些自己的特點,而C#則是更多地借鑒了Java的優(yōu)點,而增加了一些自己的特點。

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

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

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

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

      在 java 中,經(jīng)?吹筋愃祁惷.this 的用法,this 就是當前對象實例,為什么前面會出現(xiàn)類名呢?對此 C# 程序員會很納悶。

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

      在 Java 中,通過在 this 的前面加上外部類的類名,表示在內(nèi)部類中使用外部類的當前對象實例。

      我們看下面的一個例子。

      package core.sisheng;

      // 外部類定義
      public class OuterClass {
          
          // 內(nèi)部類定義
          private class InnerClass
          {
              // 內(nèi)部類中沒有定義 id 成員,這里訪問外部類中的成員
              public int getId(){    return OuterClass.this.id;    }
              public void setId(int id) { OuterClass.this.id = id;}
          
              // 內(nèi)部類中定義了 name 成員,直接訪問內(nèi)部類中的成員, 默認 this 訪問當前類中的成員
              private String name;
              public String getName() { return this.name;}
              // 可以在 this 的前面加上一個內(nèi)部類的名稱
              public void setName(String name) { InnerClass.this.name = name;}
              
              // 內(nèi)部類中也可以訪問外部類中同名的成員,需要加上外部類的名稱
              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();
              }
          }
          
          // 外部類中定義的成員 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#中,類區(qū)分為嵌套類和非嵌套類,前者是聲明在其他數(shù)據(jù)類型內(nèi)部的類。后者是直接定義在某一個命名空間的類。C# 中很少定義嵌套類。

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

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

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

      OuterClass.InnerClass  obj = new OuterClass.InnerClass();

      這個實例與外部類的任何實例沒有任何直接的關(guān)系。類似于Java中的靜態(tài)內(nèi)部類。

      二、類名.class 與類型

      在 java 中還經(jīng)?吹筋惷.class 的用法,這個用法相當于  C# 中的 typeof( 類名 ),用來獲取類型的類型對象實例引用。

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

      通過調(diào)用對象實例的 getClass() 方法獲取該對象的Class實例。

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

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

      C# 中獲取類型對象實例的方式更加簡單明確一些。

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

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

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

       三、匿名類

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

      this.listener0 = new OnClickListener() {

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

      在這里,OnClickListenter 實際上是一個接口,接口能用來創(chuàng)建對象實例嗎?當然不能。

      所以,java 在這里自動創(chuàng)建一個實現(xiàn)接口的匿名類,我們創(chuàng)建出來的實際上就是這個匿名類的對象實例。

      這樣做的好處就是我們沒有必須再定義一個只使用一次的類,然后再通過這個類創(chuàng)建對象實例,簡化了程序的開發(fā)。

      比如,我們有下面的一個接口。

      public interface myInterface {
          void onClick();
      }

      就可以通過接口創(chuàng)建一個實現(xiàn)接口的匿名類的對象實例,然后使用這個對象實例。

      myInterface instance = new myInterface(){

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

      在 C# 中,我們根本就不會使用這種形式,通過委托,可以非常簡單地實現(xiàn)同樣的功能。

       注意,java 中是沒有委托的。

      如果我們輸出一下這個實例的類型,你會看到這個匿名類的實際類型的。

      System.out.println( instance.getClass());
      
      //  class core.sisheng.Study1$1
      四、屬性(Property)
      
      屬性的概念對大家來說應(yīng)該是很熟悉的,類成員函數(shù)可以自由地訪問本類中的任何屬性成員。不過若要從一個類中去訪問另一個類中的屬性,那就比較麻煩了,所以很多時候我們使用Getxxx和Setxxx方法,這樣看起來顯得極不自然,比如用Java或者C++,代碼是這樣的:
      
      foo.setSize (getSize () + 1);   
      label.getFont().setBold (true);   
      但是,在C#中,這樣的方法被“屬性化”了。同樣的代碼,在C#就變成了:   
      foo.size++;   
      label.font.bold = true;  
          可以看出來,C#顯然更容易閱讀和理解。我們從這個“屬性方法”的子程序代碼中,也可以看到類似情況:
      
      Java/C++:   
      public int getSize()   
      {   
      return size;   
      }   
      public void setSize (int value)   
      {   
      size = value;   
      }   
      C#:   
      public int Size   
      {   
       get{return size;}   
       set{size = value;}   
      }  
      為了區(qū)分這種屬性化的方法和類的屬性成員,在C#中把屬性成員稱作“域(field)”,而“屬性”則成為這種“屬性化的方法”專用的名詞。順便說一句,其實這樣的屬性化方法在VB和DELPHI中是經(jīng)常碰到的,在VB中它也就叫屬性。另外,在C#中Get和Set必須成對出現(xiàn),一種屬性不能只有Get而沒有Set(在Java和C++中就可以只有Get或者只有Set),C#中這樣做的好處在于便于維護,假如要對某種屬性進行修改,就會同時注意Get和Set方法,同時修改,不會改了這個忘了那個。
      
      五、對象索引機制(Indexer)
      
      C#中引入了對象索引機制。說得明白點,對象索引其實就是對象數(shù)組。這里和上一節(jié)中的屬性聯(lián)系起來講一下,屬性需要隱藏Get和Set方法,而在索引機制中,各個對象的Get或者Set方法是暴露出來的。比如下面的例子就比較清楚地說明了這一點。以上介紹C#和Java不同點
      
      public class Skyscraper  
      {  
       Story[] stories;  
       public Story this [int index] {  
      get {  
       return stories [index];  
      }  
      set {  
       if (value != null) {  
       
      stories [index] = value;  
       }  
      }  
       }  
      ...  
      } 
      以上介紹C#和JAVA得不同點,希望對你了解C#和JAVA有所幫助。
      

        推薦文章

        沒有數(shù)據(jù)