สแตติก (Static) และอินสแตนท์ (Instance)

สแตติก (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);

}

}