java 與 c# 一些不同之處

來源:互聯網
上載者:User

近幾日,看了一下 Android 開發,看到 java 與 C# 有許多不同的用法。

都是物件導向的語言,但是禪宗分南北,還是有不少用法上的不同,這裡總結一下。

一. 類名.this 與內部類

在 java 中,經常看到類似類名.this 的用法,this 就是當前對象執行個體,為什麼前面會出現類名呢?對此 C# 程式員會很納悶。

在 Java 中,很多地方使用到了內部類,甚至可以在在內部類中訪問外部類中的成員,這個時候,在內部類中使用 this 的時候,就會出現 this 到底是誰的問題,到底是表示內部類的當前對象執行個體,還是外部類的當前對象執行個體問題。

在 Java 中,通過在 this 的前面加上外部類的類名,表示在內部類中使用外部類的當前對象執行個體。

我們看下面的一個例子。

package core.sisheng;// 外部類定義public class OuterClass {        // 內部類定義    private class InnerClass    {        // 內部類中沒有定義 id 成員,這裡訪問外部類中的成員        public int getId(){    return OuterClass.this.id;    }        public void setId(int id) { OuterClass.this.id = id;}            // 內部類中定義了 name 成員,直接存取內部類中的成員, 預設 this 訪問當前類中的成員        private String name;        public String getName() { return this.name;}        // 可以在 this 的前面加上一個內部類的名稱        public void setName(String name) { InnerClass.this.name = name;}                // 內部類中也可以訪問外部類中同名的成員,需要加上外部類的名稱        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#中,類區分為嵌套類和非嵌套類,前者是聲明在其他資料類型內部的類。後者是直接定義在某一個命名空間的類。C# 中很少定義嵌套類。

非內嵌類只允許使用public和internal的存取控制,而內建類則允許使用所有的五種存取控制符,private, protected , internal protected,public和internal。內部類也可以訪問外部類的所有方法,包括instance方法和private方法,但是需要顯式 的傳遞一個外部類的執行個體。

C#中的內部類能夠使用外部類定義的類型和靜態方法,但是不能直接使用外部類的執行個體方法,因此,不存在上面的問題。

在C#中,外部類對於內部類的作用更像是一個命名空間,只要存取控制允許,就可以使用下面的方法建立內部類對象執行個體。

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

這個執行個體與外部類的任何執行個體沒有任何直接的關係。類似於Java中的靜態內部類。

二、類名.class 與類型

在 java 中還經常看到類名.class 的用法,這個用法相當於  C# 中的 typeof( 類名 ),用來擷取類型的類型對象執行個體引用。

java中,每個class都有一個相應的Class對象,當編寫好一個類,編譯完成後,在產生的.class檔案中,就產生一個Class對象,用來表示這個類的類型資訊。獲得Class執行個體的三種方式:

  1. 通過調用對象執行個體的 getClass() 方法擷取該對象的Class執行個體。
  2. 使用Class的靜態方法forName(),用類的名字擷取一個Class執行個體。Class.forName(xxx.xx.xx) 返回的是一個類, 作用是要求JVM尋找並載入指定的類,也就是說JVM會執行該類的靜態程式碼片段。
  3. 類名.calss的方式擷取Class執行個體,對基礎資料型別 (Elementary Data Type)的封裝類,還可以採用.TYPE來擷取對應的基礎資料型別 (Elementary Data Type)的Class執行個體。

C# 中擷取類型對象執行個體的方式更加簡單明確一些。

  1. 通過調用資料執行個體的 GetType() 方法擷取,這個方法繼承自Object,所以C#中任何對象都具有GetType()方法,x.GetType(),其中x為變數名。
  2. typeof(x)中的x,必須是具體的類名、類型名稱等,不可以是變數名稱。
  3. 通過 System.Type 的靜態方法 System.Type.GetType()。
 三、匿名類

在 java 中,匿名類的使用也比較多,比如在 Android 中,實現按鈕的監聽,經常會看到類似這樣的代碼。

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

在這裡,OnClickListenter 實際上是一個介面,介面能用來建立對象執行個體嗎?當然不能。

所以,java 在這裡自動建立一個實現介面的匿名類,我們建立出來的實際上就是這個匿名類的對象執行個體。

這樣做的好處就是我們沒有必須再定義一個只使用一次的類,然後再通過這個類建立對象執行個體,簡化了程式的開發。

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

public interface myInterface {    void onClick();}

就可以通過介面建立一個實現介面的匿名類的對象執行個體,然後使用這個對象執行個體。

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

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

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

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

System.out.println( instance.getClass());//  class core.sisheng.Study1$1

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.