สแตติก (Static) และอินสแตนท์ (Instance)
สแตติก (Static) คือ คำขยาย (Modifier) ของเมทธอด (Method) หรือคลาส (Class) ทำให้นำเข้าหน่วยความจำทันทีเมื่อคลาสถูกประมวลผล ทำให้เมทธอดหรือคลาสเข้าไปอยู่ในหน่วยความจำ และถูกเรียกใช้โดยเมทธอดที่มีลักษณะเป็นสแตติกได้ทันที เช่น main ในการเขียนโปรแกรมที่ประมวลผลในคอนโซล (Console)
ดังนั้นเมทธอดในคลาสเดียวกันที่ไม่เป็นสแตติก จะไม่สามารถถูกเรียกใช้ผ่าน main ซึ่งเป็นสแตติกได้ การเรียกใช้วัตถุที่ไม่เป็นสแตติกต้องจองพื้นที่ในหน่วยความจำผ่านการนิว (New) จึงจะเรียกใช้วัตถุเหล่านั้นได้
อินสแตนท์ (Instance) คือ การสร้างการอ้างอิงในหน่วยความจำจากวัตถุที่ถูกอ้างอิงไว้ โดยปกติวัตถุจะถูกอ้างอิง (Reference) และเกิดอินสแตนท์ขึ้นในหน่วยความจำที่มาจากคลาสต้นแบบผ่านคอนสตักเตอร์
อินสแตนท์สามารถถูกสร้างได้ทั้งภายใต้คลาส และภายใต้เมทธอด
เช่น Plane b; // b ถูกอ้างอิง แต่ยังไม่เกิดอินสแตนท์
b = new b( ); // เกิดอินสแตนท์ขึ้นแล้ว
b.tax = 6; // ใช้งานอินสแตนท์จากคลาสต้นแบบ
System.out.println( b.caltax( 100 ) ); // ใช้งานอินสแตนท์จากคลาสต้นแบบ
ภายในอินสแตนท์ตัวหนึ่งมีสิ่งที่เรียกว่าตัวอ้างอิง (Reference) หมายถึง ตัวชี้ (Pointer) ที่ถูกเรียกในภาษาซี ถูกใช้สำหรับอ้างอิง (Reference) วัตถุที่อยู่ภายในสิ่งที่ถูกอ้างอิงมา
Stack | Heap | |
int a = 5 |
“aaa”
“jkl” |
|
String s; | ||
s = new String(“aaa”); | ======> | |
int b; | ||
b = 6; | ||
String x = “jkl”;
String y = x; x = null; y = null; |
======>
======> |
วัตถุที่เป็นอินสแตนท์จะมีค่าจากเมทธอดชื่อ hashCode( ) ถูกใช้สำหรับอ้างอิง และนำไปเปรียบเทียบด้วยเมทธอดชื่อ equals( ) ได้
เช่น Human h ; h หมายถึง ตัวอ้างอิง (Reference) ของอินสแตนท์ (Instance)
h = new Human( ); บรรทัดนี้เป็นการสร้างอินสแตนท์ และเป็นการใช้หน่วยความจำ
String xx = “abc”;
String yy = “abc”;
System.out.println(xx.hashCode()); // 96354
System.out.println(yy.hashCode()); // 96354
System.out.println(xx.equals(yy)); //true
System.out.println(“A”.hashCode()); // 65 = 0100 0001
System.out.println(“AA”.hashCode());// 2080
System.out.println(“AB”.hashCode());// 2081
System.out.println(“BA”.hashCode());// 2111
ตัวอย่าง 1.8 ตรวจสอบผลการจองพื้นที่ในหน่วยความจำ
– สมาชิกของอาร์เรย์แบบ String 100 สมาชิก ใช้พื้นที่ใน Heap Memory 488 Bytes
– ทดสอบจองไป 1000 สมาชิก ใช้พื้นที่ใน Heap Memory 4880 Bytes
– โจทย์ : จงเขียนโปรแกรมแสดงการใช้พื้นที่ในหน่วยความจำผ่านอาร์เรย์แบบ String จำนวน 10 ครั้ง
แต่ละครั้งจองพื้นที่ให้กับอาร์เรย์แบบ String 100 สมาชิก และสรุปการใช้หน่วยความจำทั้งหมดอีกครั้ง
class x{
static String a[ ];
public static void main(String args[ ]) {
Runtime r = Runtime.getRuntime();
r.gc(); // Garbage Collector
long f,t;
System.out.println(“Total memory:” + r.totalMemory());
t = r.freeMemory();
for(int i=1;i<=10;i++) {
f = r.freeMemory();
a = new String[100]; // 488 Bytes for 100 Strings
System.out.println(“Memory Used:” + (f – r.freeMemory())); // 488
}
System.out.println(“TUsed:”+ (t – r.freeMemory())); // > 4880 Bytes
}
}
ตัวอย่าง 1.9 เมทธอดที่เป็นสแตติกกับไม่เป็นสแตติก
class x {
public static void main(String arg[]) {
System.out.println( x1() );
x oho = new x();
System.out.println( oho.x2() );
System.out.println( new x().x2() );
}
static int x1 () { return 5; }
int x2 () { return 6; }
}
ตัวอย่าง 1.10 อินสแตนท์ที่เป็นสแตติกกับไม่เป็นสแตติก
class x {
static int a;
int b = 8;
public static void main(String arg[]) {
System.out.println(a++ + ++a); // 2
x oho = new x();
System.out.println(oho.b);
}
}