Java: Pembuatan Objek dan Proses Inisialisasi
1. Jenis data di java
Ada 3 tipe data di Java: tipe data dasar (dalam java, boolean, byte, pendek, int, long, char, float, dan double adalah tipe data dasar), tipe referensi dan tipe nol. Di antara mereka, tipe referensi termasuk jenis kelas (termasuk array) dan tipe antarmuka.
Pernyataan berikut menyatakan beberapa variabel:
int k; a; // A adalah nama variabel objek dari tipe data A. B B1, B2,…, B10000; // Asumsikan bahwa B adalah kelas atau antarmuka abstrak. String s;
Catatan: Dari perspektif tipe dan variabel data, variabel tipe data dasar k, variabel tipe kelas A dan S, kelas abstrak atau jenis antarmuka variabel B (10.000), semua variabel (pengidentifikasi).
2. Tentang pegangan
Untuk membedakan antara pengidentifikasi variabel jenis referensi dan pengidentifikasi variabel tipe data dasar, kami secara khusus menggunakan pegangan untuk menyebutkan pengidentifikasi variabel jenis referensi. Dalam contoh di atas, B1 hingga B10000, A, dan S semuanya ditangani. Pegangan secara intuitif melihat pegangan dan pegangan. Kami menggunakan terjemahan "pegangan" Cina yang umum digunakan di dunia komputer.
2.1 [Dalam pemrograman Windows] Arti pegangan adalah bilangan bulat unik yang digunakan oleh keajaiban untuk mengidentifikasi objek yang dibuat atau digunakan oleh aplikasi. Windows menggunakan berbagai pegangan untuk mengidentifikasi seperti instance aplikasi, jendela, kontrol, bitmap, objek GDI, dll. Pegangan Windows sedikit seperti pegangan file dalam bahasa C.
Dari definisi di atas, kita dapat melihat bahwa pegangan adalah pengidentifikasi yang digunakan untuk mengidentifikasi suatu objek atau proyek. Itu seperti nama kami. Setiap orang akan memilikinya. Orang yang berbeda memiliki nama yang berbeda, tetapi mungkin juga ada seseorang dengan nama yang sama seperti Anda. Dari tipe data, itu hanya bilangan bulat 16-bit yang tidak ditandatangani. Aplikasi hampir selalu memperoleh pegangan dengan memanggil fungsi Windows, yang kemudian dapat digunakan oleh fungsi Windows lain untuk merujuk objek yang sesuai.
Jika Anda ingin tahu pegangan secara lebih teliti, saya dapat memberi tahu Anda bahwa pegangan adalah petunjuk bagi petunjuk. Kita tahu bahwa apa yang disebut pointer adalah alamat memori. Setelah aplikasi dimulai, objek yang membentuk program berada dalam memori. Jika kita memahaminya, tampaknya selama kita tahu alamat pertama dari memori ini, kita dapat menggunakan alamat ini untuk mengakses objek kapan saja. Tetapi jika Anda benar -benar berpikir begitu, Anda sangat salah. Kita tahu bahwa Windows adalah sistem operasi berbasis memori virtual. Dalam lingkungan sistem ini, Windows Memory Manager sering memindahkan objek bolak -balik dalam memori untuk memenuhi kebutuhan memori berbagai aplikasi. Objek dipindahkan berarti alamatnya telah berubah. Jika alamat selalu berubah seperti ini, di mana kita harus menemukan objek?
Untuk mengatasi masalah ini, sistem operasi Windows membebaskan beberapa alamat penyimpanan internal untuk setiap aplikasi untuk secara khusus mendaftarkan perubahan alamat dari setiap objek aplikasi dalam memori, dan alamat ini (lokasi unit penyimpanan) sendiri tetap tidak berubah. Setelah memindahkan lokasi objek dalam memori, Windows Memory Manager memberi tahu alamat baru objek untuk menyimpannya. Dengan cara ini, kita hanya perlu mengingat alamat pegangan ini untuk secara tidak langsung tahu di mana objek berada dalam memori. Alamat ini ditetapkan oleh sistem ketika objek dimuat (muat), dan dilepaskan ke sistem ketika sistem diturunkan.
Menangani alamat (stabil) → Catat alamat objek dalam memori dengan olak -ilangan ilangan ─ "Alamat objek dalam memori (tidak stabil) → objek aktual
2.2 Makna pegangan di Java memiliki pemahaman yang mendalam tentang makna pegangan [dalam pemrograman Windows]. Kita dapat mengatakan bahwa pegangan adalah istilah yang sangat kita butuhkan saat belajar Java. Artinya adalah untuk membedakan "objek itu sendiri" dari variabel objek (atau ketegangan: pengidentifikasi variabel dari tipe data yang dimiliki objek).
2.3 Kembali ke Deklarasi Variabel di 1:
Sekarang, Anda harus memiliki pandangan yang jelas tentang komentar di bawah ini.
int k, j; // k menyimpan nomor integer. A A; // Alamat disimpan dalam a. B B1, B2,…, B10000; // B1,…, B10000 menyimpan alamat di dalamnya. String s; // S menyimpan alamatnya.
3. Tentang referensi
Apa itu "kutipan"? “Pengidentifikasi yang Anda manipulasi sebenarnya adalah 'referensi' untuk suatu objek”. (Berpikir di Java 2e)
Terjemahannya adalah: pengidentifikasi yang Anda manipulasi sebenarnya adalah "referensi" untuk suatu objek. Atau lebih tepatnya, diterjemahkan ke dalam: pengidentifikasi yang Anda operasikan sebenarnya adalah "referensi" ke suatu objek. Jelas, referensi dalam teks asli adalah sesuatu dengan rasa arah.
Kembali ke Java dan lihat nomor ID objek, ID objek, atau nomor ponsel objek. Tentu saja, lebih banyak pepatah adalah bahwa referensi adalah nomor kamar di mana objek hidup dalam memori. Berbicara secara intuitif, referensi ke suatu objek adalah nilai pengembalian saat membuat objek! Referensi adalah nilai pengembalian dari ekspresi baru.
a a () baru; Berikut adalah objek, tetapi kami tidak menggunakan pegangan untuk menahan (menahan, menahan, menyimpan) referensi. Dari perspektif mikroskopis, ekspresi baru melengkapi tugas inisialisasi objek (tiga langkah, analisis terperinci di bawah), dan secara keseluruhan, ia mengembalikan referensi.
Kembali ke deklarasi variabel dalam 1 lagi dan lihat komentar di bawah.
A A; // Deklarasikan pegangan A, tetapi tidak diinisialisasi, sehingga nilainya di dalamnya adalah nol. B B1, B2,…, B10000; // Deklarasikan menangani B1,…, B10000, tetapi tidak diinisialisasi, sehingga nilainya di dalamnya adalah NULL. String s; // Deklarasikan pegangan S, tetapi tidak diinisialisasi, sehingga nilainya di dalamnya adalah nol.
4. Hubungan antara pegangan dan referensi
A; // mendeklarasikan pegangan a, nilainya nulla = baru a (); // inisialisasi pegangan (pegangan = referensi; yaitu, tetapkan referensi ke pegangan)
Kutipan: Nilai A () baru. Referensi dapat dengan mudah dianggap sebagai alamat di mana objek menempati ruang memori; Melalui referensi ke objek, mereka dapat dengan mudah dibedakan dari objek lain, dan referensi adalah identitas unik dari objek.
Setelah pegangan diinisialisasi, Anda dapat menggunakan pegangan untuk mengontrol objek dari jarak jauh.
Tentu saja, ini hanya untuk menjelaskan penciptaan dan inisialisasi objek dari satu aspek. Setelah memahami hubungan antara pegangan dan referensi, seluruh proses inisialisasi objek dianalisis di bawah ini. Mari kita lakukan persiapan berikut terlebih dahulu, bicarakan tumpukan dan tumpukan.
5. Tumpukan dan Tumpukan di Java
Di Java, memori dibagi menjadi dua jenis: "Stack" dan "Heap" (tumpukan dan tumpukan). Tipe data dasar disimpan dalam "tumpukan", dan tipe referensi objek sebenarnya disimpan dalam "tumpukan", dan nilai alamat memori referensi hanya disimpan dalam tumpukan.
Ngomong -ngomong, mari kita bicara tentang metode "==" dan "Equals ()" untuk membantu memahami konsep keduanya (tumpukan dan heap).
Saat membandingkan variabel dengan "==" di Java, sistem menggunakan nilai yang disimpan dalam variabel dalam tumpukan sebagai dasar untuk perbandingan. Nilai yang disimpan dalam tipe data dasar di tumpukan adalah nilai penahanannya, dan nilai yang disimpan dalam jenis referensi di tumpukan adalah nilai alamat objek itu sendiri menunjuk ke. Kelas objek dalam paket java.lang memiliki metode Boolean Equals (objek OBJ) publik. Ini membandingkan apakah dua objek sama. Metode Equals () dari objek mengembalikan true hanya jika dua referensi dibandingkan titik dengan objek yang sama (pegangannya sama). (Sedangkan untuk metode Equals () dari kelas string, itu menimpa metode Equals () dan tidak dibahas dalam artikel ini.)
6. Pembuatan Objek dan Proses Inisialisasi
Dalam objek Java adalah instance dari kelas. Secara umum, ketika instantiasi kelas, semua anggota kelas semacam itu, termasuk variabel dan metode, disalin ke instance baru dari tipe data ini. Menganalisis dua kode berikut.
6.1 Kendaraan Kendaraan = Kendaraan Baru ();
Pernyataan di atas melakukan hal berikut:
"Kendaraan baru" di sebelah kanan menggunakan kelas kendaraan sebagai templat untuk membuat objek kelas kendaraan (juga disebut sebagai objek kendaraan) di ruang tumpukan.
② Akhir () berarti bahwa setelah objek dibuat, konstruktor kelas kendaraan segera dipanggil untuk menginisialisasi objek yang baru dihasilkan. Pasti ada konstruktor. Jika tidak dibuat, Java akan menambahkan konstruktor default.
③ "Kendaraan kendaraan" di sebelah kiri menciptakan variabel referensi kelas kendaraan.
④ Operator "=" membuat titik referensi objek ke objek kendaraan yang baru saja dibuat. (Recall Handles and Referensi)
Bagilah pernyataan di atas menjadi dua langkah:
Kendaraan kendaraan1; kendaraan = kendaraan baru ();
Lebih jelas menulis dengan cara ini. Ada dua entitas: satu adalah variabel referensi objek, dan yang lainnya adalah objek itu sendiri. Entitas yang dibuat di heap space berbeda dari yang dibuat di ruang tumpukan. Meskipun mereka adalah entitas yang memang ada, tampaknya sulit untuk secara akurat "menangkapnya". Mari kita pelajari kalimat kedua dengan hati -hati dan cari tahu apa nama objek yang baru saja Anda buat? Beberapa orang mengatakan itu disebut "kendaraan". Tidak, "Kendaraan" adalah nama kelas (templat pembuatan untuk objek). Kelas kendaraan dapat membuat objek yang tak terhitung jumlahnya berdasarkan ini, dan benda -benda ini tidak dapat disebut "kendaraan". Objek itu bahkan tidak memiliki nama, sehingga tidak dapat diakses secara langsung. Kami hanya dapat mengakses objek secara tidak langsung melalui referensi objek.
6.2 Kendaraan Kendaraan2;
veh2 = veh1;
Karena Veh1 dan Veh2 hanyalah referensi ke objek, apa yang dilakukan oleh baris kedua hanyalah menetapkan referensi (alamat) Veh1 ke Veh2, sehingga Veh1 dan Veh2 menunjuk ke objek kendaraan yang unik pada saat yang sama.
6.3 kendaraan = kendaraan baru ();
Variabel referensi VED2 menunjuk ke objek kedua sebagai gantinya.
Dideduksi dari pernyataan di atas, kita dapat menarik kesimpulan berikut: ① Referensi objek dapat menunjuk ke 0 atau 1 objek; ② Suatu objek dapat memiliki n referensi untuk menunjuk ke sana.
Java: Konversi Tipe Data
1. Jenis Java dan kelas enkapsulatornya yang sederhana
1.1 Java Jenis Sederhana dan Kelas Enkapsulasi Kita tahu bahwa bahasa Java adalah bahasa pemrograman yang berorientasi objek yang khas, tetapi mempertimbangkan keunggulan beberapa tipe data dasar yang sederhana dalam struktur, memori kecil dan kecepatan akses cepat, Java masih memberikan dukungan untuk tipe data sederhana yang tidak berorientasi pada objek ini. Tentu saja, ketika Java menyediakan sejumlah besar kelas lain, ia juga menyediakan kelas yang dienkapsulasi yang sesuai dengan tipe data sederhana. Oleh karena itu, Java memiliki tipe data yang berbeda seperti int dan integer (float dan float, double dan double ...).
Ada dua kategori utama tipe data dalam bahasa Java: satu adalah tipe sederhana, juga dikenal sebagai tipe utama (primitif), dan yang lainnya adalah jenis referensi (referensi). Variabel tipe sederhana menyimpan nilai tertentu, sedangkan variabel tipe referensi menyimpan referensi ke suatu objek.
Java menentukan ukuran setiap jenis sederhana. Ukuran ini tidak berubah dengan perubahan dalam struktur mesin. Ukuran ini invarian, yang merupakan salah satu alasan mengapa program Java memiliki portabilitas yang kuat.
Tabel berikut mencantumkan tipe sederhana, hunian bit biner dan kelas enkapsulator yang sesuai yang didefinisikan dalam Java.
Jenis Sederhana di Tabel Java
1.2 Mengapa menggunakan kelas enkapsulasi. Ambil Int dan Integer sebagai contoh. Meskipun pada dasarnya mereka mewakili bilangan bulat 32-bit, mereka adalah tipe data yang berbeda. Faktanya, bilangan bulat yang digunakan secara langsung dalam java adalah int (sejauh menyangkut int dan integer). Hanya ketika data harus muncul sebagai identitas objek, nilai integer harus dienkapsulasi ke dalam objek dengan intege encapsulator, int yang sesuai.
Misalnya: Untuk menambahkan bilangan bulat ke vektor dalam paket java.util, nilai integer harus dienkapsulasi dalam instance integer sebagai berikut:
Vektor v = vektor baru (); int k = 121; v.addelemt (bilangan bulat baru (k));
Selain itu, integer, sebagai kelas enkapsulator yang sesuai dengan int, menyediakan banyak metode, seperti metode konstruksi integer, metode konversi integer ke tipe numerik lainnya, dll., Yang tidak tersedia dalam data tipe int.
2. Konstanta di Jawa
Kita perlu memperhatikan jenis konstanta berikut.
2.1 Ketika konstanta integer heksadesimal diekspresikan dalam heksadesimal, mereka harus mulai dengan 0x atau 0x, seperti 0xff, 0x9a.
2.2 Octal Integer Constant Octal harus dimulai dengan 0, seperti 0123, 034.
2.3 Jenis panjang tipe panjang harus diakhiri dengan L, seperti 9L, 342L.
2.4 Konstanta Float Karena jenis default dari konstanta desimal adalah tipe ganda, f (f) harus ditambahkan setelah jenis float. Variabel dengan desimal juga memiliki tipe ganda secara default.
float f;
f = 1.3f; // f harus dinyatakan.
2.5 Konstanta Karakter Konstanta Karakter perlu dilampirkan dalam dua kutipan tunggal (perhatikan bahwa konstanta string dilampirkan dalam dua kutipan ganda). Karakter dalam akun Java untuk dua byte.
Beberapa karakter pelarian yang biasa digunakan.
①/R berarti menerima input keyboard, yang setara dengan menekan tombol Enter;
②/n berarti garis baru;
③/T mewakili karakter tab, yang setara dengan kunci tabel;
④/B mewakili kunci backspace, yang setara dengan kunci ruang belakang;
⑤/'berarti kutipan tunggal;
⑥/'' berarti kutipan ganda;
⑦ // berarti slash/.
3. Konversi antara tipe data sederhana
Ada dua cara untuk mengonversi antara jenis data sederhana: konversi otomatis dan konversi cor, yang biasanya terjadi ketika parameter ekspresi atau metode dilewatkan.
3.1 Konversi Otomatis Secara khusus, ketika data "kecil" dihitung bersama dengan data "besar", sistem akan secara otomatis mengubah data "kecil" menjadi data "besar" dan kemudian melakukan perhitungan. Saat memanggil metode ini, parameter aktual adalah "kecil" dan data parameter formal dari metode yang dipanggil adalah "besar" (jika ada kecocokan, tentu saja, metode pencocokan akan dipanggil secara langsung), sistem akan secara otomatis mengubah data "kecil" menjadi data "besar", dan kemudian memanggil metode tersebut. Secara alami, untuk beberapa metode yang kelebihan beban dengan nama yang sama, itu akan dikonversi menjadi data "tutup" besar "dan dipanggil.
Jenis-jenis ini dari "kecil" hingga "besar" adalah (byte, pendek, char)-int-long-float-double. Apa yang kita bicarakan di sini tidak merujuk pada jumlah byte yang ditempati, tetapi dengan ukuran kisaran yang mewakili nilainya.
Silakan lihat contoh berikut:
① Pernyataan berikut dapat langsung disahkan di Java:
byte b; int i = b; long l = b; float f = b; double d = b;
② Jika tipe tingkat rendah adalah tipe char, itu akan dikonversi ke nilai kode ASCII yang sesuai saat mengonversi ke tipe tingkat tinggi (tipe integral), misalnya
char c = 'c'; int i = c; System.out.println ("Output:"+i);
Keluaran:
Output: 99;
③Untuk tiga jenis byte, pendek, dan char, mereka horizontal, sehingga mereka tidak dapat secara otomatis saling mengonversi. Konversi tipe pemeran berikut dapat digunakan.
pendek i = 99; char c = (char) i; system.out.println ("output:"+c);Keluaran:
Output: C;
④Jika ada metode dalam polimorfisme objek:
f (byte x) {...}; f (pendek x) {...}; f (int x) {...}; f (long x) {...}; f (float x) {...}; f (double x) {...}; f (double x) {...}; Ada juga: char y = 'a'; Jadi, metode mana yang akan disebut pernyataan f (y)? Jawabannya adalah: f (int x) {...} Metode, karena parameter referensi formal "besar" dan merupakan "tertutup".
Dan untuk metode ini:
f (float x) {...}; f (double x) {...}; Ada juga: Long Y = 123L; Kemudian, metode yang dipanggil oleh pernyataan f (y) adalah f (float x) {...}.
3.2 Casting Saat mengonversi data "besar" menjadi data "kecil", Anda dapat menggunakan casting. Artinya, Anda harus menggunakan format pernyataan berikut:
int n = (int) 3.14159/2;
Seperti yang dapat Anda bayangkan, konversi ini tentu saja dapat menyebabkan overflow atau penurunan akurasi.
3.3 Secara otomatis meningkatkan jenis data ekspresi. Mengenai peningkatan jenis otomatis, perhatikan aturan berikut.
① Semua nilai byte, pendek, dan tipe char akan dipromosikan menjadi tipe int;
②Jika ada operan yang panjang, hasil perhitungannya panjang;
③Jika ada operan yang merupakan tipe float, hasil perhitungannya adalah tipe float;
④Jika ada operan yang tipe ganda, hasil perhitungannya adalah tipe ganda;
contoh,
byte b; B = 3; b = (byte) (b*3); // byte harus dinyatakan.
3.4 Konversi Jenis Transisi Untuk Kelas Kemasan Secara umum, kami pertama -tama mendeklarasikan variabel dan kemudian menghasilkan kelas pengemasan yang sesuai, dan kami dapat menggunakan berbagai metode kelas pengemasan untuk melakukan konversi jenis. Misalnya:
① Saat Anda ingin mengonversi float menjadi tipe ganda:
float f1 = 100.00F; Float f1 = float baru (f1); d1 d1 = f1.doublevalue (); // f1.doublevalue () adalah metode pengembalian jenis nilai ganda dari kelas float
②Ketika Anda ingin mengonversi tipe ganda menjadi tipe int:
Double D1 = 100.00; Double D1 = Double baru (D1); int I1 = D1.IntValue ();
Konversi variabel tipe sederhana ke kelas pembungkus yang sesuai, dan konstruktor kelas pembungkus dapat digunakan. Yaitu: boolean (nilai boolean), karakter (nilai char), integer (nilai int), panjang (nilai panjang), float (float nilai), ganda (nilai ganda)
Di setiap kelas pengemasan, selalu ada metode × nilai () untuk mendapatkan data tipe sederhana yang sesuai. Menggunakan metode ini, konversi antara variabel numerik yang berbeda juga dapat direalisasikan. Misalnya, untuk kelas tipe nyata presisi ganda, intvalue () dapat memperoleh variabel integer yang sesuai, dan doublevalue () dapat memperoleh variabel tipe nyata presisi ganda yang sesuai.
4. Konversi antara string dan jenis lainnya
4.1 Konversi jenis lain ke string ① Panggil metode konversi string kelas: x.tostring ();
② konversi otomatis: x+";
③ Metode Menggunakan String: String.VolueOf (x);
4.2 Konversi string ke tipe lain sebagai nilai ① Pertama mengonversinya ke instance wrapper yang sesuai, dan kemudian panggil metode yang sesuai untuk mengonversinya ke tipe lain. Misalnya, format mengkonversi nilai tipe ganda dari "32.1" dalam karakter adalah: float baru ("32.1"). DoubleValue (). Anda juga dapat menggunakan: double.valueof ("32.1"). DoubleValue ()
② metode parsexxx statis
String s = "1"; byte b = byte.parsebyte (s); pendek t = short.parseshort (s); int i = integer.parseint (s); long l = long.parselong (s); float f = float.parsefloat (s); double d = double.parsedouble (s);
Metode ③ karakter getNumericValue (char ch) dapat ditemukan di API.
5. Konversi kelas tanggal dan tipe data lainnya
Tidak ada korespondensi langsung antara bilangan bulat dan kelas tanggal, tetapi Anda dapat menggunakan tipe int untuk mewakili tahun, bulan, hari, jam, menit, dan detik masing -masing, sehingga korespondensi ditetapkan di antara keduanya. Saat melakukan konversi ini, Anda dapat menggunakan tiga bentuk konstruktor kelas tanggal:
①Date (tahun int, bulan int, tanggal int): Tipe int mewakili tahun, bulan, dan hari ②Date (tahun int, bulan int, tanggal int, int jam, int min): Jenis int, tahun, bulan, dan waktu yang sama, integen, intrence, intrence, intrence, intrence, intrence, intrence, int hrs, int hrs, int hrs, int hrs, int hrs, int hrs, int hrs, int, Kelas, yaitu, waktu dinyatakan sebagai jumlah milidetik dari 0:00:00, GMT pada 1 Januari 1970. Untuk korespondensi ini, kelas tanggal juga memiliki konstruktor yang sesuai: tanggal (tanggal panjang).
Dapatkan tahun, bulan, hari, jam, menit, kedua dan minggu di kelas tanggal. Anda dapat menggunakan getYear (), getMonth (), getDate (), getHours (), getminutes (), getSeconds (), getDay (), dan Anda juga dapat memahaminya sebagai mengubah kelas tanggal menjadi int.
Metode GetTime () dari kelas tanggal bisa mendapatkan nomor integer panjang yang sesuai dengan waktu yang kami sebutkan sebelumnya. Seperti kelas pembungkus, kelas tanggal juga memiliki metode tostring () yang dapat mengubahnya menjadi kelas string.
Terkadang kami ingin mendapatkan format tanggal tertentu, misalnya 20020324, kami dapat menggunakan metode berikut, pertama kali memperkenalkannya di awal file,
impor java.text.simpledateFormat; import java.util.*; java.util.date date = java.util.date baru (); // Jika Anda ingin mendapatkan format yyyymmdd SimpleDateFormat Sy1 = new SimpleDateFormat ("yyyymmdd"); string dateFormat = sy1.format (date); // Jika Anda ingin mendapatkan tahun, bulan, hari, SimpleDateFormat sy = new SimpleDateFormat ("yyyyy"); SimpleDateFormat sm = new SimpleDateFormat ("mm"); SimpleDateFormat sd = new SimpleDateFormat ("dd"); string syear = sy.format (date); string smon = sm.format (date); string sday = sd.format (date);