Perancang Java membenci kompleksitas C++, sehingga Java sangat ringkas, dan GC juga membuat manajemen memori menjadi sangat nyaman. C# tertarik dengan teknologi GC dan mesin virtual Java, dan berharap untuk mengintegrasikan beberapa bahasa utama Microsoft ke dalam .NET. . Oleh karena itu, C# tidak sederhana atau bahkan rumit dari segi bahasa.
Ide desain kedua bahasa juga berbeda. Java adalah bahasa yang dikompilasi dan diinterpretasikan, sedangkan C# adalah bahasa yang dikompilasi dan kemudian dikompilasi dan dijalankan. Java tidak memiliki delegasi, C# memiliki delegasi. Java cenderung menggunakan Antarmuka untuk mengimplementasikan fungsi delegasi, sedangkan di C#, Kelas Abstrak memainkan peran lebih besar daripada Antarmuka.
Java mengikuti aturan penamaan unta, dan C# mengikuti aturan penamaan Pascal. Namun kini semakin banyak orang Java yang mulai menggunakan C#, dan pada saat yang sama mereka menerapkan aturan penamaan unta ke C#, yang mungkin membuat kode C# semakin sulit dibaca. Mengapa C# tidak mengikuti camel? Saya tidak melihat ada yang buruk tentang konvensi penamaan unta.
1. Nama kelas.ini dan kelas dalam
Di Java, kita sering melihat penggunaan yang mirip dengan nama kelas. Ini adalah instance objek saat ini. Mengapa nama kelas muncul di depannya? Pemrogram C# akan bingung dengan ini.
Di Java, kelas dalam digunakan di banyak tempat, dan anggota kelas luar bahkan dapat diakses di kelas dalam. Saat ini, ketika menggunakan ini di kelas dalam, akan muncul pertanyaan tentang siapa ini, dan apa itu artinya. Apakah itu instance objek kelas dalam saat ini atau instance objek kelas luar saat ini?
Di Java, dengan menambahkan nama kelas kelas luar di depannya, berarti instance objek kelas luar saat ini digunakan di kelas dalam.
Mari kita lihat contoh di bawah ini.
//Definisi kelas eksternal
kelas publik Kelas Luar {
//Definisi kelas dalam
kelas privat InnerClass
{
// Tidak ada anggota id yang ditentukan di kelas dalam. Di sini kita mengakses anggota di kelas luar.
public int getId(){ return OuterClass.ini.id }
public void setId(int id) { Kelas Luar.ini.id = id;}
// Nama anggota didefinisikan di kelas dalam, dan anggota di kelas dalam diakses secara langsung.
nama String pribadi;
public String getName() { kembalikan nama ini;}
// Anda dapat menambahkan nama kelas dalam di depannya
public void setName(String nama) { InnerClass.ini.nama = nama;}
// Kelas dalam juga dapat mengakses anggota dengan nama yang sama di kelas luar, dan nama kelas luar perlu ditambahkan.
String publik getOuterName() { return OuterClass.nama ini;}
public void setOuterName(String nama) { OuterClass.this.name = nama;}
@Mengesampingkan
String publik keString()
{
return "Id: " + this.getId() + ", Nama Dalam: " + this.getName() + ", Nama Luar: " + this.getOuterName();
}
}
//Id dan nama anggota ditentukan di kelas eksternal
id int pribadi;
nama String pribadi;
innerInstance InnerClass pribadi;
Kelas Luar publik()
{
this.innerInstance = new InnerClass();
ini.innerInstance.setId(20);
this.innerInstance.setName("Tom");
this.innerInstance.setOuterName("Alice");
}
String publik keString()
{
kembalikan ini.innerInstance.toString();
}
}
Di C#, kelas dibagi menjadi kelas bersarang dan kelas non-bersarang. Kelas pertama adalah kelas yang dideklarasikan di dalam tipe data lain. Yang terakhir adalah kelas yang didefinisikan secara langsung dalam namespace tertentu. Kelas bersarang jarang didefinisikan dalam C#.
Kelas yang tidak tertanam hanya mengizinkan penggunaan kontrol akses publik dan internal, sedangkan kelas bawaan mengizinkan penggunaan kelima karakter kontrol akses, privat, dilindungi, dilindungi internal, publik, dan internal. Kelas dalam juga dapat mengakses semua metode kelas luar, termasuk metode instance dan metode privat, namun kelas dalam harus secara eksplisit meneruskan instance kelas luar.
Kelas dalam di C# dapat menggunakan tipe dan metode statis yang ditentukan oleh kelas eksternal, tetapi tidak dapat secara langsung menggunakan metode instan dari kelas eksternal. Oleh karena itu, masalah di atas tidak ada.
Dalam C#, kelas luar bertindak lebih seperti namespace untuk kelas dalam. Selama kontrol akses memungkinkan, Anda dapat menggunakan metode berikut untuk membuat sebuah instance dari objek kelas dalam.
OuterClass.InnerClass obj = new OuterClass.InnerClass(); Instance ini tidak mempunyai hubungan langsung dengan instance kelas luar mana pun. Mirip dengan kelas dalam statis di Java.
2. Nama kelas.kelas dan tipenya
Di Java, kita sering melihat penggunaan nama kelas.kelas. Penggunaan ini setara dengan typeof (nama kelas) di C#, yang digunakan untuk mendapatkan referensi instance objek tipe dari tipe tersebut.
Di Java, setiap kelas memiliki objek Kelas yang sesuai. Ketika sebuah kelas ditulis dan dikompilasi, objek Kelas dihasilkan dalam file .class yang dihasilkan untuk mewakili informasi tipe kelas. Tiga cara untuk mendapatkan instance Kelas:
Dapatkan instance Kelas dari objek dengan memanggil metode getClass() dari instance objek.
Gunakan metode statis forName() dari Kelas untuk mendapatkan instance Kelas menggunakan nama kelas. Class.forName(xxx.xx.xx) mengembalikan kelas. Fungsinya meminta JVM untuk menemukan dan memuat kelas yang ditentukan, yang berarti JVM akan mengeksekusi segmen kode statis kelas tersebut.
Dapatkan instance Kelas menggunakan nama kelas .calss. Untuk kelas enkapsulasi tipe data dasar, Anda juga dapat menggunakan .TYPE untuk mendapatkan instance Kelas dari tipe data dasar yang sesuai.
Cara untuk mendapatkan instance objek tipe di C# lebih sederhana dan jelas.
Diperoleh dengan memanggil metode GetType() dari instance data. Metode ini diwarisi dari Object, sehingga objek apa pun di C# memiliki metode GetType(), x.GetType(), di mana x adalah nama variabelnya.
x di typeof(x) harus berupa nama kelas tertentu, nama tipe, dll., dan tidak boleh berupa nama variabel.
Melalui metode statis System.Type.GetType() dari System.Type.
3. Kelas anonim
Di Java, kelas anonim juga lebih sering digunakan. Misalnya di Android, saat mengimplementasikan pemantauan tombol, Anda sering melihat kode seperti ini.
@Mengesampingkan
public void onClick(Lihat arg0) {
Maksud maksud = Maksud baru( MainActivity.this, ActivityFrameLayout.class);
setTitle("FrameLayout");
startActivity( maksud );
}
};
Di sini, OnClickListenter sebenarnya adalah sebuah antarmuka. Bisakah antarmuka digunakan untuk membuat instance objek? Tentu saja tidak.
Oleh karena itu, java secara otomatis membuat kelas anonim yang mengimplementasikan antarmuka di sini. Apa yang kita buat sebenarnya adalah turunan objek dari kelas anonim ini.
Keuntungannya adalah kita tidak perlu mendefinisikan kelas yang hanya digunakan satu kali, lalu membuat instance objek melalui kelas ini, sehingga menyederhanakan pengembangan program.
Misalnya, kami memiliki antarmuka berikut.
instance.onClick(); Dalam C#, kita tidak akan menggunakan formulir ini sama sekali. Melalui delegasi, fungsi yang sama dapat dicapai dengan sangat sederhana.
Perhatikan bahwa tidak ada delegasi di Jawa.
Jika kami mencetak tipe instance ini, Anda akan melihat tipe sebenarnya dari kelas anonim ini.
Konsep atribut harus familiar bagi semua orang. Fungsi anggota kelas dapat dengan bebas mengakses anggota atribut mana pun di kelas ini. Namun, lebih merepotkan untuk mengakses properti kelas lain dari satu kelas, sehingga sering kali kita menggunakan metode Getxxx dan Setxxx, yang terlihat sangat tidak wajar. Misalnya, di Java atau C++, kodenya seperti ini:
Namun, dalam C#, metode seperti itu "dikaitkan". Kode yang sama, di C#, menjadi:
foo.ukuran++;
label.font.bold = benar;
Seperti yang Anda lihat, C# jelas lebih mudah dibaca dan dipahami. Kita juga dapat melihat situasi serupa dari kode subrutin "metode properti" ini:
Jawa/C++:
C#:
Untuk membedakan metode yang diatribusikan ini dari anggota atribut kelas, anggota atribut disebut "bidang" dalam C#, dan "atribut" menjadi kata benda khusus untuk "metode yang dikaitkan" ini. Ngomong-ngomong, sebenarnya metode atribut semacam ini sering kita jumpai di VB dan DELPHI. Di VB disebut juga atribut. Selain itu, Get dan Set harus muncul berpasangan di C#. Properti tidak bisa hanya memiliki Get tanpa Set (di Java dan C++, hanya bisa memiliki Get atau only Set). pertahankan. Jika Anda ingin Saat memodifikasi atribut tertentu, Anda akan memperhatikan metode Dapatkan dan Set pada saat yang sama dan memodifikasinya pada saat yang sama. Anda tidak akan mengubah ini dan melupakannya.
5. Mekanisme pengindeksan objek (Indexer)
Mekanisme pengindeksan objek diperkenalkan di C#. Untuk lebih jelasnya, indeks objek sebenarnya adalah array objek. Mari kita bahas tentang properti di bagian sebelumnya. Properti perlu menyembunyikan metode Dapatkan dan Set, tetapi dalam mekanisme indeks, metode Dapatkan atau Set dari setiap objek diekspos. Misalnya, contoh berikut menggambarkan hal ini dengan lebih jelas. Di atas memperkenalkan perbedaan antara C# dan Java
cerita [indeks] = nilai;
}
}
}
...
}
Di atas memperkenalkan perbedaan antara C# dan JAVA. Saya harap ini dapat membantu Anda dalam memahami C# dan JAVA.