Upload
others
View
9
Download
0
Embed Size (px)
Citation preview
Struktur Class Lanjutan
Prepared by Viska Mutiawani
Subtopik Struktur Class Lanjutan
For-each loop
Varargs
Autoboxing dan Unboxing
Enum
Static
Inner class
“regular” inner class
Method-local inner class
Anonymous inner class
Static nested class
For-each loop
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:
for(data_type variable : array | collection){}
Contoh for-each loopclass 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 list=new ArrayList();
list.add(“ade");
list.add(“irma");
list.add(“sari");
for(String s:list){
System.out.println(s);
}
}
}
Varargs
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):
return_type method_name(data_type... variableName){}
Contoh penggunaan varargsclass 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 methodinvoked ");
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
}
}
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:
void method(String... a, int... b){}//Compile time error
void method(int... a, String b){}//Compile time error
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
}
}
Autoboxing dan Unboxing
Autoboxing dan Boxing
Boxing
Konversi otomatis dari tipe data primitif ke class Wrappernya.
Unboxing
Konvers otomatis dari class Wrapper ke tipe data primitifnya.
Keuntungan:
Programmer tidak perlu menulis code untuk konversi data
Contoh
Autoboxing Unboxing
class BoxingExample1{
public static void main(Stringargs[]){
int a=50;
Integer a2=new Integer(a); //Boxing
Integer a3=5;//Boxing
System.out.println(a2+" "+a3);
}
}
class UnboxingExample1{
public static void main(Stringargs[]){
Integer i=new Integer(50);
int a=i;
System.out.println(a);
}
}
Contoh pada operator perbandingan
class UnboxingExample2{
public static void main(String args[]){
Integer i=new Integer(50);
if(i
Pada method overloading
Autoboxing dan unboxing juga dapat dilakukan pada method overloading.
Namun ada aturan prioritas:
Widening beats boxing
Widening beats varargs
Boxing beats varargs
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);
}
}
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);
}
}
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);
}
}
Enum
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.
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
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);
}}
Method values() pada enum
Java compiler secara otomatis menambah method values() ketika mencipta enum.
Method values() mengembalikan array yang mengandung semua nilai dalam enum.
Enum di luar class
Enum juga bisa didefinisikan di luar class, karena enummirip dengan class
enum Season { WINTER, SPRING, SUMMER, FALL }
class EnumExample2{
public static void main(String[] args) {
Season s=Season.WINTER;
System.out.println(s);
}}
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
Contoh pada switch-caseclass 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");
}
}}
Static
Static
Modifier static biasanya dipergunakan untukmembuat method atau variable yang menyatakanmilik dari kelas, bukan milik objek (sehinggaindependen 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 dalaminner class, local variable)
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
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:
Memory efficient
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.
Contohclass 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();
}
}
Ilustrasi
College=Unsyiah
Bandingkanclass Counter{
int count=0;//will get memory when
//instance is created
Counter(){
count++;
System.out.println(count);
}
public static void main(String args[]){
Counter c1=new Counter();
Counter c2=new Counter();
Counter c3=new Counter();
}
}
class Counter2{
static int count=0;//will get memory
//only once and retain its value
Counter2(){
count++;
System.out.println(count);
}
public static void main(String args[]){
Counter2 c1=new Counter2();
Counter2 c2=new Counter2();
Counter2 c3=new Counter2();
}
}
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
Contohclass Student9{
int NIM;
String name;
static String college = “Unsyiah";
static void change(){
college = “USK";
}
Student9(int r, String n){
NIM = r;
name = n;
}
void display (){System.out.println(NIM+""+name+" "+college);}
public static void main(String args[]){
Student9.change();
Student9 s1 = new Student9 (111, "Karan");
Student9 s2 = new Student9 (222, "Aryan");
Student9 s3 = new Student9 (333, "Sonoo");
s1.display();
s2.display();
s3.display();
}
}
Batasan pada method static
Ada 2 batasan bagi method static:
Method static tidak dapat menggunakan variable non-static atau memanggil method non-static secara langsung
Kata kunci this dan super tidak dapat digunakan padabagian yang static
Apakah boleh coding di bawah?class A{
int a=40;//non static
public static void main(String args[]){
System.out.println(a);
}
}
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
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:
initializer block tidak memiliki nama.
initializer block tidak memiliki parameter.
initializer block tidak mengembalikan apapun
Contoh
class A2{
static{System.out.println("static block is invoked");}
public static void main(String args[]){
System.out.println("Hello main");
}
}
Sesama static ikut urutan
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
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:
import static
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.
Contoh
Sumber: http://catatan.desdrianton.net/scjp/content/STATIC.htm
Inner Class
Inner class
Suatu class yang berada di dalam class yang lain.
Ada 4 jenis inner class:
“Regular” Inner class
Method-local inner class
Anonymous inner class
Static nested classes
“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.
Contohclass 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.
Objek inner class
Untuk membuat objek dari inner class, harusmembuat objek dari outer class terlebih dahulu.
Objek dari inner class dapat dibuat:
Dari dalam outer class
Dari luar outer classclass A {
void buatInstanceKelasB() {
B b = new B();
}
class B {
}
}
Objek di dalam dan luar outer class
class A {
void buatInstanceKelasB() {
B b = new B();
}
class B {
}
}
class A {
class B {
void sesuatuDiKelasB() {
System.out.println("Hello, ini dimethod kelas B");
}
}}
public class Contoh {
public static void main(String[] args) {
A a = new A();
A.B b = a.new B();
b.sesuatuDiKelasB();
}
}
A.B b = new A().new B();
This pada inner class
Aturan inner class dalam hal mereferensi dirinya sendiri atau instance dari outer class adalah sebagai berikut :
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.
Contohclass 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();
}
}
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 harusmembuat 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
Method-local inner class (2)
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).
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.
Anonymous Inner Class Suatu inner class yang dideklarasikan tanpa nama kelas. Anonymous inner class dapat berupa (tidak bisa secara
bersamaan): Subclass dari suatu class yang telah dideklarasikan Kelas implementasi dari suatu interface
Tujuan : mengoverride satu atau lebih method dari super classnya atau
mengimplement semua method dari suatu interface.
Anonymous inner class tidak dapat mengimplement lebih darisebuah interface.
Bagian dari suatu statement. Bentuk dari polymorphisme
Method yang dapat dipanggil dari anonymous inner class adalahmethod yang dideklarasikan di super class atau interfacenya(meskipun di dalam anonymous inner class dapat dideklarasikanmethod-method yang tidak ada di super class atau interfacenya).
Anonymous inner class sebagai subclassclass 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
Anonymous inner class sebagai implementasi dari interfaceinterface 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();
}
}
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 non-static member dari outer classnya.
Contohclass 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 classb.lakukanSesuatu();
}}