61
Struktur Class Lanjutan Prepared by Viska Mutiawani 1 [email protected]

Struktur Class Lanjutan - informatika.unsyiah.ac.idinformatika.unsyiah.ac.id/~viska/pjl/P5-1 Struktur class lanjutan.pdf · Subtopik Struktur Class Lanjutan For-each loop Varargs

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

  • 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

    “regular” inner class

    Method-local inner class

    Anonymous inner class

    Static nested class

    2 [email protected]

  • For-each loop

    [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:

    for(data_type variable : array | collection){}

    [email protected]

  • 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);

    }

    }

    }

    [email protected]

  • Varargs

    [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):

    return_type method_name(data_type... variableName){}

    [email protected]

  • 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

    }

    }

    [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:

    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

    }

    }

    [email protected]

  • Autoboxing dan Unboxing

    [email protected]

  • 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

    [email protected]

  • 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);

    }

    }

    [email protected]

  • 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

    [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);

    }

    }

    [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);

    }

    }

    [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);

    }

    }

    [email protected]

  • Enum

    [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.

    [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

    [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);

    }}

    [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.

    [email protected]

  • [email protected]

  • 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);

    }}

    [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

    [email protected]

  • 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");

    }

    }}

    [email protected]

  • Static

    [email protected]

  • 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)

    [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

    [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:

    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.

    [email protected]

  • 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();

    }

    }

    [email protected]

  • Ilustrasi

    [email protected]

    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();

    }

    }

    [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

    [email protected]

  • 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();

    }

    }

    [email protected]

  • 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);

    }

    }

    [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

    [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:

    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");

    }

    }

    [email protected]

  • Sesama static ikut urutan

    [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

    [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:

    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.

    [email protected]

  • Contoh

    [email protected]

    Sumber: http://catatan.desdrianton.net/scjp/content/STATIC.htm

  • Inner Class

    [email protected]

  • 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

    [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.

    [email protected]

  • 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.

    [email protected]

  • 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 {

    }

    }

    [email protected]

  • 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();

    }

    }

    [email protected]

    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.

    [email protected]

  • 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();

    }

    }

    [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 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

    [email protected]

  • 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.

    [email protected]

  • 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).

    [email protected]

  • 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

    [email protected]

  • 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();

    }

    }

    [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 non-static member dari outer classnya.

    [email protected]

  • 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();

    }}

    [email protected]