Klik jika Anda menyukai proyek ini. Kontribusi Anda sangat kami harapkan.
Multithread
Koleksi
Konektivitas Basis Data Java (JDBC)
Program Java
Metode String Java
Halaman Server Jakarta (JSP)
Servlet
Soal Pilihan Ganda Java
Pola Desain Java
Hibernasi
Dasar-dasar Kerangka Musim Semi
Perkenalan
Arsitektur Jawa
Tipe Data Java
Metode Java
Pemrograman Fungsional Java
Ekspresi Java Lambda
Kelas Jawa
Konstruktor Java
Array Jawa
String Java
Refleksi Jawa
Aliran Java
Ekspresi Reguler Java
Penanganan File Java
Pengecualian Jawa
Warisan Jawa
Penggantian Metode Java
Polimorfisme Jawa
Abstraksi Java
Antarmuka Java
Enkapsulasi Java
Generik Java
Aneka ragam
Metode antarmuka secara default;
Ekspresi Lambda;
Antarmuka fungsional;
Referensi metode dan konstruktor;
Anotasi yang dapat diulang
Anotasi pada tipe data;
Refleksi untuk parameter metode;
Streaming API untuk bekerja dengan koleksi;
Penyortiran array secara paralel;
API baru untuk bekerja dengan tanggal dan waktu;
Mesin Nashorn JavaScript Baru;
Menambahkan beberapa kelas baru untuk pengoperasian thread yang aman;
Menambahkan API baru untuk Calendar
dan Locale
;
Menambahkan dukungan untuk Unicode 6.2.0;
Menambahkan kelas standar untuk bekerja dengan Base64 ;
Menambahkan dukungan untuk aritmatika yang tidak ditandatangani;
Peningkatan konstruktor java.lang.String(byte[], *)
dan kinerja metode java.lang.String.getBytes()
;
Implementasi baru AccessController.doPrivileged
yang memungkinkan Anda menyetel subset hak istimewa tanpa harus memeriksa semua * tingkat akses lainnya;
Algoritma berbasis kata sandi menjadi lebih kuat;
Menambahkan dukungan untuk Indikasi Nama Server SSL / TLS (NSI) di Server JSSE;
Penyimpanan kunci yang ditingkatkan (KeyStore);
Menambahkan algoritma SHA-224;
Menghapus Jembatan JDBC - ODBC;
PermGen dihapus, metode penyimpanan metadata kelas diubah;
Kemampuan untuk membuat profil untuk platform Java SE, yang tidak mencakup seluruh platform, tetapi sebagian darinya;
Peralatan
Menambahkan utilitas jjs
untuk menggunakan JavaScript Nashorn;
Perintah java
dapat menjalankan aplikasi JavaFX;
Menambahkan utilitas jdeps
untuk menganalisis file .class.
↥ kembali ke atas
Nashorn adalah mesin JavaScript yang dikembangkan di Java oleh Oracle. Dirancang untuk memberikan kemampuan menyematkan kode JavaScript dalam aplikasi Java. Dibandingkan dengan Rhino, yang didukung oleh Mozilla Foundation, Nashorn memberikan kinerja 2 hingga 10 kali lebih baik, karena ia mengkompilasi kode dan mentransfer bytecode ke mesin virtual Java langsung di memori. Nashorn dapat mengkompilasi kode JavaScript dan menghasilkan kelas Java yang dimuat dengan loader khusus. Dimungkinkan juga untuk memanggil kode Java langsung dari JavaScript.
↥ kembali ke atas
jjs
- Ini adalah utilitas baris perintah yang memungkinkan Anda menjalankan program JavaScript langsung di konsol.
↥ kembali ke atas
Di Java, ada tiga cara berbeda untuk membaca masukan dari pengguna di lingkungan baris perintah (konsol).
1. Menggunakan Kelas Pembaca Buffer:
Cara ini digunakan dengan membungkus System.in ( standard input stream ) dalam InputStreamReader yang dibungkus dengan BufferedReader, kita dapat membaca input dari pengguna di baris perintah.
/** * Kelas Pembaca Buffer */import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;uji kelas publik { public static void main(String[] args) throws IOException {/ // Enter data menggunakan BufferReader BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // Membaca data menggunakan readLine String nama = reader.readLine(); // Mencetak baris baca System.out.println(nama); } }
2. Menggunakan Kelas Pemindai:
Tujuan utama dari kelas Scanner adalah untuk mengurai tipe dan string primitif menggunakan ekspresi reguler, namun juga dapat digunakan untuk membaca masukan dari pengguna di baris perintah.
/** * Kelas Pemindai */import java.util.Scanner;class GetInputFromUser { public static void main(String args[]) { // Menggunakan Pemindai untuk Mendapatkan Masukan dari Pemindai Pengguna di = Pemindai baru(Sistem.dalam); String s = di.nextLine(); System.out.println("Anda memasukkan string " + s); int a = di.nextInt(); System.out.println("Anda memasukkan bilangan bulat " + a); float b = masuk.nextFloat(); System.out.println("Anda memasukkan float " + b); } }
3. Menggunakan Kelas Konsol:
Ini telah menjadi cara yang disukai untuk membaca masukan pengguna dari baris perintah. Selain itu, dapat digunakan untuk membaca masukan seperti kata sandi tanpa mengulangi karakter yang dimasukkan oleh pengguna; sintaks format string juga dapat digunakan (seperti System.out.printf() ).
/** * Kelas Konsol */Contoh kelas publik { public static void main(String[] args) { // Menggunakan Konsol untuk memasukkan data dari pengguna String name = System.console().readLine(); System.out.println(nama); } }
↥ kembali ke atas
Perintah javap menampilkan informasi tentang field, konstruktor, dan metode yang ada dalam file kelas. Perintah javap (juga dikenal sebagai Java Disassembler) membongkar satu atau lebih file kelas.
/** * Java Disassembler */class Simple { public static void main(String args[]) { System.out.println("Halo Dunia"); } }
cmd> javap Sederhana.kelas
Keluaran
Dikompilasi dari kelas ".java" Simple { Sederhana(); public static void main(java.lang.String[]); }
↥ kembali ke atas
System.out::println
? Ekspresi yang ditentukan mengilustrasikan penerusan referensi ke metode statis kelas println()
System.out
.
↥ kembali ke atas
Aliran bisa berurutan dan paralel. Operasi pada aliran berurutan dilakukan dalam satu utas prosesor, pada aliran paralel - menggunakan beberapa utas prosesor. Aliran paralel menggunakan aliran bersama ForkJoinPool
melalui metode statis ForkJoinPool.commonPool()
. Dalam hal ini, jika lingkungannya bukan multi-inti, maka aliran akan dieksekusi secara berurutan. Faktanya, penggunaan aliran paralel bermuara pada fakta bahwa data dalam aliran akan dibagi menjadi beberapa bagian, setiap bagian diproses pada inti prosesor yang terpisah, dan pada akhirnya bagian-bagian ini dihubungkan, dan operasi akhir dilakukan pada mereka.
Anda juga dapat menggunakan metode antarmuka parallelStream()
untuk membuat aliran paralel dari koleksi Collection
.
Untuk membuat aliran sekuensial reguler menjadi paralel, Anda harus memanggil metode Stream
pada objek parallel()
. Metode isParallel()
memungkinkan Anda mengetahui apakah alirannya paralel.
Dengan menggunakan metode parallel()
dan sequential()
dimungkinkan untuk menentukan operasi mana yang bisa paralel dan mana yang hanya berurutan. Anda juga dapat membuat aliran paralel dari aliran berurutan mana pun dan sebaliknya:
koleksi .sungai kecil () .peek ( ... ) // operasi berurutan .paralel () .map ( ... ) // operasi dapat dilakukan secara paralel, .berurutan () .reduce ( ... ) // operasi dilakukan secara berurutan lagi
Biasanya, elemen ditransfer ke aliran dalam urutan yang sama seperti yang ditentukan di sumber data. Saat bekerja dengan aliran paralel, sistem mempertahankan urutan elemen. Pengecualian adalah metode forEach()
yang dapat menampilkan elemen dalam urutan acak. Dan untuk menjaga ketertiban, perlu diterapkan metode forEachOrdered()
.
Kriteria yang dapat mempengaruhi kinerja dalam aliran paralel:
Ukuran data - semakin banyak data, semakin sulit memisahkan data terlebih dahulu, lalu menggabungkannya.
Jumlah inti prosesor. Secara teoritis, semakin banyak core dalam sebuah komputer, semakin cepat program tersebut bekerja. Jika mesin memiliki satu inti, tidak masuk akal menggunakan benang paralel.
Semakin sederhana struktur data tempat aliran bekerja, semakin cepat operasi akan terjadi. Misalnya, data dari ArrayList
mudah digunakan, karena struktur kumpulan ini mengasumsikan urutan data yang tidak terkait. Tetapi kumpulan tipe LinkedList
bukanlah pilihan terbaik, karena dalam daftar berurutan semua elemen terhubung dengan sebelumnya/berikutnya. Dan data seperti itu sulit untuk diparalelkan.
Operasi dengan tipe primitif akan lebih cepat dibandingkan dengan objek kelas.
Sangat disarankan agar Anda tidak menggunakan aliran paralel untuk operasi yang panjang (misalnya, koneksi jaringan), karena semua aliran paralel bekerja dengan satu ForkJoinPool
, operasi yang panjang tersebut dapat menghentikan semua aliran paralel di JVM karena kurangnya thread yang tersedia di kolam renang, dll. e. aliran paralel harus digunakan hanya untuk operasi pendek yang penghitungannya memakan waktu milidetik, tetapi tidak untuk operasi yang penghitungannya dapat memakan waktu detik dan menit;
Menyimpan pesanan dalam aliran paralel meningkatkan biaya eksekusi, dan jika pesanan tidak penting, penyimpanannya dapat dinonaktifkan dan dengan demikian meningkatkan produktivitas dengan menggunakan operasi perantara unordered()
:
koleksi.parallelStream() .diurutkan () .tidak berurutan () .collect ( Kolektor .toList ());
↥ kembali ke atas
Java Virtual Machine (JVM) adalah spesifikasi yang menyediakan lingkungan runtime di mana bytecode Java (file .class) dapat dieksekusi. JVM adalah platformnya. JVM bertindak sebagai mesin atau prosesor "virtual". Independensi platform Java sebagian besar terdiri dari Java Virtual Machine (JVM). JVM memungkinkan hal ini karena menyadari panjang instruksi spesifik dan kekhasan lain dari platform (Sistem Operasi).
JVM tidak bergantung pada platform. Java Virtual Machine (JVM) menyediakan lingkungan untuk mengeksekusi file java (file .Class). Jadi pada akhirnya itu tergantung pada kernel dan kernel berbeda dari OS (Sistem Operasi) ke OS. JVM digunakan untuk menerjemahkan bytecode ke dalam bahasa mesin untuk komputer tertentu dan juga menjalankan instruksi bahasa mesin yang sesuai.
↥ kembali ke atas
Kompiler Just-In-Time (JIT) adalah komponen lingkungan runtime yang meningkatkan kinerja aplikasi Java dengan mengkompilasi bytecode ke kode mesin asli pada waktu proses.
Program Java terdiri dari kelas-kelas, yang berisi bytecode platform-netral yang dapat diinterpretasikan oleh JVM pada banyak arsitektur komputer yang berbeda. Saat run time, JVM memuat file kelas, menentukan semantik setiap bytecode, dan melakukan komputasi yang sesuai. Penggunaan prosesor dan memori tambahan selama interpretasi berarti kinerja aplikasi Java lebih lambat dibandingkan aplikasi asli. Kompiler JIT membantu meningkatkan kinerja program Java dengan mengkompilasi bytecode menjadi kode mesin asli pada waktu proses. Kompiler JIT diaktifkan secara default. Ketika suatu metode telah dikompilasi, JVM memanggil kode yang dikompilasi dari metode tersebut secara langsung alih-alih menafsirkannya.
↥ kembali ke atas
Java ClassLoader adalah bagian dari Java Runtime Environment yang secara dinamis memuat kelas Java ke dalam Java Virtual Machine. Kode Java dikompilasi ke dalam file kelas oleh kompiler javac dan JVM mengeksekusi program Java, dengan mengeksekusi kode byte yang ditulis dalam file kelas. ClassLoader bertanggung jawab untuk memuat file kelas dari sistem file, jaringan, atau sumber lainnya.
Jenis Pemuat Kelas:
1. Pemuat Kelas Bootstrap :
Ini memuat file kelas JDK standar dari rt.jar dan kelas inti lainnya. Itu memuat file kelas dari jre/lib/rt.jar. Misalnya kelas paket java.lang.
2. Pemuat Kelas Ekstensi :
Ini memuat kelas dari ekstensi JDK secara langsung biasanya direktori JAVA_HOME/lib/ext
atau direktori lain seperti java.ext.dirs.
3. Pemuat Kelas Sistem :
Itu memuat kelas khusus aplikasi dari variabel lingkungan CLASSPATH. Ini dapat diatur saat menjalankan program menggunakan opsi baris perintah -cp atau classpath.
↥ kembali ke atas
1.JDK :
Java Development Kit adalah komponen inti Lingkungan Java dan menyediakan semua alat, executable, dan binari yang diperlukan untuk mengkompilasi, men-debug, dan menjalankan Program Java.
2.JVM :
JVM bertanggung jawab untuk mengubah kode Byte menjadi kode khusus mesin. JVM juga bergantung pada platform dan menyediakan fungsi inti Java seperti manajemen memori, pengumpulan sampah, keamanan, dll. JVM dapat disesuaikan dan kita dapat menggunakan opsi Java untuk menyesuaikannya, misalnya mengalokasikan memori minimum dan maksimum ke JVM. JVM disebut virtual karena menyediakan antarmuka yang tidak bergantung pada sistem operasi dan perangkat keras mesin yang mendasarinya.
2. JRE :
Java Runtime Environment menyediakan platform untuk menjalankan program java. JRE terdiri dari biner JVM dan Java serta kelas lain untuk menjalankan program apa pun dengan sukses.
↥ kembali ke atas
1. Ruang Tumpukan Java:
Ruang Java Heap digunakan oleh runtime java untuk mengalokasikan memori ke kelas Objects dan JRE. Setiap kali kita membuat objek apa pun, objek itu selalu dibuat di ruang Heap.
Pengumpulan Sampah berjalan pada memori heap untuk mengosongkan memori yang digunakan oleh objek yang tidak memiliki referensi apa pun. Objek apa pun yang dibuat di ruang heap memiliki akses global dan dapat direferensikan dari mana saja dalam aplikasi.
2. Memori Tumpukan Java:
Stack di java adalah bagian memori yang berisi metode , variabel lokal , dan variabel referensi . Variabel lokal dibuat di tumpukan.
Memori tumpukan selalu direferensikan dalam urutan LIFO (Last-In-First-Out). Setiap kali suatu metode dipanggil, blok baru dibuat di memori tumpukan agar metode tersebut dapat menyimpan nilai primitif lokal dan referensi ke objek lain dalam metode tersebut.
Segera setelah metode berakhir, blok tersebut menjadi tidak digunakan dan tersedia untuk metode berikutnya. Ukuran memori tumpukan sangat kecil dibandingkan dengan memori Heap.
Perbedaan:
Parameter | Memori Tumpukan | Ruang Tumpukan |
---|---|---|
Aplikasi | Stack digunakan sebagian, satu per satu selama eksekusi thread | Seluruh aplikasi menggunakan ruang Heap selama runtime |
Ukuran | Stack memiliki batasan ukuran tergantung pada OS dan biasanya lebih kecil dari Heap | Tidak ada batasan ukuran di Heap |
Penyimpanan | Hanya menyimpan variabel primitif dan referensi ke objek yang dibuat di Heap Space | Semua objek yang baru dibuat disimpan di sini |
Memesan | Itu diakses menggunakan sistem alokasi memori Last-in First-out (LIFO). | Memori ini diakses melalui teknik manajemen memori kompleks yang mencakup Generasi Muda, Generasi Tua atau Tetap, dan Generasi Permanen. |
Kehidupan | Memori tumpukan hanya ada selama metode saat ini berjalan | Ruang tumpukan ada selama aplikasi berjalan |
Efisiensi | Relatif lebih cepat untuk mengalokasikan jika dibandingkan dengan heap | Lebih lambat untuk dialokasikan jika dibandingkan dengan tumpukan |
Alokasi/Deallokasi | Memori ini secara otomatis dialokasikan dan dibatalkan alokasinya ketika suatu metode dipanggil dan dikembalikan | Ruang heap dialokasikan ketika objek baru dibuat dan dibatalkan alokasinya oleh Gargabe Collector ketika objek tersebut tidak lagi direferensikan |
↥ kembali ke atas
JVM adalah program yang mengambil bytecode Java dan mengubah kode byte (baris demi baris) menjadi kode yang dapat dimengerti mesin. JVM melakukan beberapa jenis operasi tertentu:
Memuat kode
Verifikasi kode
Menjalankan kode
Ini menyediakan lingkungan run-time kepada pengguna
Jenis area Memori yang dialokasikan oleh JVM:
1. Classloader : Classloader adalah subsistem JVM yang digunakan untuk memuat file kelas.
2. Area Kelas(Metode) : Area Kelas(Metode) menyimpan struktur per kelas seperti kumpulan konstanta runtime, data bidang dan metode, kode untuk metode.
3. Heap : Ini adalah area data runtime di mana objek dialokasikan.
4. Stack : Java Stack menyimpan frame. Ini menampung variabel lokal dan hasil parsial, dan berperan dalam pemanggilan dan pengembalian metode. Setiap thread memiliki tumpukan JVM pribadi, yang dibuat bersamaan dengan thread.
5. Register Penghitung Program : Register PC (penghitung program). Ini berisi alamat instruksi mesin virtual Java yang sedang dijalankan.
6. Tumpukan Metode Asli : Berisi semua metode asli yang digunakan dalam aplikasi.
↥ kembali ke atas
Konversi otomatis tipe data primitif menjadi tipe Wrapper yang setara dikenal sebagai boxing dan operasi sebaliknya dikenal sebagai unboxing.
Contoh: Autoboxing
/** * Autoboxing */class BoxingExample { public static void main(String args[]) { int a = 50; Bilangan bulat a2 = Bilangan bulat baru(a); // Tinju Integer a3 = 5; // Sistem Tinju.keluar.println(a2 + " " + a3); } }
Contoh: Membuka kotak
/** * Unboxing */class UnboxingExample { public static void main(String args[]) { Integer i = new Integer(50); int a = saya; Sistem.keluar.println(a); } }
↥ kembali ke atas
1. Sementara:
Pengubah sementara memberi tahu subsistem serialisasi objek Java untuk mengecualikan bidang tersebut saat membuat serialisasi sebuah instance kelas. Ketika objek kemudian dideserialisasi, bidang tersebut akan diinisialisasi ke nilai default; yaitu null untuk tipe referensi, dan nol atau salah untuk tipe primitif.
Contoh:
/** * Sementara */batas int sementara publik = 55; // tidak akan bertahanpublic int b; // akan bertahan
2. Volatil:
Pengubah volatil memberi tahu JVM bahwa penulisan ke bidang harus selalu di-flush ke memori secara sinkron, dan bahwa pembacaan bidang harus selalu dibaca dari memori. Ini berarti bahwa bidang yang ditandai sebagai mudah menguap dapat diakses dan diperbarui dengan aman dalam aplikasi multi-utas tanpa menggunakan sinkronisasi berbasis perpustakaan asli atau standar.
Contoh:
/** * Volatile */public class MyRunnable mengimplementasikan Runnable { private volatil boolean aktif; public void run() { aktif = benar; sementara (aktif) { } } public void stop() { aktif = salah; } }
↥ kembali ke atas
Penegasan memungkinkan pengujian kebenaran asumsi apa pun yang telah dibuat dalam program. Penegasan dicapai dengan menggunakan pernyataan tegas di Java.
Saat menjalankan pernyataan tersebut, diyakini kebenarannya. Jika gagal, JVM memunculkan kesalahan bernama AssertionError
. Ini terutama digunakan untuk tujuan pengujian selama pengembangan.
Pernyataan tegas digunakan dengan ekspresi Boolean dan dapat ditulis dengan dua cara berbeda.
// Cara pertama menegaskan ekspresi; // Cara kedua menegaskan ekspresi1 : ekspresi2;
Contoh:
/** * Pernyataan */public class Contoh { public static void main(String[] args) { int age = 14; tegaskan usia <= 18 : "Tidak Dapat Memilih"; System.out.println("Umur pemilih adalah " + umur); } }
↥ kembali ke atas
1. Variabel Akhir:
Variabel akhir tidak lain hanyalah konstanta. Kita tidak dapat mengubah nilai variabel akhir setelah diinisialisasi.
Contoh:
/** * Variabel Akhir */demo kelas { final int MAX_VALUE = 99; batalkan metode saya() { MAX_VALUE = 101; } public static void main(String args[]) { Demo obj = new Demo(); obj.metodesaya(); } }
Keluaran
Pengecualian di thread "utama" java.lang.Error: Masalah kompilasi yang belum terselesaikan: Bidang terakhir Demo.MAX_VALUE tidak dapat ditetapkan di pemulabook.com.Demo.myMethod(Details.java:6)di pemulabook.com.Demo.main(Details.java:10)
2. Variabel akhir kosong:
Variabel akhir yang tidak diinisialisasi pada saat deklarasi disebut variabel akhir kosong. Kita harus menginisialisasi variabel final yang kosong di konstruktor kelas jika tidak maka akan menimbulkan kesalahan kompilasi ( Error: variable MAX_VALUE might not have been initialized
).
Contoh:
/** * Variabel akhir kosong */kelas Demo { // Variabel akhir kosong final int MAX_VALUE; Demo() { // Ini harus diinisialisasi dalam konstruktor MAX_VALUE = 100; } void metode saya() { Sistem.keluar.println(MAX_VALUE); } public static void main(String args[]) { Demo obj = new Demo(); obj.metodesaya(); } }
Keluaran
100
3. Metode Terakhir:
Metode terakhir tidak dapat dikesampingkan. Artinya meskipun subkelas dapat memanggil metode terakhir dari kelas induk tanpa masalah apa pun, namun subkelas tidak dapat menimpanya.
Contoh:
/** * Metode Akhir */kelas XYZ { final void demo() { System.out.println("Metode Kelas XYZ"); } }kelas ABC extends XYZ { void demo() { System.out.println("Metode Kelas ABC"); } public static void main(String args[]) { ABC obj = new ABC(); obj.demo(); } }
↥ kembali ke atas
Jika tipe primitif atau string didefinisikan sebagai konstanta dan nilainya diketahui pada waktu kompilasi, kompiler akan mengganti nama konstanta di mana pun dalam kode dengan nilainya. Ini disebut konstanta waktu kompilasi.
Konstanta waktu kompilasi harus:
Dinyatakan final
Primitif atau String
Diinisialisasi dalam deklarasi
Diinisialisasi dengan ekspresi konstan
Mereka diganti dengan nilai aktual pada waktu kompilasi karena kompiler mengetahui nilainya terlebih dahulu dan juga mengetahui bahwa nilainya tidak dapat diubah selama run-time.
int akhir pribadi x = 10;
↥ kembali ke atas
penentu/pengubah akses membantu membatasi cakupan kelas, konstruktor, variabel, metode, atau anggota data.
Ada empat jenis pengubah akses yang tersedia di java:
default
– Tidak diperlukan kata kunci, ketika kelas, konstruktor, variabel, metode, atau anggota data dideklarasikan tanpa penentu akses apa pun maka ia memiliki cakupan akses default yaitu hanya dapat diakses dalam paket yang sama.
private
- ketika dideklarasikan sebagai private , cakupan akses dibatasi dalam kelas yang melingkupinya.
protected
- ketika dideklarasikan sebagai dilindungi, cakupan akses dibatasi pada kelas-kelas yang tercakup, subkelas-subkelas dari paket yang sama serta paket-paket lainnya.
public
- ketika dinyatakan sebagai publik, dapat diakses di mana saja dalam program.
... /* variabel anggota data */ String firstName="Pradeep"; /* cakupan default */ dilindungi isValid=true; /* cakupan yang dilindungi */ private String otp="AB0392"; /* cakupan pribadi */ public int id = 12334; /* ruang lingkup publik */ ... ... /* fungsi anggota data */ String getFirstName(){ return this.firstName; } /* cakupan default */ boolean terlindung getStatus(){this.isValid;} /* cakupan terlindung */ private void generateOtp(){ /* cakupan pribadi */ this.otp = this.hashCode() << 16; }; public int getId(){ kembalikan this.id; } /* ruang lingkup publik */ ... .../* kelas dalam */ kelas A{} /* cakupan default */ kelas terlindungi B{} /* cakupan terlindung */ kelas privat C{} /* cakupan privat */ kelas publik D{} /* cakupan publik */ ...
↥ kembali ke atas
Di Java, semua metode non-statis secara default adalah fungsi virtual . Hanya metode yang ditandai dengan kata kunci final
, yang tidak dapat diganti, bersama dengan private methods
, yang tidak diwariskan, yang bersifat non-virtual.
Contoh: Fungsi virtual dengan Antarmuka
/** * Fungsi applyBrakes() bersifat virtual karena * fungsi dalam antarmuka dirancang untuk diganti. **/antarmuka Sepeda { void applyBrakes(); }class ACMEBicycle mengimplementasikan Sepeda { public void applyBrakes() { // Di sini kita mengimplementasikan applyBrakes() System.out.println("Rem diterapkan"); // fungsi } }
↥ kembali ke atas
Metode asli adalah metode Java (baik metode instan atau metode kelas) yang implementasinya juga ditulis dalam bahasa pemrograman lain seperti C/C++. Selain itu, metode yang ditandai sebagai asli tidak boleh memiliki isi dan harus diakhiri dengan titik koma:
Main.java:
kelas publik Utama { public native int intMethod(int i); public static void main(String[] args) { System.loadLibrary("Utama"); Sistem.keluar.println(Utama baru().intMethod(2)); } }
Utama.c:
#include <jni.h>#include "Main.h"JNIEXPORT jint JNICALL Java_Main_intMethod( JNIEnv *env, objek pekerjaan, jint i) { return i * i; }
Kompilasi dan Jalankan:
javac Main.javajavah -jni Maingcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux Main.cjava -Djava.library.path=. Utama
Keluaran
4
↥ kembali ke atas
Jika suatu metode dideklarasikan sebagai statis, maka metode tersebut merupakan anggota suatu kelas dan bukan milik objek kelas tersebut. Itu bisa dipanggil tanpa membuat objek kelas. Metode statis juga memiliki kekuatan untuk mengakses data statis anggota kelas.
Ada beberapa batasan yang dikenakan pada metode statis
Metode statis tidak dapat menggunakan anggota data non-statis atau memanggil metode non-statis secara langsung.
this
dan super
tidak dapat digunakan dalam konteks statis.
Metode statis hanya dapat mengakses data tipe statis (variabel instan tipe statis).
Tidak perlu membuat objek kelas untuk memanggil metode statis.
Metode statis tidak dapat ditimpa dalam subkelas
Contoh:
/** * Metode Statis */kelas Induk { static void display() { System.out.println("Kelas super"); } }public class Contoh extends Induk { void display() // mencoba mengganti display() { System.out.println("Sub class"); } public static void main(String[] args) { Obj induk = Contoh baru(); obj.display(); } }
Ini menghasilkan kesalahan waktu kompilasi. Outputnya adalah sebagai berikut -
Contoh.java:10: error: display() pada Contoh tidak dapat mengganti display() di Parentvoid display() // mencoba mengganti display() ^metode yang diganti adalah kesalahan static1
↥ kembali ke atas
Apa struktur dan fitur penggunaan ekspresi lambda? Lambda adalah sekumpulan instruksi yang dapat dipisahkan menjadi variabel terpisah dan kemudian dipanggil berulang kali di berbagai tempat dalam program.
Dasar dari ekspresi lambda adalah operator lambda , yang mewakili panah ->
. Operator ini membagi ekspresi lambda menjadi dua bagian: sisi kiri berisi daftar parameter ekspresi, dan sisi kanan sebenarnya mewakili isi ekspresi lambda, tempat semua tindakan dilakukan.
Ekspresi lambda tidak dijalankan dengan sendirinya, tetapi membentuk implementasi metode yang ditentukan dalam antarmuka fungsional. Penting bahwa antarmuka fungsional hanya berisi satu metode tanpa implementasi.
antarmuka Dapat dioperasikan { int hitung ( int x , int y ); }public static void main ( String [] args) { Operasi yang dapat dijalankan = (x, y) -> x + y; int hasil = operasi.hitung (10, 20); System.out.println (hasil); // 30 }
Faktanya, ekspresi lambda dalam beberapa hal merupakan bentuk singkatan dari kelas anonim internal yang sebelumnya digunakan di Java.
Ekspresi lambda eksekusi yang ditangguhkan - ini didefinisikan sekali di satu tempat program, dipanggil jika perlu, berapa kali dan di mana saja dalam program.
Parameter ekspresi lambda harus sesuai tipenya dengan parameter metode antarmuka fungsional:
operasi = ( int x, int y) - > x + y;// Saat menulis ekspresi lambda itu sendiri, jenis parameter tidak boleh ditentukan: (x, y) - > x + y;// Jika metode tidak menerima parameter apa pun, maka ditulis tanda kurung kosong, contoh: () - > 30 + 20 ;// Jika metode hanya menerima satu parameter, maka tanda kurung dapat dihilangkan: n - > n * n;
Ekspresi lambda di akhir tidak diperlukan untuk mengembalikan nilai apa pun.
antarmuka Dapat dicetak { void print( String s ); } public static void main ( String [] args) { Printer yang dapat dicetak = s -> System.out.println(s); printer.print("Halo dunia"); }// _ Blok lambda - ekspresi_ diapit oleh kurung kurawal . Ekspresi lambda - modular dapat digunakan di dalam blok bersarang, loop, `mendesain pernyataan if ` ` switch ', membuat variabel, dan sebagainya. D . Jika Anda memblokir lambda - ekspresi harus mengembalikan nilai, ekspresi tersebut secara eksplisit menerapkan `pernyataan pengembalian pernyataan ' :Operasi yang dapat dioperasikan = ( int x, int y) - > { jika (y == 0 ) { kembali 0 ; } lain { kembalikan x / y; } };
Melewati ekspresi lambda sebagai parameter metode
kondisi antarmuka { boolean Sesuai ( int n ); }jumlah int statis pribadi ( int [] angka, Kondisi kondisi) { int hasil = 0 ; for ( int i : angka) { if (kondisi.isAppropriate(i)) { hasil + = i; } } mengembalikan hasil; }public static void main ( String [] args) { System.out.println(jumlah ( int baru [] { 0 , 1 , 0 , 3 , 0 , 5 , 0 , 7 , 0 , 9 }, (n) - > n ! = 0 )); }
↥ kembali ke atas
Akses ke variabel lingkup eksternal dari ekspresi lambda sangat mirip dengan akses dari objek anonim.
variabel lokal yang tidak dapat diubah (secara efektif final - tidak harus ditandai sebagai final);
bidang kelas
variabel statis.
Metode default dari antarmuka fungsional yang diimplementasikan tidak diperbolehkan untuk diakses di dalam ekspresi lambda.
↥ kembali ke atas
Jika metode yang ada di kelas sudah melakukan semua yang diperlukan, maka Anda dapat menggunakan mekanisme referensi metode (method reference) untuk meneruskan metode ini secara langsung. Hasilnya akan sama persis seperti saat mendefinisikan ekspresi lambda yang memanggil metode ini.
Contoh:
antarmuka pribadi Terukur { public int length(String string); }public static void main ( String [] args) { Terukur a = String::length; System.out.println(a.length("abc")); }
Referensi metode berpotensi lebih efisien daripada menggunakan ekspresi lambda. Selain itu, mereka memberikan kompiler informasi yang lebih baik tentang tipenya, dan jika Anda dapat memilih antara menggunakan referensi ke metode yang ada atau menggunakan ekspresi lambda, Anda harus selalu menggunakan referensi metode.
↥ kembali ke atas
pada metode statis;
metode per contoh;
ke konstruktor.
↥ kembali ke atas
Kelas dalam yang bersarang dapat mengakses variabel instan pribadi apa pun dari kelas luar. Seperti variabel instan lainnya, kita dapat memiliki pengubah akses pengubah pribadi, terproteksi, publik, dan default.
Contoh:
/** * Kelas Dalam */kelas Luar { kelas Batin { pertunjukan kekosongan publik() { System.out.println("Dalam metode kelas bersarang"); } } } kelas Utama { public static void main(String[] args) { Luar.Bagian dalam = Bagian Luar baru().Batin baru(); di.tampilkan(); } }
Subkelas adalah kelas yang mewarisi metode atau metode dari superkelas.
Contoh:
/** * Sub Kelas */kelas Mobil { //...} class HybridCar memperluas Mobil { //...}
↥ kembali ke atas
1. Pemuatan Kelas Statis:
Membuat objek dan instance menggunakan kata kunci new
dikenal sebagai pemuatan kelas statis. Pengambilan definisi kelas dan instantiasi objek dilakukan pada waktu kompilasi.
Contoh:
/** * Pemuatan Kelas Statis */kelas TestClass { public static void main(String args[]) { TestClass tc = new TestClass(); } }
2. Pemuatan Kelas Dinamis:
Memuat kelas menggunakan metode Class.forName()
. Pemuatan kelas dinamis dilakukan ketika nama kelas tidak diketahui pada waktu kompilasi.
Contoh:
/** * Pemuatan Kelas Dinamis */Class.forName (String className);
↥ kembali ke atas
1. Kelas Waktu Proses:
Kelas java.lang.Runtime adalah subkelas dari kelas Object, menyediakan akses ke sistem runtime Java. Informasi runtime seperti ketersediaan memori, pemanggilan pengumpul sampah, dll.
Contoh:
/** * Kelas Runtime */public class RuntimeTest { kelas statis Pesan extends Thread { public void run() { System.out.println(" Keluar"); } } public static void main(String[] args) { coba { Runtime.getRuntime().addShutdownHook(Pesan baru()); System.out.println("Program Dimulai..."); System.out.println("Tunggu 5 detik..."); Thread.tidur(5000); System.out.println("Program Berakhir..."); } catch (Pengecualian e) { e.printStackTrace(); } } }
2. Kelas Sistem:
Tujuan kelas sistem adalah untuk menyediakan akses ke sumber daya sistem. Ini berisi aksesibilitas ke input standar, output standart, aliran output kesalahan, waktu saat ini di Millis, mengakhiri aplikasi, dll.
↥ Kembali ke atas
1. Menggunakan kata kunci baru:
Objek myObject = myObject baru ();
2. Menggunakan class.forname ():
MyObject object = (myobject) class.forname ("Subin.rnd.myObject"). NewInstance ();
3. Menggunakan clone ():
MyObject OtherObject = new MyObject (); MyObject Object = (MyObject) OtherObject.clone ();
4. Menggunakan deserialisasi objek:
ObjectInputStream instream = new ObjectInputStream (anInputStream); myObject object = (myobject) instream.readObject ();
↥ Kembali ke atas
Objek abadi adalah objek yang tidak berubah. Objek immutable Java harus memiliki semua bidangnya sebagai bidang akhir pribadi. Itu tidak boleh menerapkan setter apa pun. Perlu konstruktor yang mengambil nilai untuk setiap bidang tunggal.
Membuat objek yang tidak dapat diubah:
Jangan menambahkan metode setter apapun
Menyatakan semua bidang final dan pribadi
Jika suatu bidang adalah objek yang dapat berubah, buat salinan defensifnya untuk metode pengambil
Jika objek yang dapat berubah yang diteruskan ke konstruktor harus ditugaskan ke bidang, buat salinan defensifnya
Jangan biarkan subclass mengesampingkan metode.
/** * objek yang tidak dapat diubah */kelas publik datecontainer {tanggal tanggal akhir privat; public datecontainer () {this.date = new date (); } tanggal publik getDate () {return date baru (date.getTime ()); } }
↥ Kembali ke atas
Kelas immutable berarti bahwa begitu suatu objek dibuat, kami tidak dapat mengubah kontennya. Di Java, semua kelas pembungkus (seperti integer, boolean, byte, pendek) dan kelas string tidak dapat diubah.
Aturan untuk membuat kelas yang tidak berubah:
Kelas harus dinyatakan sebagai final
Anggota data di kelas harus dinyatakan sebagai final
Konstruktor parameterisasi
Metode pengambil untuk semua variabel di dalamnya
Tidak ada setter
/** * Kelas Immutable */Publik Kelas Akhir Publik {Final String PancardNumber; Pegawai Publik (String PancardNumber) {this.pancardNumber = PancardNumber; } public String getPancardNumber () {return pancardNumber; } }
↥ Kembali ke atas
Bootstrap ClassLoader adalah repsonsible untuk memuat file JDK Class standar dari RT.Jar dan itu adalah induk dari semua loader kelas di Java. Ada tiga jenis classloader bawaan di java:
1. Bootstrap Class Loader: Memuat kelas internal JDK, biasanya memuat Rt.jar dan kelas inti lainnya misalnya Java.lang.* Kelas paket
2. Extensions Class Loader: Ini memuat kelas dari direktori JDK Extensions, biasanya $ java_home/lib/ext directory.
3. System Class Loader: Ini memuat kelas dari ClassPath saat ini yang dapat diatur saat memohon program menggunakan -CP atau -ClassPath Opsi Baris Perintah.
/** * ClassLoader */impor java.util.logging.level; import java.util.logging.logger; kelas publik classloaderTest {public static void main (string args []) {coba {// cetak classloader dari sistem kelas ini .out.println ("ClassLoader:" + ClassLoaderTest.class.getClassLoader ()); // Mencoba memuat kelas ini secara eksplisit lagi menggunakan class class loader class.forname ("secara eksplisit memuat kelas", true, classloaderTest.class.getClassLoader (). getParent ()); } catch (classNotFoundException ex) {logger.getLogger (classLoaderTest.class.getName ()). Log (level.severe, null, ex); } } }
↥ Kembali ke atas
Berbagai cara untuk membuat objek di java
Menggunakan kata kunci baru:
kelas ObjectCreationexample {string pemilik; } kelas publik MainClass {public static void main (string [] args) {// Di sini kita membuat objek jbt menggunakan kunci kata kunci yang baru creationexample obj = new ObjectCreationexample (); } }
Menggunakan instance baru (refleksi)
kelas CreateObjectClass {static int j = 10; createObjectClass () {i = j ++; } int i; @Overridepublic string toString () {return "nilai i:" + i; } } class mainClass {public static void main (string [] args) {try {class cls = class.forname ("createObjectClass"); createObjectclass obj = (createObjectclass) cls.newInstance (); (); System.out.println (obj); System.out.println (OBJ1); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } catch (InstantiationException e) {E.PrintStackTrace (); } catch (ilegalAccessException e) {e.printstacktrace (); } } }
Menggunakan klon:
kelas CreateObjectWlone mengimplementasikan clonable {@OverrideProtected Object Clone () melempar clonenotsupportedException {return super.clone (); } int i; static int j = 10; createObjectWithClone () {i = j ++; } @Overridepublic string toString () {return "nilai i:" + i; } } class mainClass {public static void main (string [] args) {createObjectWithClone obj1 = new CreateObjectWlone (); System.out.println (obj1); coba {createObjectWithClone obj2 = (createObjectWithClone) Obj1.clone (); System.out. println (obj2); } catch (clonenotsupportedException e) {e.printstacktrace (); } } }
Menggunakan ClassLoader
kelas createObjectWithClassLoader {static int j = 10; createObjectWithclassLoader () {i = j ++; } int i; @Overridepublic string toString () {return "nilai i:" + i; } } kelas publik MainClass {public static void main (string [] args) {createObjectWithClassLoader obj = null; coba {obj = (createObjectWithClassLoader) baru MainClass (). getClass () .getClassLoader (). LoadClass ("CreateObjectWithClassLoader"). NewInstance (); // Nama kelas yang memenuhi syarat harus digunakan. } catch (InstantiationException e) {E.PrintStackTrace (); } catch (ilegalAccessException e) {e.printstacktrace (); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } System.out.println (OBJ); } }
↥ Kembali ke atas
Kelas objek adalah kelas induk dari semua kelas di Java secara default.
Metode | Keterangan |
---|---|
Kelas Akhir Publik GetClass () | Mengembalikan objek kelas kelas dari objek ini. Kelas kelas selanjutnya dapat digunakan untuk mendapatkan metadata kelas ini. |
hashcode int publik () | Mengembalikan nomor kode hash untuk objek ini. |
Public Boolean Equals (objek OBJ) | membandingkan objek yang diberikan dengan objek ini. |
Clone objek yang dilindungi () melempar clonenotsupportedException | Membuat dan mengembalikan salinan (klon) yang tepat dari objek ini. |
string publik tostring () | Mengembalikan representasi string dari objek ini. |
public final void notify () | Bangun utas tunggal, menunggu monitor objek ini. |
public final void notifyall () | Bangun semua utas, menunggu di monitor objek ini. |
public final void tunggu (waktu lama) melempar interrupted exception | Menyebabkan utas saat ini menunggu milidetik yang ditentukan, sampai utas lain memberi tahu (Invokes notify () atau metode notifyall ()). |
public final void tunggu (waktu lama, int nano) melempar interrupted exception | menyebabkan utas saat ini menunggu milidetik dan nanoseconds yang ditentukan, sampai utas lain memberi tahu (Invokes notify () atau metode notifyall ()). |
public final void wait () melempar interrupted exception | menyebabkan utas saat ini menunggu, sampai utas lain memberi tahu (Invokes notify () atau notifyall () metode). |
finalisasi void yang dilindungi () melempar yang bisa dilemparkan | dipanggil oleh pengumpul sampah sebelum objek dikumpulkan. |
↥ Kembali ke atas
Nilai opsional Optional
adalah wadah untuk objek yang mungkin atau mungkin tidak mengandung nilai null
. Pembungkus seperti itu adalah sarana pencegahan yang nyaman