Abstract
Class, Interface, Inner Class
A. Abstrak Class
Abstract class adalah kelas yang terletak
pada posisi tertinggi pada hierarki kelas. Kelas ini digunakan sebagai basis
bagi penurunan kelas lainnya, sehingga abstract class tidak dapat diinstansiasi
secara langsung menjadi object. Suatu abstract class bisa mengandung method
kongkrit dan/atau method abstract. Abstract method meruapakan suatu method yang
tidak mempunyai badan method. Hanya berupa nama method dan parameter inputan
method. Ketika suatu abstract class diturunkan/ di-extends, maka
subclass harus mengimplementasikan semua method abstract pada parent/ base
class. Jika tidak mengimplementasikan semua method abstract maka subclass harus
dideklarasikan sebagai abstract class.
B. Interface
Interface adalah kumpulan method yang
hanya memuat deklarasi dan struktur method, tanpa detail implementasinya.
Sedangkan detail dari method berada pada class yang mengimplementasikan
interface tersebut. Interface digunakan bila Anda ingin mengaplikasikan suatu
method yang spesifik, yang tidak diperoleh dari proses inheritance. Tipe data
yang boleh pada interface hanya tipe datakonstan. Setelah
mengetahui apa itu interface. Timbul pertanyaan Mengapa membutuhkan
interface?
·
Memecahkan bagian yang rumit dan spesifik. Dengan
menggunakan class atau interface oleh vendor maka dalam pembuatan perangkat
lunak menjadi lebih cepat.
·
Keterbatasan inheritance pada Java. Interface menjawab
kebutuhan untuk melakukan multiple inheritance
Apakah Interface = Abstract class ?
Ya
menurut saya sih antara keduanya memiliki kemiripan, tapi tidak sama. Mirip
bukan berarti sama kan? Terdapat beberapa perbedaan antara keduanya yaitu
·
Abstract
class dapat memiliki tipe data dengan semua tipe data, sedangkan interface tipe
datanya hanya berupa konstanta
·
Method
pada abstract class dapat berupa method kongkrit dan method abstract. Sedangkan
pada interface semua method harus berupa method abstract.
Contoh
GraphicObject.java
abstract
class GraphicObject {
int x,y;
void moveTo(int newValueX, int newValueY)
{
x = newValueX;
y = newValueY;
}
abstract void drawShape();
abstract void resize();
int x,y;
void moveTo(int newValueX, int newValueY)
{
x = newValueX;
y = newValueY;
}
abstract void drawShape();
abstract void resize();
}
Circle.java
public
class Circle extends GraphicObject {
void resize()
{
System.out.println(“Circle Resize”);
}
void drawShape()
{
System.out.println(“Circle Shape”);
}
void posisition()
{
System.out.println(this.x+this.y);
}
}
void resize()
{
System.out.println(“Circle Resize”);
}
void drawShape()
{
System.out.println(“Circle Shape”);
}
void posisition()
{
System.out.println(this.x+this.y);
}
}
Main.java
public
class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Circle Lingkaran = new Circle();
Lingkaran.moveTo(5,5);
Lingkaran.drawShape();
Lingkaran.resize();
Lingkaran.posisition();
}
* @param args the command line arguments
*/
public static void main(String[] args) {
Circle Lingkaran = new Circle();
Lingkaran.moveTo(5,5);
Lingkaran.drawShape();
Lingkaran.resize();
Lingkaran.posisition();
}
}
C. INNER CLASS
Innerclass adalah class
yang di sisipkan didalam kelas yang lain. Fungsi kelas sisip ini adalah
mendukung suatu proses yang akan dijalankan oleh kelas utama
- Inner class adalah suatu class
yang berada di dalam class lainnya. [1]
- Di buku [2],
disebutkan ada 4 jenis inner class, yaitu :
1. “Regular” Inner class
2. Method-local inner class
3. Anonymous inner class
4. Static nested classes
1. “Regular” Inner class
- Kata “Regular” di atas memiliki
maksud bahwa inner class yang dibahas di sini adalah inner class yang
bukan static / method-local / anonymous. [2]
- Inner
class didefinisikan (ditulis) di dalam kurung kurawal dari outer
class. [2]
- Bila ada
kode java sebagai berikut : [2]
Program 01
|
class MyOuter {
class MyInner {
}
}
|
Dan
kemudian dicompile dengan perintah :
%java
MyOuter.java
Maka akan tercipta 2 buah file .class, yaitu : MyOuter.class dan MyOuter$MyInner.class.
- Instance inner class memiliki
akses ke semua member dari outer class (termasuk member outer class yang
ber access modifier private). [2]
Contoh : [1]
Program 02
|
class A {
private int x = 101;
class B {
void lakukanSesuatu() {
System.out.print("x = " + x);
}
}
}
public class BelajarInnerClass02 {
public static
void main(String[] args) {
A a = new A();
A.B b = a.new B();
b.lakukanSesuatu();
}
}
|
- Sebuah inner class tidak dapat
memiliki member static. [2]
Contoh : [1]
Program 03
|
class A {
class B {
static int a = 10; //error!!!
}
}
|
- Untuk membuat instance dari
inner class, kita harus memiliki instance dari outer class terlebih
dahulu. Tidak ada pengecualisan untuk aturan ini. [2]
- Untuk membuat instance dari
inner class, terdapat 2 cara, yaitu :
1. Dari dalam outer class
2. Dari luar outer class
· Contoh membuat instance inner class dari dalam
outer class : [1]
Program 04
|
class A {
void
buatInstanceKelasB() {
B b = new B();
}
class B {
}
}
|
Dari contoh di atas, untuk dapat menjalankan
method buatInstanceKelasB, harus terdapat instance dari kelas A terlebih
dahulu. Dengan kata lain, untuk membuat instance inner class, harus terdapat
instance dari outer class terlebih dahulu.
Maksud dari membuat instance inner class dari
dalam outer class tidak termasuk membuat instance dari dalam method
static. Sebab method static tidak dapat menunjuk sesuatu yang tidak static.
Untuk membuat instance inner class dari dalam method static, maka dipergunakan
cara seperti ketika membuat instance inner class dari luar outer class.
- Contoh membuat instance inner
class dari luar outer class : [1]
Program 05
|
class A {
class B {
void sesuatuDiKelasB() {
System.out.println("Hello, ini di method kelas B");
}
}
}
public class Contoh {
public static
void main(String[] args) {
A a = new A();
A.B b = a.new B();
b.sesuatuDiKelasB();
}
}
|
Program 05 di atas dapat disingkat menjadi : [1]
Program 06
|
class A {f
class B {
void sesuatuDiKelasB() {
System.out.println("Hello, ini di method kelas B");
}
}
}
public class BelajarInnerClass04 {
public static
void main(String[] args) {
A.B b = new A().new B();
b.sesuatuDiKelasB();
}
}
|
Ketika
kita ingin membuat instance dari method static dari
outer class, maka cara di ataslah yang digunakan. Hal ini karena method static
tidak memiliki reference this.
- Aturan inner class dalam hal
mereferensi dirinya sendiri atau instance dari outer class adalah sebagai
berikut : [2]
1. Untuk merujuk pada dirinya sendiri (instance
dari inner class) dari dalam inner class, dapat digunakan referensi this atau NamaOuterClass.NamaInnerClass.this.
2. Untuk
merujuk pada instance dari outer classnya dari dalam inner class, dapat
digunakan referensi NamaOuterClass.this.
Contoh
: [1]
Program 07
|
class A {
int i = 10;
class B {
int i = 11;
class C {
int i
= 12;
void
lakukanSesuatu() {
System.out.println("A.this.i = " + A.this.i);
System.out.println("A.B.this.i = " + A.B.this.i);
System.out.println("A.B.C.this.i = " + A.B.C.this.i);
System.out.println("this.i
= " + this.i);
}
}
}
}
public class BelajarInnerClass05 {
public static
void main(String[] args) {
A.B.C c = new A().new B().new C();
c.lakukanSesuatu();
}
}
|
- Modifier-modifier berikut dapat diberikan pada inner
class : [2]
1. final
2. abstract
3. public
4. protected
5. private
6. static (tapi dengan modifier
ini, maka akan menjadi static nested class, bukan inner class).
7. strictfp
2. Method-Local Inner
Class
· Method-local inner class adalah inner class yang
dideklarasikan di dalam method [2].
· Mendeklarasikan method-local inner class tidak
berarti kita membuat instance dari class tersebut. Jadi,
sebelum kita menggunakan inner class tersebut, kita harus membuat instancenya
dari suatu tempat di dalam method dan setelah
definisi inner class tersebut. [2].
Contoh :
Program 08
|
class A { //1
void myMethod()
{ //2
class B { //3
int i = 10;
void
lakukanSesuatu() { //4
System.out.println(" i = " + i);
} //4
} //3
B b = new B();
b.lakukanSesuatu();
} //2
} //1
|
- Method-local
inner class hanya dapat diinstansiasi dari dalam method yang
mendefinisikan method-local inner class tersebut.
- Instance method-local inner
class memiliki akses ke semua member dari outer class (termasuk member
outer class yang ber access modifier private). [2]
Contoh : [1]
Program 09
|
class A { //1
private int i =
10;
void
lakukanSesuatu() { //2
class B { //3
void aksesMemberOuterClass() { //4
System.out.println("i = " + i);
} //4
} //3
B b = new B();
b.aksesMemberOuterClass();
} //2
} //1
|
- Instance dari method-local
inner class tidak dapat mengakses local variabel (termasuk parameter) dari
method dimana method-local inner class tersebut didefinisikan. Kecuali
bila variabel tersebut bermodifier final.[2]
Contoh : [2]
Program 10
|
class A { //1
void
lakukanSesuatu() { //2
int nonFinalVar = 10;
final int finalVar = 11;
class B { //3
void aksesLocalVar() { //4
//ERROR
System.out.println("nonFinalVar = " + nonFinalVar);
//TIDAK ERROR
System.out.println("finalVar = " + finalVar);
} //4
} //3
B b = new B();
b.aksesLocalVar();
} //2
} //1
|
- Method-local inner class yang
didefinisikan di dalam static method tidak dapat
mengakses non-static member dari outer classnya [2].
- Modifier-modifier yang dapat
diberikan pada method-local inner class adalah : [2]
1. abstract (tidak dapat digabung
dengan final)
2. final (tidak dapat digabung
dengan abstract)
3. Anonymous Inner Class
· Anonymous
inner class adalah suatu inner class yang dideklarasikan tanpa nama kelas. [2]
· Anonymous inner class pasti adalah salah satu
dari 2 hal berikut :
1. Subclass dari suatu class yang telah dideklarasikan
2. Kelas implementasi dari suatu interface
· Suatu
anonymous inner class tidak dapat secara bersamaan menjadi subclass dari class
yang telah dideklarasikan dan juga sebagai kelas implementasi dari suatu
interface. [2]
· Tujuan
utama dari anonymous inner class adalah mengoverride satu atau lebih method
dari super classnya atau mengimplement semua method dari suatu interface. [2]
· Anonymous
inner class tidak dapat mengimplement lebih dari sebuah interface. [2]
· Anonymous
inner class selalu dibuat sebagai bagian dari suatu statement. [2]
· Contoh Anonymous inner class sebagai subclass : [1]
Program 11
|
class A {
int i = 10;
void
lakukanSesuatu() {
i--;
System.out.println("i =
" + i);
}
}
public class BelajarAnonymous1
{ //1
public static
void main(String[] args) { //2
A a = new A() { //3
void lakukanSesuatu() { //4
i++;
System.out.println("i = " + i);
} //4
}; //3
a.lakukanSesuatu();
}
//2
} //1
|
Note: variabel referensi a di atas mereferensi ke
suatu instance anonymous inner class yang merupakan subclass dari class A.
Jadi, variabel referensi a bukan mereferensi ke instance dari kelas A.
- Contoh anonymous inner class
sebagai implementasi suatu interface : [1]
Program 12
|
interface A {
public void
doA();
}
interface B extends A {
public void
doB();
}
public class BelajarAnonymous2 {
public static
void main(String[] args) {
B b = new B() {
public void doA() {
System.out.println("Ini method doA()");
}
public void doB() {
System.out.println("Ini method doB()");
}
};
b.doA();
b.doB();
}
}
|
- Anonymous inner class adalah
salah satu bentuk dari polymorphisme, oleh karena itu, method yang dapat
dipanggil dari anonymous inner class adalah method yang dideklarasikan di
super class atau interfacenya (meskipun di dalam anonymous inner class
dapat dideklarasikan method-method yang tidak ada di super class atau
interfacenya).
Contoh : [1]
Program 13
|
class A {
int i = 10;
void lakukanSesuatu() {
i--;
System.out.println("i =
" + i);
}
}
public class BelajarAnonymous1 {
public static
void main(String[] args) {
A a = new A() {
void lakukanSesuatu() {
i++;
System.out.println("i = " + i);
}
//Di bawah ini adalah method yang tidak ada di class A
void newMethod() {
System.out.println("Hallo, nama
saya Anton");
}
};
a.lakukanSesuatu(); //Tidak
error
a.newMethod(); //ERROR !!!!!!!
}
}
|
- Anonymous inner class dapat
diletakkan sebagai argument dari suatu method. Contoh : [1]
Program 14
|
class A {
void
lakukanSesuatu() {
System.out.println("Ini isi aslinya");
}
}
class B {
static void
demoAnonymousInnerClassSebagaiArgument(A a) {
a.lakukanSesuatu();
}
}
public class BelajarAnonymous3 {
public static
void main(String[] args) {
B.demoAnonymousInnerClassSebagaiArgument(new A() {
void lakukanSesuatu() {
System.out.println("Ini method di anonymous inner class");
}
});
}
}
|
4. Static nested class
- Static nested class adalah
inner class dengan modifier static. [2]
- Static nested class sebenarnya
bukan inner class, static nested class hanyalah top-level class yang di
sarangkan di dalam class lain. [2]
- Karena static, maka untuk
membuat instance dari static nested class tidak diperlukan instance dari
outer classnya. [2] (tidak seperti regular inner
class ataupun method-local inner class [1]).
Contoh : [1]
Program 15
|
class A {
static class B {
void lakukanSesuatu() {
System.out.println("Hallo");
}
}
}
public class StaticNestedClass {
public static
void main(String[] args) {
A.B b = new A.B(); //cara instansiasi static nested class
b.lakukanSesuatu();
}
}
|
- Cara instansiasi static nested
inner class adalah : [2]
NamaOuterClass.NamaStaticNestedClass varRef = new
NamaOuterClass.NamaStaticNestedClass()
- Static nested class tidak dapat
mengakses non-static member dari outer classnya. [2]
Contoh : [1]
Program 16
|
class A {
int i = 10;
static class B
{
void lakukanSesuatu() {
System.out.println("i = " + i);
}
}
}
public class StaticNestedClass2 {
public static
void main(String[] args) {
A.B b = new A.B();
b.lakukanSesuatu();
}
}
|
LANGKAH-LANGKAH
PRKTIKUM
A.
MakhlukHidup.java
public abstract class MakhlukHidup {
protected
boolean BisaTerbang = false;
protected
String Nama;
protected
int JLHKaki;
public
MakhlukHidup(String Nama1, int JLHKaki1,boolean BisaTerbang1) {
this.Nama = Nama1;
this.JLHKaki = JLHKaki1;
this.BisaTerbang = BisaTerbang1;
}
abstract
void bernafas();
public void
status() {
System.out.println("Nama : " +Nama);
System.out.println("Jumlah kaki : " +JLHKaki);
System.out.println("Bisa
terbang : " +BisaTerbang);
}
}
Pada program di atas tidak dapat di eksekusi karna
tidak ada fungsi utama
public abstract class MakhlukHidup { = adalah kelas
yang di deklarasikan dengan abstark
B.
Manusia.java
public class Manusia extends MakhlukHidup {
Manusia(String nama) {
super(nama, 2,false);
}
public void bernafas() {
System.out.println(nama+" bernafas dengan
menghirup 02");
}
public static
void main(String [] args) {
Manusia m = new Manusia("Sayuti");
m.status();
m.bernafas();
}
}
Hasil Eksekusi dari
perogram di atas:
Pada baris berikut:
Manusia m = new Manusia("Sayuti"); : untuk Membuat objek baru dari
kelas manusia
m.status(); = untuk memanggil method status
m.bernafas(); =
untuk memanggil method m dari kelas
manusia
C.
Tumbuhan.java
public class Manusia
extends MakhlukHidup {
Manusia(String nama) {
super(nama, 2,false);
}
public void bernafas() {
System.out.println(nama+" bernafas
dengan menghirup 02");
}
public static void main(String [] args) {
Manusia m = new
Manusia("Sayuti");
m.status();
m.bernafas();
}
}
Hasil Eksekusi Dari progam di atas:
D. Pekerjaan.java
interface Pekerjaan {
public void
namaPekerjaan();
public void
gaji();
}
Program di tas tidak menghasilkan out put krna tidak memiliki fungsi utama
E.
Sasya.java
public class Sasya
extends Manusia implements Pekerjaan {
public Sasya() {
super("Sasya");
}
public void namaPekerjaan() {
System.out.println("Pekerjaan
:Sekretaris");
}
public void gaji() {
System.out.println("PGaji : Rp.
3.000.000");
}
public static void main(String [] args) {
Sasya s = new Sasya();
s.status();
s.bernafas();
s.namaPekerjaan();
s.gaji();
}
}
Hasil eksekusi program di atas:
F.
JantungManusia.java
Jantung Manuisa
class Orang {
private int
jumlKaki = 2;
public void
dengarBunyiJantung() {
Jantung
j = new Jantung() {
j.bunyijantung();
}
public
void tahanNafas()
System.out.println("Jantung berhenti berdetak!");
}
//inner
class
Class
Jantung {
public
void bunyiJantung() {
System.out.println("Silahkan ke "+jumlKaki+"
kaki.");
tahanNafas();
}
}
Class JantungManusia {
public
static void main(String[] args) {
Orang o
= new Orang();
Orang.Jantung p = o.new Jantung();
o.dengarBunyiJantung();
p.istirahat();
}
}
Hasil
Eksekusi dari program di atas:
Tidak ada komentar:
Posting Komentar