Oleh :
Gede Thadeo Angga Kusuma (1315051003)
Dhyana Yurs Febrinto
(1315051064)
Class anak memiliki sebuah attribut nama dengan type string dan memilik access
modifier private, karenanya dibutuhkan sebuah public method untuk memanggil attribut private
yang dikenal dengan GETTER dan SETTER methode. Void setName(string newNama)
merupakan sebuah method untuk memberikan attribute nama sebuah nilai baru yang sudah kita
masukkan pada parameter newNama, namun method ini tidak mengembalikan nilai karena
terdapat Void di depannya.String getNama() tidak memiliki parameter namun memiliki return
berupa attribut nama. Jadi keismpulannya method GETTER diawali dengan Void tidak
memberikan return value namun SETTER diawali dengan tipe data yang ingin dikembalikan,
seperti contoh diatas kita ingin mengembalikan attribut nama dengan tipe string maka diawal kita
sebutkan tipe datanya diikuti dengan nama method dan return nama.
Dari class di atas kita akan implementasikan menjadi sebuah object dan coba memanggil
method atau fungsi dari object yang telah kita buat. Buat sebuah class Anak dengan nama
Tangkas.
Nama Object
Anaka Tangkas = new Anak();
Class ReferenceInstantiates a new object
Maka kita akan memiliki sebuah object dengan nama Tangkas. Setelah object dibuat kita
akan mencoba untuk mengakses method yang dimilikinya pada contoh di atas class Anak
memiliki dua method yaitu getNama() dan setNama(). Cara memanggil method dari sebuh object
yaitu <nama_object><titik = .><nama_method>
Tangkas.setNama(Tangkas);
Untuk lebih memperjelasnya kita akan membuat beberapa object dari
class Anak dan memanggil method yang dimilikinya.
Anaka anak1 = new Anak();
Anaka anak2 = new Anak();
anak1.setNama(Thadeo);
public
class Anak {
anak2.setNama(Wisnu);
private string nama;
System.out.println(anak1.getName());
private int umur;
System.out.println(anak2.getName());
Maka outputnya :
public Anak(string namaAnak) {
this.nama = namaAnak;
}
Thadeo
public void setNama(string newNama ){
Wisnu
this.nama = newNama;
2.2 Constructor
}
Constructor merupakan sebuah method yang dipanggil saat object dibuat atau untuk
public string getNama(){
menginisialisasikan nilai saat object dibuat. Dalam penulisan constructor nama method harus
return
memiliki nama yang
samanama;
dengan class, kita akan membuat sebuah constructor dari class Anak
} kita buat di atas.
yang sudah
public void setUmur(string newUmur ){
this.umur
= newUmur;
public Anak(string
namaAnak)
{
}this.nama = namaAnak;
} Kita akan tambahkan constructor di atas pada class Anak dengan beberapa tambahan.
public string getUmur(){
return umur;
}
\
Kemudian kita akan coba membuat sebuah object dari class Anak yang sudah
dimodifikasi
public classdengan
Anak {menggunakan constructor.
private
string=
nama;
Anak
anak1
new Anak("Thadeo");
private int umur;
Jadi dapat dilihat di pada kode di atas kita membuat object dengan menginisialisasikan
public Anak(){} // Constructor jika tak ada parameter
nama Thadeo secara langsung pada saat pembuatan object. Sekarang coba lihat pada class Anak
public Anak(string namaAnak) {
hal ini dikenal dengan polymorphism yang akan kita bahas pada bab selanjutnya. Kita akan
this.umur = newUmur;
modifikasi
kembali dan menambahkan dua lagi constructor.
} //Constroctur dengan dua paramter
public void setNama(string newNama ){
this.nama = newNama;}
public string getNama(){
return nama;}
public void setUmur(string newUmur ){
this.umur = newUmur;}
public string getUmur(){
return umur;}
}
object.
Menggunakan
static
member
dapat
dilakukan
dengan
sintaks
<class_reference>.<member_name>.
Kita akan tambahkan static member pada class Anak dengan type data int dan nama
umur_imunisais.
private static int umurImunisasi;
Dengan static member dan access modifier private kita perlu membuat sebuah setter dan
getter method untuk memanggil dan memberikan nilai pada attribut umur_Imunisasi.
public static void setUmurImunisasi(int newUmurImunisasi) {
this.umurImunisasi = newUmurImunisasi;
}
public static int UmurImunisasi () {
return umurImunisasi;
}
2.5 Asdas
private
public Anak(){}
Anak anak; // Penggunaan Multiple class
2.6 Dasdas
public OrangTua(){}
Anak(string namaAnak) {this.nama = namaAnak; }
2.7
public OrangTua
Anak(string
(string
namaAnak,
newNama,
int newUmur)
Anak newAnak)
{
{
this.namaOrtu
= newNama;
this.nama = namaAnak;
this.anak
this.umur =
= newAnak;
newUmur;
}
public void setNamaOrtu(string
setNama(string newNama
newNama
){this.nama
){
= newNama;}
this.namaOrtu
= newNama;}
public string
getNama(){return
nama;}
public string
void setUmur(string
getNamaOrtu(){
newUmur ){this.umur = newUmur;}
Class OrangTua;
returngetUmur(){return
namaOrtu;}
public string
umur;}
}
Pada class OrangTua bisa kita liat penggunaan class Anak pada class OrangTua dan juga
dimasukkan pada parameter constructor sebagai inisialisasi saat pembuatan object class
OrangTua. Berikut contoh penggunaan class diatas dalam pembuatan object.
Anak anak1 = new Anak(Tangkas,20);
OrangTua orangTua1 = new OrangTua(Ari Satria, anak1);
Pada sintak di atas bisa dilihat object anak1 di parsing pada constructor object orangTua1
sehingga menginisialisasikan nilai attribut anak pada orang tua dengan object anak1.
2.5 Interface
Interface merupakan sebuah class yang berisi deklarasi method abstract yang tidak ditulis
secara utuh atau lengkap. Deklarasi method pada interface mirip dengan method pada class
abstract. Variable pada interface bersifat static dan final sedangkan method bersifat public dan
abstract. Interface dapat digunalan dengan keyword Implements setelah nama class yang artinya
class yang mengimplement sebuah interface harus melengkapi seluruh method yang ada pada
interface tersebut. Contohnya disini kita akan membuat sebuah interface dengan nama
DaftarAnak dan memiliki beberapa method diantaranta tambah(), hapus(), dan tampil().
public interface DaftarAnak {
public void tambah(AnaknewAnak);
public void hapus(string name);
public void tampil();
}
Setelah kita membuat sebuah interface dengan nama Daftar Anak, kita akan
menggunakan interface tersebut pada class kita sehinga class kita harus menggunakan seluruh
method yang sudah di deklarasikan pada interface, kita kan membuat sebeuah class dengan nama
AnakSD2 dengan implementasi interface DaftarAnak sebagai berikut:
public class AnakSD2implements DaftarAnak{
public void tambah(AnaknewAnak){ sintak tambah }
public void hapus(string name){ sintak hapus }
public void tampil(){ sintak tampil }
//metod yang lainnya
}
Seperti sintak di atas seluruh method pada interface harus di implementasikan atau
dilengkapi jika tidak program akan mengembalikan error. Sebuah class dapae mengimplementasi
lebih dari satu interface contohnya :
public class AnakSD2implements DaftarAnak, DaftarOrangTua{}
2.6 Abstract Class
Class abstract digunakan untuk mendefinisikan sebuah class yang hanya mendeklarasikan
sebagian atau belum lengkap tanpa mengimplementasikan secara detail fungsi-fungsi dari kelas
abstrak yang ada. Penggunaan class abstract menggunakan keyword extends seperti class-class
yang lainnya berbeda dengan interface yang menggunakan keyword implements. Perintah
abstract diletakkan sebelum nama Class dan nama Method. Semua abstract method yang ada
dalam abstract class wajib diimplementasi/dilengkapi oleh semua class turunan (sub class) yang
bukan abstract.Berikut contoh pembuatan class abstract:
public abstract class DaftarAnak {
public abstract void tambah();
public abstract void hapus();
public abstract void tampil();
}
Selanjutnya kita buat implementasi atau cara penggunaan abstract class DaftarAnak.
public class AnakSD2extends DaftarAnak{
public void tambah(AnaknewAnak){ sintak tambah }
public void hapus(string name){ sintak hapus }
public void tampil(){ sintak tampil }
//metod yang lainnya
}
Class AnakSD2 merupakan turunan yang mengextends method abstract dari class abstract
DaftarAnaka. Class abstract tidak bisa dibuat menjadi sebuah object, hanya class yang semua
methodnya sudah diimplementasikan dan dilengkapi dapat di buat sebuah object. Berikut contoh
penggunaannya:
public class Test {
public static void main(String[] args) {
AnakSD2 daftar = new AnakSD2();
daftar.tambah();
daftar.tampil();
}
}
Method diatas di tambahkan di dalam class Anak, setelah ditambahkan berikut contoh
penggunaannya.
Anak anak1 = new Anak("Angga",12);
Anak anak2 = new Anak("Angga",12);
if (anak1.equals(anak2)) {
System.out.println("anak1 sama dengananak2");
} else {
System.out.println("anak1 berbeda dengananak2");
}
bentuk khusus untuk menggambarkan berbagai diagram program. UML diagram dapat dibagi
menjadi 3 bagian yaitu
1 Structure Diagrammenunjukkan arsitektur statis dari sistem terlepas dariwaktu.
2 Behaviour Diagram yang menggambarkan perilaku sistem atau proses bisnis.
3 InteractionDiagram yang menunjukkan metode, interaksi dan kegiatan dari obyek.
Strukture diagram terbagi menjadi beberapa bagian diantaranya :
1 Class diagram
Digaram yang memperlihatkan class, attribut, method dan relasi tiap class
2 Composite strukture diagram
Diagram yang menunjukan struktur internal classifier, termasuk poin interaksinya ke
3
4
Diagram ini mirip dengan flowchart yang menyediakan analis dengan kemampuan untuk
memodelkan proses dalam suatu sistem informasi
2. Use case diagram
Diagram ini bekerja dengan cara mendeskripsikan tipe interaksi antara user sebuah sistem
dengan sistemnya sendiri melalui sebuah alurpenggunaan sistem.
3. State machine diagram
Diagram ini digunakan untuk memodelkan perilaku dinamis satu kelas atau objek selama
masa hidupnya.
diagram
Class diagram
Class
Use CaseDiagram
Usecase diagram adalah diagram usecase yang digunakan untuk menggambarkan secara
ringkas siapa yang menggunakan sistem dan apa saja yang bisa dilakukannya. Diagram
usecase tidak menjelaskan secara detail tentang penggunaanusecase, namun hanya memberi
gambaran singkat hubungan antara usecase, aktor, dan sistem.
2.8.3.
SequenceDiagram
Sequence diagram adalah suatu diagram yang menggambarkan interaksi antar obyek dan
mengindikasikan komunikasi diantara obyek-obyek tersebut. Diagram ini juga menunjukkan
serangkaian pesan yang dipertukarkan oleh obyek obyek yang melakukan suatu tugas atau
aksi tertentu
Gambar 6.
Kuliah
Mendaftar
untuk
Mahasiswa
Gambar
3.1 Hubungan
antar kelas
Sebuah asosiasi tidak berarti bahwa selalu ada hubungan antara semua benda dari
satu kelas dan semua benda yang lain. Sebagai salah satu harapkan, dalam contoh kita,
link terbentuk antara objek Mahasiswa dan objek Kuliah hanya ketika operasi yang
menghubungkan mereka selesai, yaitu, mahasiswa diwakili oleh register objek
Mahasiswa untuk itu program tertentu. Namun, sebuah asosiasi yang menyiratkan bahwa
ada persisten, koneksi diidentifikasi antara dua kelas. Jika kelas A dikaitkan dengan kelas
B, berarti diberikan sebuah objek dari kelas A, Anda selalu dapat menemukan sebuah
objek dari kelas B, atau Anda dapat menemukan bahwa tidak ada objek B telah
ditetapkan asosiasi sebelumnya. Tapi dalam kedua kasus selalu ada jalan diidentifikasi
dari A ke B. Asosiasi demikian mewakili hubungan konseptual antara kelas serta
hubungan fisik antara objek-objek dari kelas-kelas.
Dalam hal pelaksanaan, apa yang dikatakan di atas menyiratkan bahwa kelas A harus
menyediakan mekanisme menggunakan konstruksi bahasa pemrograman yang dipilih
untuk membentuk link. Ini bisa mengambil beberapa bentuk, misalnya,
Kelas A menyimpan kunci (atau beberapa kunci) yang secara unik
Mahasiswa Mendaftar di
Bagian
1
Milik
Kuliah
dalam UML oleh annotating hubungan antara kelas. Beberapa ini dibahas di
bawah.
Hubungan Arity
Hubungan arity bisa menjadi satu-satu, satu-banyak, atau banyak-banyak.
Sebuah sistem multi user, bagaimanapun, dapat berinteraksi dengan beberapa
pengguna secara paralel.
Hubungan Penahanan
Agregasi adalah semacam asosiasi di mana objek dari kelas A 'terdiri dari'
objek kelas B. Hal ini menunjukkan beberapa jenis hubungan keseluruhanbagian antara A dan B. Komposisi menyiratkan bahwa setiap contoh dari
bagian milik hanya satu contoh dari keseluruhan, dan bahwa bagian itu tidak
bisa eksis kecuali sebagai bagian dari keseluruhan. Pada Gambar 3.3, tinggi
tidak bisa eksis kecuali itu adalah bagian dari segitiga.
Segi Gambar
Tiga 3.3 Komposisi diTinggi
kelas
Kelas Asosiasi
Sebuah asosiasi biasanya menghasilkan beberapa informasi yang
ditambahkan ke sistem karena menambahkan jalan yang menghubungkan dua
benda. Dalam beberapa situasi kita menambahkan beberapa informasi yang
memenuhi syarat alam dan menggambarkan sifat hubungan. Di luar konteks
asosiasi, informasi ini tidak memiliki relevansi dengan salah satu benda yang
terlibat. Dalam kasus seperti kita memperlakukan asosiasi itu sendiri sebagai
sebuah kelas. Contoh ini ditunjukkan pada Gambar 3.4. Ketika seorang
mahasiswa mendaftar di petugas pendaftaran, maka catatan pendaftaran dibuat
untuk menyimpan tanggal pendaftaran dan kelas. rekaman seperti itu tidak
masuk akal jika seorang mahasiswa tertentu tidak mendaftar di petugas
* mendaftar di*
Petugas pendaftaran
Mahasiswa
pendaftaran yang ditetapkan.
Pendaftaran
+ tanggal : date
+ Kelas : Char =12
3.2 Warisan
Warisan dapat didefinisikan sebagai mekanisme yang disediakan dalam bahasa
pemrograman untuk mencapai gagasan generalisasi vertikal. Secara formal, warisan
adalah hubungan ditandai dengan nenek moyang dan keturunan yang di wakili
menggunakan notasi UML seperti pada Gambar 3.5. Di sini, baseclass adalah leluhur dan
Derived class adalah keturunan. Kami mengambil satu kotak per kelas dan menarik garis
panah dari Derived class ke Baseclass.
Base Class
Common attributes
+ Common methods ()
Derived classGambar
1
3.5 Ide dasar dariDerived
warisan class 2
attributes unique to this class
3.2.1
Contoh Hirarki
Dalam java dapat dilakukan sebagai berikut. Pertama membuat kelas yang
menangkap sifat-sifat penting dan method umum untuk semua produk (Televisi
dan Buku).
public class Product {
// fungsionalitas untuk produk
}
Sekarang untuk membuat kelas yang mewakili satu set TV. Untuk mencatat
bahwa televisi merupakan produk dan fungsi yang hanya dilaksanakan untuk
produk. Di Java, dapat menuliskan coding sebagai berikut:
public class Television extends Product {
// fungsi yang unik untuk televisi
// modifikasi
}
Informasi yang didapatkan dari kelas Televisi adalah mewarisi semua
properti dan method dari kelas Product. Semua yang dilakukan adalah
menambahkan properti dan method unik untuk televise. Dengan cara yang sama,
untuk menuliskan coding kelas Book sebagai berikut:
public class Book extends Product {
// fungsi yang unik untuk buku
// modifikasi
}
Hubungan antara tiga kelas digambarkan pada Gambar 3.6
Product
Television
Gambar 3.6 Inheriting fromBook
product
Struktur kelas
Dalam bagian ini menjelaskan bagaimana cara kerja hubungan warisan.
Fungsionalitas yang diperlukan dari dua kelas television dan Book, diberikan pada
Gambar 3.7.
Sekarang, perhatikan persamaan dan perbedaan antara dua kelas. Mereka
mewakili produk, membawa kuantitas bidang penjualan dan harga dengan makna
Television
Book
yang jelas. Method sale () di kedua kelas dipanggil kapan satu unit (buku atau satu
model : string
title : string
manufacture : string
price : double
set
TV): double
dijual. Arti dari method setPrice () harus
price
authorjelas.
: string
quantitySold : int
publisher : string
quaintySold : int
+ Television (manufacture : string), model : string
+ Book (title:string, author:string, publisher:string)
+ sale () : void
+ sale () : void
+ setPrice (newPrice : double) : void
+ setPrice (newPrice:double) : void
}
}
Product
price : double
company : string
quantitySold : int
+ product (company:string)
+ sale () : void
+ setPrice (newPrice:double):void
Book
model : string
title : string
+ Television
(manufacturer:string,
sebelum bidang subclass diberikan nilai. Sebuah
analogi
dapat membantu,model:string)
ketika
rumah dibangun, atap diletakkan hanya setelah dinding sudah didirikan, yang
terjadi hanya setelah pondasi telah diletakkan.
Untuk membuat objek televisi, kita memanggil konstruktor dari kelas yang
seperti di bawah ini, di mana kita mengirim nama merek, nama produsen, dan
harga.
Television set = new Television("RX3032", "Modern Electronics", 230.0);
Sehingga konstruktor dari televisi harus didefinisikan sebagai berikut.
public Television(String model, String manufacturer, double price) {
// Kode untuk menginisialisasi bagian Produk dari televisi
// Kode untuk menginisialisasi bagian televisi objek
}
Kita sudah memiliki sepotong kode yang initialises bidang objek Produk:
konstruktor dari Produk. Jadi semua yang perlu kita lakukan adalah memanggil
konstruktor itu! Hal ini dilakukan dengan pernyataan Panggilan super dengan
parameter yang tepat selalu memanggil konstruktor superclass ini. Superclass
'panggilan konstruktor dapat dipanggil hanya sebagai pernyataan pertama dari
kode tersebut dalam constructor dari subclass; tidak dapat ditempatkan setelah
beberapa kode atau ditempatkan dalam method.
Dalam contoh ini, parameter yang akan dilalui akan nama produsen dan
harga. Kode untuk constructor kemudian
public Television(String model, String manufacturer, double price) {
super(manufacturer, price);
// Menyimpan nama model
}
Bidang superclass yang dijalankan kedepan bidang dalam subclass. Apa ini
berarti dalam konteks pembuatan obyek adalah bahwa konstruktor dari televisi
dapat mulai bekerja hanya setelah constructor dari superclass eksekusi produk
telah selesai. Tentu saja ketika Anda ingin membuat objek televisi Anda perlu
untuk memanggil konstruktor kelas, tetapi hal pertama yang constructor Televisi
tidak dan harus dilakukan adalah memanggil konstruktor dari Produk dengan
parameter yang sesuai nama perusahaan yang memproduksi set dan harga.
Seperti yang diharapkan, kelas televisi kebutuhan lapangan untuk
menyimpan nama model. Dengan demikian kita memiliki setengah lebih lengkap
coding untuk kelas ini, seperti contoh di bawah ini.
public class Television extends Product {
private String model;
public Television(String model, String manufacturer, double price) {
super(manufacturer, price);
this.model = model;
}
public String toString() {
return super.toString() + " model: " + model;
}
}
Untuk String() method Televisi bekerja dengan terlebih dahulu memanggil
untuk String () method Produk, yang mengembalikan representasi string dari
Produk dan merangkai untuk nama model.
3.2.2
dilakukan beberapa bahasa berorientasi objek lainnya), yang berarti bahwa bendabenda yang termasuk kelas yang mengimplementasikan antarmuka yang diberikan
juga termasuk ke dalam jenis yang diwakili oleh antarmuka. Demikian juga, kita
bisa mendeklarasikan identifier sebagai milik jenis antarmuka dan kita kemudian
dapat menggunakannya untuk mengakses objek dari setiap kelas yang
mengimplementasikan antarmuka.
public interface I {
// rincian dari I
}
public class A implements I {
//code untuk A
}
public class B implements I {
//code untuk B
}
I i1 = new A(); // i1 memegang A
I i2 = new B(); // i2 memegang B
Dalam notasi UML, jenis hubungan antara interface dan kelas yang
mengimplementasikan disebut realisasi dan diwakili oleh garis putus-putus
dengan panah terbuka besar yang menunjuk ke antarmuka seperti yang
ditunjukkan pada Gambar 3.8.
3.2.3
UndergraduateStudent
GraduateStudent
Ini
adalah
tanggung
jawab
programmer
untuk
menunjuk ke objek
Tugas dari jenis di atas disebut polimorfik. Referensi adalah mampu untuk
menunjuk ke objek dari berbagai jenis selama jenis sebenarnya dari benda-benda
sesuai dengan jenis referensi. Peraturan di atas informal memberikan pengertian
tentang kesesuaian.
Ini adalah pelajaran untuk membandingkan tugas dan gips yang diberikan di
atas dengan aturan untuk tugas dan gips variabel dari tipe primitif. Beberapa jenis
konversi, misalnya, dari int untuk fload.
Superclass
Gambar 3.10
Subclass1
Subclass2
Dalam salah satu dari ini, kita menyimpan referensi ke objek dari
GraduateStudent kelas di suatu entitas yang menyatakan jenis adalah mahasiswa.
Ini setara dengan mengambil sekelompok pisang dan menyimpannya dalam kotak
berlabel 'buah'. Isi menyatakan kotak (seperti yang diberikan oleh label) adalah
buah, seperti jenis menyatakan entitas Murid1 di LHS dari tugas adalah
Mahasiswa. Dengan melakukan ini, kita telah kehilangan beberapa informasi
karena kita tidak bisa lagi mencari tahu apa jenis buah yang kita miliki dalam
kotak tanpa memeriksa isinya. Demikian juga, ketika kita beroperasi pada entitas
Murid1, semua kita bisa berasumsi adalah bahwa hal itu berisi referensi ke objek
Mahasiswa. Demikian ada hilangnya informasi dalam jenis tugas.
Jenis kedua tugas polimorfik adalah salah satu di mana kami pindah referensi
dari suatu entitas yang menyatakan jenis adalah Student untuk entitas yang
menyatakan jenis adalah GraduateStudent. (Ini akan berjumlah mengambil pisang
dari kotak berlabel 'buah' dan menempatkan mereka dalam kotak berlabel 'pisang',
kami melakukan ini hanya jika kita yakin bahwa kotak memang memiliki pisang).
Untuk mendapatkan pemahaman yang konkret, mari kita kembali ke contoh
hirarki Mahasiswa. Kode untuk Mahasiswa dapat ditulis sebagai berikut.
public abstract class Student {
private String name;
private double gpa;
// more fields
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public boolean isInGoodStanding() {
return (gpa >= getGPACutoff());
}
public abstract double getGPACutoff();
// more methods
}
Dalam prakteknya, kelas Mahasiswa akan jauh lebih rumit, karena dalam
kode ada yang hilang kerangka utama yang seharusnya ada. Seperti yang Anda
lihat, nama mahasiswa yang akan dijalankan dalam konstruktor. Indeks Prestasi
Kumulatif (IPK) disimpan dalam bidang double gpa. Sebagai siswa
akan
mendapatkan
akan
kelas
dan
menyelesaikan
kuliahnya,
maka
mereka
mendapatkan nilai yang akan digunakan dalam menghitung IPK. Tak satu pun dari
kode yang ditunjukkan di kelas ini.
Kami berasumsi bahwa secara berkala, mungkin pada akhir setiap semester
atau triwulan, universitas akan memeriksa siswa untuk melihat apakah mereka
berada di 'performa yang baik'. Biasanya, itu berarti memastikan bahwa siswa
mengalami kemajuan dalam cara memuaskan. Kami berasumsi bahwa untuk
siswa performa yang baik berarti bahwa IPK siswa memenuhi persyaratan
minimum tertentu. IPK minimal diharapkan siswa dapat berubah tergantung pada
apakah
siswa
adalah
sarjana
atau
mahasiswa
pascasarjana.
Method
return 2.0;
}
}
konstruktor mendapatkan nama siswa karena hanya parameter dan memanggil
konstruktor superclass untuk menyimpannya. Karena ini adalah kelas non-abstrak,
method getGPACutoff yang mengembalikan minimum IPK diimplementasikan.
Semua method superclass public dan protected yang diwariskan dalam dua
subclass. Jadi, method ini pada GoodStanding dapat dipakai pada sebuah instance
dari UndergraduateStudentas baik. Jadi kode berikut ini berlaku.
UndergraduateStudent student = new UndergraduateStudent("Tom");
// code to manipulate student
if (student.isInGoodStanding()) {
// code
} else {
// code
}
Ketika metode ini dibuat, dalam method GoodStanding di Student
superclass akan dipanggil.
Akhirnya, kita memiliki kode untuk kelas GraduateStudents (mahasiswa
pascasarjana). Konstruktor untuk kelas ini cukup mirip dengan yang untuk kelas
UndergraduateStudent (mahasiswa sarjana). Untuk membuat kelas non-abstrak,
kelas ini juga, harus memiliki implementasi getGPACutoff. Selain itu, kami
menganggap bahwa mahasiswa baik berdiri di pascasarjana harus memenuhi
persyaratan yang dikenakan pada semua siswa dan, di samping itu, mereka tidak
dapat memiliki lebih dari jumlah tertentu kursus di mana mereka mendapatkan
kelas di bawah, mengatakan B.
Apa yang kami suka adalah oroverriding redefinisi method ini dalam
GoodStanding. Utama dilakukan dengan mendefinisikan sebuah method dalam
subclass dengan nama yang sama, jenis return, dan parameter sebagai method
dalam superclass sehingga definisi subclass ini lebih diutamakan daripada method
superclass. Sehingga kode dalam method GoodStanding sekarang berbeda. Lihat
di bawah.
public class GraduateStudent extends Student {
public GraduateStudent(String name) {
super(name);
}
public double getGPACutoff() {
return 3.0;
}
public boolean isInGoodStanding() {
return super.isInGoodStanding() && checkOutCourses();
}
public boolean checkOutCourses() {
// implementation not shown
}
}
Sekarang, misalkan kita memiliki kode berikut.
GraduateStudent student = new GraduateStudent("Dick");
// code to manipulate student
if (student.isInGoodStanding()) {
// code
} else {
// code
}
Dalam hal ini, panggilan untuk GoodStanding adalah hasil dalam panggilan untuk
kode didefinisikan dalam kelas GraduateStudent. Hal ini pada gilirannya
memanggil kode di kelas Mahasiswa dan membuat pemeriksaan lebih lanjut
dengan menggunakan method checkOutCourses dinyatakan secara lokal untuk
sampai pada keputusan.
Ingat kelas StudentArrayList kita definedin Bagian 2.4 yang menyimpan
benda mahasiswa. Method untuk menambahkan Mahasiswa di kelas ini tampak
sebagai berikut:
public void add(Student student) {
// code
}
Sejak referensi Mahasiswa dapat menunjuk ke UndergraduateStudent atau
GraduateStudent, kita dapat melewati objek dari kedua jenis method add dan telah
mereka simpan dalam daftar. Misalnya, kode
StudentArrayList students = new StudentArrayList();
UndergraduateStudent student1 = new UndergraduateStudent("Tom");
} else {
System.out.println(students.getStudentAt(index).getName()
+ " is not in good standing");
}
}
Kami berasumsi bahwa siswa Tom, seorang mahasiswa sarjana, dan Dick, seorang
mahasiswa pascasarjana, berada dalam daftar sesuai dengan kode yang diberikan
do awal. loop akan iterate dua kali, pertama mengakses objek sesuai dengan Tom
dan kemudian mendapatkan objek untuk Dick. Dalam kedua kasus, yaitu dalam
method GoodStanding akan dipanggil.
Kode di atas menunjukkan kekuatan dinamis mengikat. Dalam panggilan
untuk isInGoodStanding, kami tidak menyadari jenis objek. Cukup dengan
memeriksa kode yang memanggil method, kita tidak bisa membedakan mana
definisi method isInGoodStanding akan dipanggil, yaitu dinamis mengikat
memberikan kita kemampuan untuk menyembunyikan rincian ini dalam hirarki
warisan.
3.2.4
artinya ini adalah bahwa bidang ini dapat diakses oleh ClosedFigure dan
keturunannya seperti yang ditunjukkan di bawah ini.
public class ClosedFigure extends Figure {
protected double area;
//other fields and methods
}
Figure
ClosedFigure
#area : double
membahayakan integritas kode kita. Faktanya, klien yang tidak bermoral bisa
dengan mudah melakukan hal berikut:
class BackDoor extends ClosedFigure {
public void setArea(double area, ClosedFigure someClosedFigure) {
someClosedFigure.area = area;
}
}
Oleh karena itu kita perlu definisi berikut ketat dari akses yang dilindungi.
Kode yang berada di kelas A dapat mengakses atribut dilindungi dari sebuah
objek dari kelas B hanya jika B adalah setidaknya tipe A, yaitu B milik hirarki
berakar di A.
3.2.5
Kelas objek
Java memiliki kelas khusus yang disebut Object yang setiap kelas mewarisi.
Dengan kata lain, Obyek adalah superclass dari setiap kelas di Java dan
merupakan akar dari hirarki kelas. Dari pengetahuan kita tentang tugas
polimorfik, kita dapat melihat bahwa variabel bertipe Object dapat menyimpan
referensi ke objek jenis lainnya. Kode berikut demikian hukum.
Object anyObject;
anyObject = new Student();
anyObject = new Integer(4);
anyObject = "Some string";
Dalam contoh di atas, variabel anyObject toko pertama objek Student, maka
obyek Integer, dan akhirnya sebuah objek String.
3.3 Genericity
Genericity adalah mekanisme untuk menciptakan entitas yang berbeda hanya dalam
jenis parameter mereka, dan gagasan ini dapat dikaitkan dengan entitas (kelas atau
metode) yang memerlukan parameter beberapa tipe tertentu.
Untuk memahami kegunaan genericity, mempertimbangkan pelaksanaan berikut:
public class Stack {
private class StackNode {
Object data;
StackNode next;
// rest of the class not shown
}
public void push(Object data) {
// implementation not shown
}
public Object pop() {
// implementation not shown
}
// rest of the class not shown
}
Elemen stack disimpan dalam bidang data StackNode. Perhatikan data yang bertipe
Object, yang berarti bahwa setiap jenis data dapat disimpan di dalamnya.
Kami membuat tumpukan dan menyimpan sebuah objek Integer di dalamnya.
Stack myIntStack = new Stack(); // line 1
myIntStack.push(new Integer(5)); // line 2
Integer x = (Integer) myIntStack.pop(); //line 3
Implementasi ini memiliki beberapa kelemahan. Sejalan 2, tidak ada yang mencegah kita
dari mendorong objek sewenang-wenang dalam stack. Kode berikut, misalnya, adalah
sempurna yang bener.
Stack myIntStack = new Stack();
myIntStack.push("A string");
Kode berikut akan menghasilkan error.
Stack myIntStack = new Stack();
myIntStack.push("A string");
Integer x = (Integer) myIntStack.pop(); // error
Kita bisa menulis kode tambahan yang menangani kesalahan karena para pemain yang
salah, tapi itu tidak membuat kode dibaca. Di sisi lain, kita bisa menulis kelas Stack
terpisah untuk setiap jenis stack yang kita butuhkan, tapi kemudian kami tidak dapat
menggunakan kembali kode kita.
Generik memberikan kita jalan keluar dari dilema ini. Sebuah kelas Stack generik
akan didefinisikan sesuatu seperti ini:
public class Stack<E> {
//code for fields and constructors
public void push(E item) {
// code to push item into stack
}
public E pop() {
// code to push item into stack
}
}
3.4 Diskusi dan Bacaan Lebih Lanjut
Dalam bab ini kita telah membahas bagaimana kelas-kelas dalam sistem berorientasi
obyek berhubungan satu sama lain. Asosiasi adalah yang paling sederhana dan paling
umum. Meskipun bab ini menyentuh pada beberapa aspek asosiasi, penelitian yang lebih
rinci dari notasi UML dan beberapa poin-poin penting dari menggunakan asosiasi akan
diperlukan sebelum memulai sebuah proyek serius. Notasi UML menyediakan
mekanisme untuk jenis lain dari hubungan antara kelas, disebut ketergantungan.
Sebuah pengetahuan mendalam tentang warisan penting untuk siapa pun yang
terlibat dalam OOAD. Sementara gagasan kelas membantu kita menerapkan tipe data
abstrak, itu adalah warisan yang membuat paradigma berorientasi objek begitu kuat.
Mewarisi dari superclass memungkinkan tidak hanya untuk menggunakan kembali kode
yang ada di superclass, tetapi juga untuk melihat contoh dari semua subclass sebagai
anggota dari jenis superclass. tugas polimorfik dikombinasikan dengan mengikat dinamis
metode memungkinkan untuk memungkinkan pengolahan seragam obyek tanpa harus
khawatir tentang jenis mereka dengan tepat.
Ada beberapa overhead yang terkait dengan dinamis mengikat. Dalam C ++,
programmer dapat menentukan bahwa metode adalah virtual, yang berarti bahwa dinamis
mengikat akan digunakan selama pemanggilan metode. Metode tidak didefinisikan
sebagai virtual akan dipanggil menggunakan jenis menyatakan referensi yang digunakan
dalam panggilan. Ini membantu programmer menghindari overhead yang terkait dengan
dinamis mengikat dalam metode panggilan yang tidak benar-benar membutuhkan
kekuatan dinamis mengikat. Dalam C ++ bahasa, semua metode Jawa virtual.
Di Java, penting untuk dicatat bahwa dinamis mengikat tidak terikat subclassing. Hal
ini juga berlaku dalam konteks interface. Misalnya, mempertimbangkan situasi di mana
mahasiswa bukan kelas, tapi antarmuka.
public interface Student {
public boolean isInGoodStanding();
public abstract double getGPACutoff();
public String getName();
// more methods
}
Mari kita berasumsi bahwa antarmuka di atas dilaksanakan oleh UndergraduateStudent
kelas dan GraduateStudent. pelaksanaannya cukup sederhana, sehingga kita tidak
menunjukkan kode untuk itu; satu-satunya perbedaan utama sekarang adalah bahwa
karena tidak ada subclassing, yang isInGoodStanding () dari GraduateStudent tidak bisa
mengeluarkan super panggilan. isInGoodStanding () tetapi harus menghitung secara
lokal.
Sekarang, kode yang diberikan sebelumnya dan direproduksi di bawah ini, bekerja
melalui dinamis mengikat.
for (int index = 0; index < students.size(); index++) {
if (students.getStudentAt(index).isInGoodStanding()) {
System.out.println(students.get(index).getName()
+ " is in good standing");
} else {
System.out.println(students.get(index).getName()
+ " is not in good standing");
}
}
3.4.1
dan
tidak
*;
classjava.awt.image.ColorModel
java.awt.image, dengan
maka
kita
mengimpor
perlu
menulis
import
java.awt.image.*;
4.1.3
4.3 Exception
Jenis tertentu dari objek tergantung pada jenis operasi. Berikut adalah beberapa contoh :
1. Dilakukan usaha untuk mengakses array dengan indeks yang tidak valid.Objek yang
dihasilkanjenisArrayIndexOutOfBoundsException.
2. Sebuah referensi null digunakan untuk mengakses lapangan atau metode objek.Dalam hal
ini, objek yang dihasilkan adalah tipeNullPointerException.
3. Terjadi kesalahan saat operasi input atau output terjadi.Objek dalam hal ini adalah dari
jenisIOException.
4. Upaya untuk melemparkan sebuah objek gagal seperti pada contoh mahasiswa.Jenis
pengecualian disebutClassCastException.
menempatkan kode menyinggung dalam blok try dan menangkap objek pengecualian:
try{
Studentstudent=newUndergraduateStudent();
GraduateStudentgraduateStudent=(GraduateStudent)student;
//processtheobject
}catch(ClassCastExceptioncce){
//Objectisnotoftypegraduatestudent.
//dosomeoperationtorecoverfromtheerror
}
Berikut ini adalah bagian dari kode yang menangani tiga jenis pengecualian:
try {
if (myObject.getField1().equals(someObject)) {
int index = myObject.getIndex();
int value =
Integer.parseInt(JOptionPane.showInputDialog(null,
"Enter a number"));
myArray[index] = value;
} catch (NullPointerException npe) {
System.out.println("Null pointer " + npe);
System.exit(0);
Membuat file
File harus diberi nama <class / nama interface> java. Java mensyaratkan
bahwa dengan lebih dari satu class atau interface dalam sebuah file, hanya salah satu
class / interface dapat publik; jika ada class / interface publik dalam sebuah file,
nama kelas / interface harus digunakan untuk penamaan file.
4.1.2
Packages
Sebuah packages adalah kumpulan class. Beberapa packages utama adalah
java.lang, java.util, java.awt, javax.swing, java.io, dan
Java.lang.reflect.
Java secara otomatis dapat membuat class dan interface dalam packages
4.4.2
4.4.3
Downcasting
Memasukkan superclass mengacu ke subclas. Contoh :
computeTax ganda (investasi Investasi)
{jumlahganda; Deposit Deposit = (Deposit) investasi; Jumlah =
deposit.getInterest (); // Kode untuk menghitung pajak atas jumlah // sisa metode
ini tidak ditampilkan}
Meskipun ClassCastException adalah tion RuntimeException dan tidak biasanya
harus ditangkap, ini bisa dianggap sebagai situasi yang tepat di mana ia harus
ditangani. Kita bisa menulis ulang metode seperti di bawah ini :
ganda computeTax (investasi Investasi)
{jumlahganda; try
{DepositDeposit = (Deposit) investasi; Jumlah = deposit.getInterest (); // Kode
untuk menghitung pajak atas jumlah} catch (ClassCastException cce)
{try{saham
Bursa = (Stock) investasi; Jumlah = stock.getInterest (); // Kode untuk
menghitung pajak atas jumlah} catch (ClassCastException cce)
{cce.printStackTrace(); }} // Kembali pajak}
Contoh di atas tampaknya menunjukkan downcasting dan operator instanceof
dapat digunakan secara bergantian.