Struktur Class Lanjutan Prepared by Viska Mutiawani
1
[email protected]
Subtopik Struktur Class Lanjutan For-each loop Varargs Autoboxing dan Unboxing Enum Static Inner class
2
“regular” inner class Method-local inner class Anonymous inner class Static nested class
[email protected]
For-each loop
3
[email protected]
Advanced or Enhanced For Loop For-each loop diperkenal di Java versi 5. Umumnya digunakan untuk menjejaki (traverse) array atau unsur dalam collection. Kegunaan:
Membuat code lebih mudah dibaca Mengeliminasi kemungkinan error
Syntax:
4
for(data_type variable : array | collection){}
[email protected]
Contoh for-each loop class ForEachExample1{ public static void main (String args[]){ int arr[]={12,13,14,44}; for(int i:arr){ System.out.println(i); } } }
import java.util.*; class ForEachExample2{ public static void main (String args[]){ ArrayList<String> list=new ArrayList <String>(); list.add(“ade"); list.add(“irma"); list.add(“sari"); for(String s:list){ System.out.println(s); } } }
5
[email protected]
Varargs
6
[email protected]
Variable Argument (varargs) Varargs membolehkan method untuk argumen yang belum diketahui jumlahnya. Sebelum adanya varargs, biasanya kita menggunakan overloaded method atau array sebagai parameter. Namun hal ini mempersulit code maintenance. Jika kita tidak tahu berapa parameter yang akan diantar pada method, maka gunakan varargs. Syntax varargs (… setelah tipe data):
7
return_type method_name(data_type... variableName){}
[email protected]
Contoh penggunaan varargs class VarargsExample1{ static void display(String... values){ System.out.println("display method invoked "); } public static void main(String args[]){ display();//zero argument display("my","name","is","varargs"); //four arguments }
class VarargsExample2{ static void display(String... values){ System.out.println("display method invoked "); for(String s:values){ System.out.println(s); } } public static void main(String args[]){ display();//zero argument display("hello");//one argument display("my","name","is","varargs"); //four arguments } }
} 8
[email protected]
Aturan penggunaan varargs Ada aturan sewaktu menggunakan varargs, jika tidak diikuti maka code tidak berhasil dikompil
Hanya boleh ada satu varargs dalam method. Varargs haruslah argumen yang paling akhir.
Contoh varargs yang salah:
9
void method(String... a, int... b){}//Compile time error void method(int... a, String b){}//Compile time error
[email protected]
Contoh varargs class VarargsExample3{ static void display(int num, String... values){ System.out.println("number is "+num); for(String s:values){ System.out.println(s); } } public static void main(String args[]){ display(500,"hello");//one argument display(1000,"my","name","is","varargs");//four arguments } } 10
[email protected]
Autoboxing dan Unboxing
11
[email protected]
Autoboxing dan Boxing
Boxing
Unboxing
Konversi otomatis dari tipe data primitif ke class Wrappernya. Konvers otomatis dari class Wrapper ke tipe data primitifnya.
Keuntungan:
12
Programmer tidak perlu menulis code untuk konversi data
[email protected]
Contoh Autoboxing
Unboxing
class BoxingExample1{
class UnboxingExample1{
public static void main(String args[]){
public static void main(String args[]){
int a=50;
Integer i=new Integer(50);
Integer a2=new Integer(a); //Boxing
int a=i; System.out.println(a);
Integer a3=5;//Boxing
} }
System.out.println(a2+" "+a3); } } 13
[email protected]
Contoh pada operator perbandingan class UnboxingExample2{ public static void main(String args[]){ Integer i=new Integer(50); if(i<100){ //unboxing internally System.out.println(i); } } }
14
[email protected]
Pada method overloading
Autoboxing dan unboxing juga dapat dilakukan pada method overloading. Namun ada aturan prioritas:
15
Widening beats boxing Widening beats varargs Boxing beats varargs
[email protected]
Contoh widening beats boxing class Boxing1{ static void m(int i){System.out.println("int");} static void m(Integer i){System.out.println("Integer");} public static void main(String args[]){ short s=30; m(s); } }
16
[email protected]
Contoh widening beats varargs class Boxing2{ static void m(int i, int i2){System.out.println("int int");} static void m(Integer... i){System.out.println("Integer...");}
public static void main(String args[]){ short s1=30,s2=40; m(s1,s2); } }
17
[email protected]
Contoh boxing beats varargs class Boxing3{ static void m(Integer i){System.out.println("Integer");} static void m(Integer... i){System.out.println("Integer...");}
public static void main(String args[]){ int a=30; m(a); } }
18
[email protected]
Enum
19
[email protected]
Enum
Enum merupakan tipe data yang mengandung kumpulan konstan yang tetap. Enum juga dapat dianggap seperti class yang memiliki beberapa nilai konstan yang tetap. Contoh digunakan untuk hari dalam seminggu (SENIN, SELASA, RABU, KAMIS, JUMAT, SABTU, MINGGU). Contoh lainnya untuk arah mata angin (UTARA, SELATAN, BARAT, TIMUR). Enum adalah static dan final (secara implisit) Mulai diperkenalkan pada Java versi 5. 20
[email protected]
Point penting pada Enum
Enum memperbaiki type safety Enum dapat digunakan pada switch Enum dapat dijejaki (traverse) Enum dapat memiliki field, constructor dan method Enum tidak dapat extend class lain karena secara bawaan Enum adalah subclass dari class Enum Enum dapat mengimplement banyak interface
21
[email protected]
Contoh sederhana class EnumExample1{ public enum Season { WINTER, SPRING, SUMMER, FALL } public static void main(String[] args) { for (Season s : Season.values()) System.out.println(s); }}
22
[email protected]
Method values() pada enum
Java compiler secara otomatis menambah method values() ketika mencipta enum. Method values() mengembalikan array yang mengandung semua nilai dalam enum.
23
[email protected]
24
[email protected]
Enum di luar class Enum juga bisa didefinisikan di luar class, karena enum mirip dengan class enum Season { WINTER, SPRING, SUMMER, FALL }
class EnumExample2{ public static void main(String[] args) { Season s=Season.WINTER; System.out.println(s); }} 25
[email protected]
Peraturan lainnya
Enum memiliki private constructor.
Dapatkan kita mencipta objek dari enum dengan keyword new? Tidak, kenapa?
Enum boleh memiliki method abstract. Enum dapat dipakai pada switch-case
26
[email protected]
Contoh pada switch-case class EnumExample5{ enum Day{ SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY} public static void main(String args[]){ Day day=Day.MONDAY; switch(day){ case SUNDAY: System.out.println("sunday"); break; case MONDAY: System.out.println("monday"); break; default: System.out.println("other day"); } }}
27
[email protected]
Static
28
[email protected]
Static
Modifier static biasanya dipergunakan untuk membuat method atau variable yang menyatakan milik dari kelas, bukan milik objek (sehingga independen terhadap objek) Yang dapat diberi modifier static:
Variable (atau class variable) Method (atau class method) Initialization block (static initializer) Inner class dalam class lain (bukan dalam method)
Selain dari itu tidak bisa (constructor, class, interface, inner class dalam method, method dalam inner class, local variable) 29
[email protected]
Java Static Variable
Bila variable diberi modifier static, maka variable tersebut menjadi milik kelas. Pengertian menjadi milik kelas adalah, kita dapat mengakses atau menggunakannya tanpa proses instansiasi objek dari kelas tersebut (yang kita butuhkan hanya kelas tersebut dapat diakses). Static variable akan disharing oleh semua objek pada class yang sama
30
[email protected]
Java Static Variable
Static variable digunakan untuk atribut yang bernilai sama untuk seluruh objek class tersebut
Nama perusahaan Nama universitas
Static variable hanya menggunakan memori sekali pada class saat class tersebut diloading. Keuntungan:
31
Memory efficient
[email protected]
Kondisi tidak pakai variabel statis
Andai ada class Student yang mewakili student di Unsyiah.
class Student{ int NIM; String name; String college=“Unsyiah"; }
NIM dan name jelas akan berbeda untuk setiap objek Student. Namun semuanya adalah mahasiswa di Unsyiah. Kalau kita buat college sebagai static maka memory yang dipakai hanya sekali. 32
[email protected]
Contoh class Student8{ int NIM; String name; static String college ="Unsyiah"; Student8(int r,String n){ NIM = r; name = n; } void display (){System.out.println(NIM+" "+name+" "+college);} public static void main(String args[]){ Student8 s1 = new Student8(111,"Karan"); Student8 s2 = new Student8(222,"Aryan"); s1.display(); s2.display(); } }
33
[email protected]
Ilustrasi College=Unsyiah
34
[email protected]
Bandingkan class Counter{ int count=0;//will get memory when //instance is created
class Counter2{ static int count=0;//will get memory //only once and retain its value
Counter(){ count++; System.out.println(count); }
Counter2(){ count++; System.out.println(count); }
public static void main(String args[]){
public static void main(String args[]){
Counter c1=new Counter(); Counter c2=new Counter(); Counter c3=new Counter();
Counter2 c1=new Counter2(); Counter2 c2=new Counter2(); Counter2 c3=new Counter2();
} }
} }
35
[email protected]
Java Static Method
Method static adalah method milik class. Method static dapat dipanggil tanpa perlu menciptakan objek dari class tersebut. Method static dapat mengakses data static dan dapat merubah nilainya. static method dan static variable ikut diwariskan pada subclass
36
[email protected]
Contoh void display (){System.out.println(NIM+" "+name+" "+college);}
class Student9{ int NIM;
public static void main(String args[]){ Student9.change();
String name; static String college = “Unsyiah";
Student9 s1 = new Student9 (111, "Karan"); Student9 s2 = new Student9 (222, "Aryan"); Student9 s3 = new Student9 (333, "Sonoo");
static void change(){ college = “USK"; } Student9(int r, String n){
s1.display(); s2.display(); s3.display(); }
NIM = r; name = n; }
37
}
[email protected]
Batasan pada method static
Ada 2 batasan bagi method static:
Method static tidak dapat menggunakan variable nonstatic atau memanggil method non-static secara langsung Kata kunci this dan super tidak dapat digunakan pada bagian yang static
Apakah boleh coding di bawah?
class A{ int a=40;//non static public static void main(String args[]){ System.out.println(a); } } 38
[email protected]
Kenapa method main pada Java static?
Andaikan method main non-static maka JVM perlu mencipta objek terlebih dahulu baru memanggil method main() -> extra memory allocation
39
[email protected]
Java Static Block
Java static block juga disebut initialization block (block initializer) Digunakan untuk menginisialisasi unsur data yang static. Akan dieksekusi sebelum method main pada saat loading class. Sifatnya:
40
initializer block tidak memiliki nama. initializer block tidak memiliki parameter. initializer block tidak mengembalikan apapun
[email protected]
Contoh class A2{ static{System.out.println("static block is invoked");} public static void main(String args[]){ System.out.println("Hello main"); } }
41
[email protected]
Sesama static ikut urutan
42
[email protected]
Dapatkah kita eksekusi program tanpa method main()? class A3{ static{ System.out.println("static block is invoked"); System.exit(0); } }
Pada Java versi sebelum 7, hal ini tidak masalah Namun pada Java versi 7 ke atas, akan ada error
43
[email protected]
Static import
Static import diperkenalkan pada Java versi 5 Static import dapat dipergunakan bila kita ingin mengakses member static dari kelas lain tanpa harus mengetik nama kelas. Member static disini adalah :
static variable static method
Penulisannya:
44
import static
[email protected]
Contoh deklarasi
Contoh deklarasi yang mungkin dari static import:
Cara 1 : import static namaPackage.namaKelas.namaMemberStatic; Cara 2 : import static namaPackage.namaKelas.*;
Kita harus tetap menggunakan nama kelas untuk memanggil suatu member static, bila nama dari member static tersebut ternyata dimiliki oleh lebih dari 1 kelas yang di-import static.
45
[email protected]
Contoh
Sumber: http://catatan.desdrianton.net/scjp/content/STATIC.htm 46
[email protected]
Inner Class
47
[email protected]
Inner class
Suatu class yang berada di dalam class yang lain. Ada 4 jenis inner class:
48
“Regular” Inner class Method-local inner class Anonymous inner class Static nested classes
[email protected]
“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. Inner class didefinisikan (ditulis) di dalam kurung kurawal dari outer class.
49
[email protected]
Contoh class MyOuter { class MyInner { } }
MyInner adalah inner class. Jika coding di atas dikompilasi maka akan ada 2 file .class yaitu MyOuter.class dan MyOuter$MyInner.class Sebuah inner class tidak dapat memiliki member static.
Objek dari inner class memiliki akses ke semua member dari outer class termasuk juga yang private. 50
[email protected]
Objek inner class
Untuk membuat objek dari inner class, harus membuat objek dari outer class terlebih dahulu. Objek dari inner class dapat dibuat:
Dari dalam outer class Dari luar outer class
class A { void buatInstanceKelasB() { B b = new B(); } class B { } }
51
[email protected]
Objek di dalam dan luar outer class class A {
class A { class B {
void buatInstanceKelasB() {
void sesuatuDiKelasB() {
B b = new B();
System.out.println("Hello, ini di method kelas B");
}
}
class B { }}
} }
public class Contoh { public static void main(String[] args) { A a = new A();
A.B b = new A().new B();
A.B b = a.new B(); b.sesuatuDiKelasB(); } }
52
[email protected]
This pada inner class
Aturan inner class dalam hal mereferensi dirinya sendiri atau instance dari outer class adalah sebagai berikut :
53
Untuk merujuk pada dirinya sendiri (instance dari inner class) dari dalam inner class, dapat digunakan referensi this atauNamaOuterClass.NamaInnerClass.this. Untuk merujuk pada instance dari outer classnya dari dalam inner class, dapat digunakan referensi NamaOuterClass.this.
[email protected]
Contoh 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(); } }
54
[email protected]
Method-local inner class
Method-local inner class adalah inner class yang dideklarasikan di dalam method.
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.
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
55
[email protected]
Method-local inner class (2)
Method-local inner class hanya dapat diinstansiasi dari dalam method yang mendefinisikan methodlocal 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). 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. 56
[email protected]
Anonymous Inner Class
Suatu inner class yang dideklarasikan tanpa nama kelas. Anonymous inner class dapat berupa (tidak bisa secara bersamaan):
Tujuan :
Subclass dari suatu class yang telah dideklarasikan Kelas implementasi dari suatu interface mengoverride satu atau lebih method dari super classnya atau mengimplement semua method dari suatu interface.
Anonymous inner class tidak dapat mengimplement lebih dari sebuah interface. Bagian dari suatu statement. Bentuk dari polymorphisme
57
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).
[email protected]
Anonymous inner class sebagai subclass class A { int i = 10; void lakukanSesuatu() { i--; System.out.println("i = " + i); } } public class BelajarAnonymous1 { //1 public static void main(String[] args) { A a = new A() { //3 void lakukanSesuatu() { //4 i++; System.out.println("i = " + i); } //4 }; //3
//2
a.lakukanSesuatu(); } //2 } //1
58
[email protected]
Anonymous inner class sebagai implementasi dari interface 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(); } }
59
[email protected]
Static nested class
Static nested class adalah inner class dengan modifier static. Static nested class sebenarnya bukan inner class, static nested class hanyalah top-level class yang di sarangkan di dalam class lain. Karena static, maka untuk membuat instance dari static nested class tidak diperlukan instance dari outer classnya. (tidak seperti regular inner class ataupun method-local inner class). Static nested class tidak dapat mengakses nonstatic member dari outer classnya. 60
[email protected]
Contoh 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(); } } 61
[email protected]