A. Modifier pada Class
Untuk menentukan hubungan suatu unsur kelas dengan usnsur klas yang lainnya, contoh hubungan kepemilikan antara kelas dan objek.
Modifier suatu class-member dibagi menjadi 2, yaitu :
1. Access modifier
2. Non-access modifier
1. Access Modifier
a. Class member dapat memiliki 4 buah access control, yaitu:
1) public
2) protected
3) default
4) private
b. Tiga diantara access control tersebut adalah access modifier, yaitu:
1) public
2) protected
3) private
Default access control adalah access control yang didapat bila kita tidak mencantumkan access modifier apapun pada class member. Agar suatu class member dapat diakses oleh class lain, maka ada 2 syarat yang harus dipenuhi, yaitu :
1. Class tempat member yang akan diakses harus tampak oleh class pengakses.
2. Member yang akan diakses harus tampak oleh class pengakses.
Untuk mengakses member suatu class dapat dengan salah satu dari 6 cara berikut ini :
1. Untuk member yang dideclare dengan menggunakan keyword this.
2. Untuk member yang dideclare dengan menggunakan variable reference.
3. Untuk member yang diinherit dengan menggunakan keyword this.
4. Untuk member yang diinherit dengan menggunakan keyword super.
5. Untuk member yang diinherit dengan menggunakan variable reference.
6. Untuk member kelas lain dengan menggunakan variable reference.
Note :
1. Cara 1 dan 2 dipergunakan untuk mengakses member dari kelas itu sendiri.
2. Cara 3,4 dan 5 dipergunakan untuk mengakses member dari superclass.
3. Cara 6 dipergunakan untuk mengakses member dari kelas lain.
· Berikut ini adalah rangkuman access control member (method dan field) :
VISIBILITY
|
public
|
protected
|
default
|
private
|
Contoh
| |
Dari class yang sama
| ||||||
Dengan keywordthis
|
Ö
|
Ö
|
Ö
|
Ö
|
Contoh 1
| |
Dengan variable reference
|
Ö
|
Ö
|
Ö
|
Ö
|
Contoh 2
| |
Dari subclass pada package yang sama
| ||||||
Dengan keywordthis
|
Ö
|
Ö
|
Ö
|
´
|
Contoh 3
| |
Dengan keywordsuper
|
Ö
|
Ö
|
Ö
|
´
|
Contoh 4
| |
Dengan variable reference
|
Ö
|
Ö
|
Ö
|
´
|
Contoh 5
| |
Dari non-subclass pada package yang sama
| ||||||
Dengan variable reference
|
Ö
|
Ö
|
Ö
|
´
|
Contoh 6
| |
Dari subclass pada package yang berbeda
| ||||||
Dengan keywordthis
|
Ö
|
Ö
|
´
|
´
|
Contoh 7
| |
Dengan keywordsuper
|
Ö
|
Ö
|
´
|
´
|
Contoh 8
| |
Dengan variable reference
|
Ö
|
´
|
´
|
´
|
Contoh 9
| |
Dari non-subclass pada package yang berbeda
| ||||||
Dengan variable reference
|
Ö
|
´
|
´
|
´
|
Contoh 10
|
Program 1
|
package paket.a;
public class Contoh1 {
public static void main(String[] args) {
A a = new A();
a.printString();
}
}
class A {
public String s1 = "public";
protected String s2 = "protected";
String s3 = "default";
private String s4 = "private";
void printString() {
System.out.println(this.s1);
System.out.println(this.s2);
System.out.println(this.s3);
System.out.println(this.s4);
}
}
|
Program di atas akan menghasilkan :
public
protected
default
private
|
Program 2
|
package paket.a;
public class Contoh2 {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
a1.printString(a2);
}
}
class A {
public String s1 = "public";
protected String s2 = "protected";
String s3 = "default";
private String s4 = "private";
void printString(A a) {
System.out.println(a.s1);
System.out.println(a.s2);
System.out.println(a.s3);
System.out.println(a.s4);
}
}
|
Program di atas akan menghasilkan :
public
protected
default
private
|
Program 3
|
package paket.a;
public class Contoh3 {
public static void main(String[] args) {
B b = new B();
b.printString();
}
}
class A {
public String s1 = "public";
protected String s2 = "protected";
String s3 = "default";
private String s4 = "private";
}
class B extends A {
void printString() {
System.out.println(this.s1);
System.out.println(this.s2);
System.out.println(this.s3);
System.out.println(this.s4);
}
}
|
Program di atas akan menghasilkan compile time error sbb:
E:\Data\Data NetBeans\scjp\src\paket\a\Contoh3.java:22: s4 has private access in paket.a.A
System.out.println(this.s4);
1 error
|
Program 4
|
package paket.a;
public class Contoh4 {
public static void main(String[] args) {
B b = new B();
b.printString();
}
}
class A {
public String s1 = "public";
protected String s2 = "protected";
String s3 = "default";
private String s4 = "private";
}
class B extends A {
void printString() {
System.out.println(super.s1);
System.out.println(super.s2);
System.out.println(super.s3);
System.out.println(super.s4);
}
}
|
Program di atas akan menghasilkan compile time error sbb:
E:\Data\Data NetBeans\scjp\src\paket\a\Contoh4.java:22: s4 has private access in paket.a.A
System.out.println(super.s4);
1 error
|
Program 5
|
package paket.a;
public class Contoh5 {
public static void main(String[] args) {
B b1 = new B();
B b2 = new B();
b1.printString(b2);
}
}
class A {
public String s1 = "public";
protected String s2 = "protected";
String s3 = "default";
private String s4 = "private";
}
class B extends A {
void printString(B b) {
System.out.println(b.s1);
System.out.println(b.s2);
System.out.println(b.s3);
System.out.println(b.s4);
}
}
|
Program di atas akan menghasilkan compile time error sbb:
E:\Data\Data NetBeans\scjp\src\paket\a\Contoh5.java:23: s4 has private access in paket.a.A
System.out.println(b.s4);
1 error
|
Program 6
|
package paket.a;
public class Contoh6 {
public static void main(String[] args) {
A a = new A();
B b = new B();
b.printString(a);
}
}
class A {
public String s1 = "public";
protected String s2 = "protected";
String s3 = "default";
private String s4 = "private";
}
class B {
void printString(A a) {
System.out.println(a.s1);
System.out.println(a.s2);
System.out.println(a.s3);
System.out.println(a.s4);
}
}
|
Program di atas akan menghasilkan compile time error sbb:
E:\Data\Data NetBeans\scjp\src\paket\a\Contoh6.java:24: s4 has private access in paket.a.A
System.out.println(a.s4);
1 error
|
Program 7
|
package paket.a;
public class A {
public String s1 = "public";
protected String s2 = "protected";
String s3 = "default";
private String s4 = "private";
}
|
package paket.b;
import paket.a.A;
public class Contoh7 {
public static void main(String[] args) {
B b = new B();
b.printString();
}
}
class B extends A {
void printString() {
System.out.println(this.s1);
System.out.println(this.s2);
System.out.println(this.s3);
System.out.println(this.s4);
}
}
|
Program di atas akan menghasilkan compile time error sbb :
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh7.java:16: s3 is not public in paket.a.A; cannot be accessed from outside package
System.out.println(this.s3);
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh7.java:17: s4 has private access in paket.a.A
System.out.println(this.s4);
2 errors
|
Program 8
|
package paket.a;
public class A {
public String s1 = "public";
protected String s2 = "protected";
String s3 = "default";
private String s4 = "private";
}
|
package paket.b;
import paket.a.A;
public class Contoh8 {
public static void main(String[] args) {
B b = new B();
b.printString();
}
}
class B extends A {
void printString() {
System.out.println(super.s1);
System.out.println(super.s2);
System.out.println(super.s3);
System.out.println(super.s4);
}
}
|
Program di atas akan menghasilkan compile time error sbb :
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh8.java:16: s3 is not public in paket.a.A; cannot be accessed from outside package
System.out.println(super.s3);
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh8.java:17: s4 has private access in paket.a.A
System.out.println(super.s4);
2 errors
|
Program 9
|
package paket.b;
import paket.a.A;
public class Contoh9 {
public static void main(String[] args) {
A a = new A();
B b = new B();
b.printString(a);
}
}
class B extends A {
void printString(A a) {
System.out.println(a.s1);
System.out.println(a.s2);
System.out.println(a.s3);
System.out.println(a.s4);
}
}
|
Program di atas akan menghasilkan compile time error sbb:
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh9.java:16: s2 has protected access in paket.a.A
System.out.println(a.s2);
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh9.java:17: s3 is not public in paket.a.A; cannot be accessed from outside package
System.out.println(a.s3);
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh9.java:18: s4 has private access in paket.a.A
System.out.println(a.s4);
3 errors
|
Program 10
|
package paket.b;
import paket.a.A;
public class Contoh10 {
public static void main(String[] args) {
A a = new A();
B b = new B();
b.printString(a);
}
}
class B extends A {
void printString(A a) {
System.out.println(a.s1);
System.out.println(a.s2);
System.out.println(a.s3);
System.out.println(a.s4);
}
}
|
Program di atas akan menghasilkan compile time error sbb:
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh10.java:16: s2 has protected access in paket.a.A
System.out.println(a.s2);
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh10.java:17: s3 is not public in paket.a.A; cannot be accessed from outside package
System.out.println(a.s3);
E:\Data\Data NetBeans\scjp\src\paket\b\Contoh10.java:18: s4 has private access in paket.a.A
System.out.println(a.s4);
3 errors
|
· Selain karena access control dari member class, prasyarat lain agar suatu class-member dapat diaccess adalah class tempat class-member yang akan diakses harus tampak dari class yang mengakses. Bila prasyarat ini tidak terpenuhi, maka member-class tetap tidak dapat diakses (hal ini biasanya terjadi karena class yang diakses dan class yang mengakses berbeda packagenya).
Bila package berbeda, maka class yang diakses harus bermodifier public.
Bila kedua class berasal dari package yang berbeda, maka dapat menggunakan statement import ataupun qualified class name.
Contoh:
Program 01 (contoh qualified class name)
|
package packageSatu;
public class A
{
public static void doA()
{
System.out.println("A.doA()");
}
}
|
package packageDua;
public class B
{
public static void main(String[] args)
{
packageSatu.A.doA(); //qualified class name
}
}
|
Program di atas akan menghasilkan :
A.doA()
|
c. Detil modifier private
· Bila suatu class-member dideklarasikan private, maka subclass tidak dapat menginherit class-member tersebut.
Contoh :
Program 02
|
package classMembers;
public class Private1
{
public static void main(String[] args)
{
B b = new B();
b.doB();
}
}
class A
{
private void myPrivateMethod()
{
System.out.println("A.myPrivateMethod()");
}
}
class B extends A
{
void doB()
{
myPrivateMethod();
}
}
|
Programg di atas akan menghasilkan compile time error sbb :
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method myPrivateMethod() from the type A is not visible
at classMembers.B.doB(Private1.java:24)
at classMembers.Private1.main(Private1.java:8)
|
· Bila pada superclass terdapat class-member dengan modifier private, maka pada subclass kita dapat mendeklarasikan class-member dengan signature yang sama dengan class-member pada superclass dengan modifier private tadi.
Bila class-member tersebut adalah method, maka kita tidak melakukan overriding, sebab method private tidak diinherit (sehingga otomatis tidak dapat dioverriding).
Contoh :
Program 03
|
package classMembers;
public class Private2
{
public static void main(String[] args)
{
Y y = new Y();
y.doSesuatu();
}
}
class X
{
private void doSesuatu()
{
System.out.println("X.doSesuatu()");
}
}
class Y extends X
{
void doSesuatu()
{
System.out.println("Y.doSesuatu()");
}
}
|
Program di atas akan menghasilkan :
Y.doSesuatu()
|
d. Detil modifier protected
· Subclass (yang berbeda package dengan superclass) dapat mengakses protected class-member dari superclass hanya melalui inheritance(this dan super), tidak dapat melalui reference.
Contoh :
Program 04
|
package classMembers.packageSatu;
public class X
{
protected void doSesuatu()
{
System.out.println("X.doSesuatu");
}
}
|
package classMembers.packageDua;
import classMembers.packageSatu.X;
public class Y extends X
{
public static void main(String[] args)
{
Y y = new Y();
y.doSesuatu(); //OK (melalui inheritance dari Y)
X x = new X();
x.doSesuatu(); //ERROR (melalui reference)
}
}
|
Program di atas akan menghasilkan compile time error sbb :
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method doSesuatu() from the type X is not visible
at classMembers.packageDua.Y.main(Y.java:13)
|
· Bila ada class-member pada superclass bermodifier protected, dan subclass berada pada package lain, maka class-member bermodifier protected tadi tidak dapat diakses oleh class lain pada package yang sama dari subclass (seakan-akan class-member tersebut bermodifier private dan hanya dapat diakses dari subclass dan sub-subclassnya).
Contoh:
Program 05
|
package classMembers.packageSatu;
public class G
{
protected void doSesuatu()
{
System.out.println("G.doSesuatu()");
}
}
|
package classMembers.packageDua;
public class H extends classMembers.packageSatu.G
{
}
|
package classMembers.packageDua;
public class I
{
public static void main(String[] args)
{
I i = new I();
i.doSesuatu(); //ERROR
}
}
|
Program di atas akan menghasilkan compile time error sbb :
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method doSesuatu() is undefined for the type I
at classMembers.packageDua.I.main(I.java:8)
|
2. Non-Access Modifier
· Yang termasuk non-access modifier adalah keyword-keyword berikut :
1. abstract
2. final
3. native
4. static
5. strictfp
6. synchronized
7. transient
8. volatile
· Tidak semua member class dapat menggunakan non-access modifier diatas, berikut ini adalah table yang menunjukkan apakah class member tertentu dapat menggunakan non-access modifier tertentu:
NO
|
Modifier
|
Class Member
| ||
Field
|
Method
|
Inner class
| ||
1
|
abstract
|
´
|
Ö
|
Ö
|
2
|
final
|
Ö
|
Ö
|
Ö
|
3
|
native
|
´
|
Ö
|
´
|
4
|
static
|
Ö
|
Ö
|
Ö
|
5
|
strictfp
|
´
|
Ö
|
Ö
|
6
|
synchronized
|
´
|
Ö
|
´
|
7
|
transient
|
Ö
|
´
|
´
|
8
|
volatile
|
Ö
|
´
|
´
|
Note : field yang diterangkan di table di atas adalah variable yang merupakan class member (static atau non-static variable). Inner class yang diterangkan di table di atas adalah regular inner class dan static inner class.
a. Modifier abstract
· Modifier ini hanya dapat diterapkan untuk method dan inner class (field tidak dapat dikenai modifier ini).
· abstract method adalah method yang dideklarasikan, akan tetapi tidak diimplementasikan. abstract method tidak memiliki badan method, akan tetapi setelah deklarasi nama method langsung diberi tanda titik koma (semicolon).
Contoh:
Program xx
|
abstract class A {
abstract void myAbstractMethod(String s);
}
|
· Modifier abstract hanya dapat diberikan pada method-method yang terletak pada class abstract (class yang diberi modifier abstract) .
· Suatu method yang dideklarasikan abstract tidak dapat memiliki modifier static.
Contoh:
Program xx
|
abstract class A {
abstract static void myMethod();
}
|
Program di atas akan menghasilkan compile time error sbb :
E:\Data\Data NetBeans\scjp\src\CobaInner.java:23: illegal combination of modifiers: abstract and static
abstract static void myMethod();
1 error
|
b. Modifier final
· Modifier ini dapat diterapkan pada field, method dan inner class.
· Bila diberikan pada method, maka subclass tidak akan dapat mengoverride method final pada superclass.
Contoh :
Program xx
|
class A {
final void myMethod() {}
}
class B extends A {
void myMethod() {}
}
|
Program di atas akan menghasilkan compile time error sbb :
E:\Data\Data NetBeans\scjp\src\Coba.java:33: myMethod() in B cannot override myMethod() in A; overridden method is final
void myMethod() {
1 error
|
· final variable dibahas pada bab : Tipe Data Primitive, Literals, dan Variable.
c. Modifier native
· Modifier ini hanya dapat diberikan pada method saja (field dan inner class tidak dapat diberi modifier ini).
· Method dengan modifier ini menyatakan bahwa implementasi method dalam kode program selain java (biasanya dalam bahasa C).
· Penulisan native method sama dengan abstract method, yaitu tanpa body, langsung titik koma (semicolon).
Contoh:
Program xx
|
class B {
native void myNativeMethod(String s);
}
|
d. Modifier static
· Modifier static berarti variabel diasosiasikan dengan kelas dan dipakai bersama objek-objek kelas itu. Variabel static disebut variabel kelas (class variable). Kita memanggilnya pada kelas bukan pada satu objek.
· Serupa dengan data statis, kita juga membuat metode yang hanya bertindak pada kelas, jadi hanya dapat mengakses variabel static saja bukan data instan tertentu. Kita mendeklarasikan dengan memberi modifier static.
· Terdapat kebutuhan variabel atau metode yang common (dipakai bersama) untuk semua objek tertentu. Modifier static menspesifikasikan bahwa variabel atau metode sama untuk semua objek kelas itu. Metode atau variabel yang memiliki modifier static adalah milik kelas. Metode static hanya dapat mengakses variabel statis. Metode nonstatis dapat mengakses variabel instan dan variabel static . Metode kelas (class method, yaitu dengan modifier statis) hanya diizinkan mengakses variabel static . Metode static adalah final.
· Metode static yang public yang dapat diakses tanpa perlu menciptakan instan kelas. Metode System.out.println () adalah static, sehingga dapat dipanggil tanpa diinisialisasi objek System. Variabel out adalah anggota static kelas System, akibatnya untuk mengaksesnya kita tidak perlu melakukan inisialisasi objek out
e. Modifier strictfp
· Modifier ini hanya dapat diterapkan untuk method dan inner class (field tidak dapat dikenai modifier ini).
· Dengan memberi modifier strictfp pada kelas, maka setiap kode pada kelas tersebut akan memnuhi standar IEEE 754 tentang aturan floating-point.
· Bila kelas tidak diberi modifier strictfp, kita masih dapat memberi modifier strictfp untuk method agar hanya method tersebut yang memenuhi standar IEEE 754.
f. Modifier synchronized
· Modifier synchronized ini hanya dapat diberikan pada method (field dan inner class tidak dapat dikenai modifier ini.
· Method dengan modifier ini akan menyebabkan method tersebut hanya dapat diakses oleh 1 thread dalam 1 waktu.
· Method dengan modifier ini dapat diber sembarang access modifier.
g. Modifier transient
· Modifier ini hanya dapat diberikan untuk field saja.
· Serializing adalah menyimpan suatu object ke dalam suatu I/O stream.
· Bila suatu field diberi modifier ini, maka field ini tidak akan diserialize ketika kita mengserialize suatu object dari kelas tempat field dideklarasikan.
h. Modifier volatile
· Modifier volatile mengacu ke objek dan nilai primitif yang dapat dimodifikasikan secara asinkron.
· Variabel-variabel ini diperlakukan secara spesial oleh kompilator untuk mengendalikan cara variabel-variabel itu diperbaru
B. SUMBER
1. Sun Certified Programmer for Java 5 Study Guide, by Katherine Sierra and Bert Bates.
2. The Java™ Language Specification, Third Edition, By James Gosling, Bill Joy, Guy Steele, Gilad Bracha.
Artikel Terkait
0 komentar :
Posting Komentar