程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> java與c#的區別、兩者有什麼不同?

java與c#的區別、兩者有什麼不同?

編輯:更多關於編程

java與c#的區別、兩者有什麼不同?。本站提示廣大學習愛好者:(java與c#的區別、兩者有什麼不同?)文章只能為提供參考,不一定能成為您想要的結果。以下是java與c#的區別、兩者有什麼不同?正文


Java 的設計者是由於厭惡C++的復雜,於是Java 十分簡約,GC 也讓內存管理十分方便,C# 是看中了Java 的GC,和虛擬機技術,希望把微軟的幾大言語集成到.NET 下去。 因而C#從言語下去講並不復雜甚至可以算的上復雜。

兩種言語的設計思緒也不一樣,Java 是編譯解釋言語,C#是編譯然後編譯運轉言語。Java 沒有委托,C# 有委托。Java 傾向於用Interface 完成委托的功用,而 在C# 中,Abstract Class 比Interface 發揚了更大功用。

Java 遵照camel 命名規則,C#遵照Pascal 命名規則。但是如今越來越多的Java 人開端運用C#, 同時也把camel 命名規則帶到了C#,這能夠會讓C#代碼越來越難讀。為什麼現在C#為什麼不遵照camel 呢? 我看不出camel 命名規則有什麼不好的。

一. 類名.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實例的三種方式:

經過調用對象實例的 getClass() 辦法獲取該對象的Class實例。

運用Class的靜態辦法forName(),用類的名字獲取一個Class實例。Class.forName(xxx.xx.xx) 前往的是一個類, 作用是要求JVM查找並加載指定的類,也就是說JVM會執行該類的靜態代碼段。

類名.calss的方式獲取Class實例,對根本數據類型的封裝類,還可以采用.TYPE來獲取對應的根本數據類型的Class實例。

C# 中獲取類型對象實例的方式愈加復雜明白一些。

經過調用數據實例的 GetType() 辦法獲取,這個辦法承繼自Object,所以C#中任何對象都具有GetType()辦法,x.GetType(),其中x為變量名。

typeof(x)中的x,必需是詳細的類名、類型稱號等,不可以是變量稱號。

經過 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四、屬性(Property)


屬性的概念對大家來說應該是很熟習的,類成員函數可以自在地訪問本類中的任何屬性成員。不過若要從一個類中去訪問另一個類中的屬性,那就比擬費事了,所以很多時分我們運用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;}  

為了區分這種屬性化的辦法和類的屬性成員,在C#中把屬性成員稱作“域(field)”,而“屬性”則成為這種“屬性化的辦法”公用的名詞。特地說一句,其實這樣的屬性化辦法在VB和DELPHI中是常常碰到的,在VB中它也就叫屬性。另外,在C#中Get和Set必需成對呈現,一種屬性不能只要Get而沒有Set(在Java和C++中就可以只要Get或許只要Set),C#中這樣做的益處在於便於維護,假設要對某種屬性停止修正,就會同時留意Get和Set辦法,同時修正,不會改了這個忘了那個。

五、對象索引機制(Indexer)

C#中引入了對象索引機制。說得明白點,對象索引其實就是對象數組。這裡和上一節中的屬性聯絡起來講一下,屬性需求隱藏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有所協助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved