ภาษาจาวา – Nested Classes

22
ภาษาจาวา – Nested Classes สมชาย ประสิทธิ์จูตระกูล

Transcript of ภาษาจาวา – Nested Classes

Page 1: ภาษาจาวา – Nested Classes

ภาษาจาวา – Nested Classes

สมชาย ประสทธจตระกล

Page 2: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 2

Classes

• Top level classes• Nested classes

– Nested top-level– Member inner– Local inner– Anonymous inner

class A {

void goo() {

...}void foo() {

}}

static class B { ... }

class C { ... }

class C { ... }

new Runnable() {public void run() {...

}}.start();

Page 3: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 3

Nested top-level classes

• อยใน top-level หรอ nested top-level• ม static กากบ class• อางอง static members ของ outer class ไดเทานน• มสมาชกไดทงแบบ static และ non-static

class Outer {static int classVar;static void classMethod() {}int objectVar;void objectMethod() {}

static class NTL {static int cV = classVar;int objV = classVar;static void f() { classMethod(); }void g() { classMethod(); }

static class NTL2 { ... }}

}

Outer a = new Outer();Outer.NTL b = new Outer.NTL();Outer a = new Outer();Outer.NTL b = new Outer.NTL();

Page 4: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 4

Member inner classes

• อยใน top-level, nested top-level, member inner• ไมม static กากบ class• อางองทก ๆ members ของ outer class ได• มสมาชกไดเฉพาะแบบ non-static

class Outer {static int classVar;int objectVar;static void classMethod() {}void objectMethod() {}

class Inner {int objV1 = classVar;int objV2 = objectVar;void f() { classMethod(); }void g() { objectMethod(); }

}Inner f() { return new Inner(); }

}

Outer a = new Outer();Outer.Inner b;b = a.new Inner();b = new Outer().new Inner();

Outer a = new Outer();Outer.Inner b;b = a.new Inner();b = new Outer().new Inner();

ตองม outer object ถงจะม member inner object ไดตองม outer object ถงจะม member inner object ได

Page 5: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 5

Local Inner

class Outer {static int c;static void f(){}int v;void g(){}void init(boolean enable, final int a) {

String s = “abc”;final int aLocalVar = 2;

new LocalInner().start();}

}

class LocalInner extends Thread {public void run() {

...}

}

Local inner class คอ member inner class ทเขยนนยามใน method (อางอง local var. ทเปน final ได)Local inner class คอ member inner class ทเขยนนยามใน method (อางอง local var. ทเปน final ได)

Page 6: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 6

Anonymous Inner : interface

class Outer {void init() {

...Runnable r = new Runnable() {

public void run() {...

}};

r.start();...

}...

}Runnable เปน interface บงคบ void run() {...}new Runnable( ) {...} หมายถงใหสรางออปเจกตของ anonymous class ท implements Runnable โดยมรายละเอยดของคลาสปรากฏใน {...}

Runnable เปน interface บงคบ void run() {...}new Runnable( ) {...} หมายถงใหสรางออปเจกตของ anonymous class ท implements Runnable โดยมรายละเอยดของคลาสปรากฏใน {...}

new ????();new ????();

class ???? implements Runnable {public void run() {...

}}

class ???? implements Runnable {public void run() {...

}}

Page 7: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 7

Anonymous Inner : class or abstract class

class Outer {void init() {

...Thread th = new Thread() {

public void run() {...

}};

th.start();...

}...

}Thread เปน classnew Thread( ) {...} หมายถงใหสรางออปเจกตของ anonymous class ท extends Thread โดยมรายละเอยดของคลาสปรากฏใน {...}

Thread เปน classnew Thread( ) {...} หมายถงใหสรางออปเจกตของ anonymous class ท extends Thread โดยมรายละเอยดของคลาสปรากฏใน {...}

new ????();new ????();

class ???? extends Thread {public void run() {...

}}

class ???? extends Thread {public void run() {...

}}

Page 8: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 8

Anonymous local inner classes

• คอ local inner classess อยางหนง• เขยน บรรยายคลาส + สรางออปเจกต พรอมกน• เขยนบรรยาย

– คลาสใหมท implements interface ทรจกพรอมเขยนทก ๆ เมทอดท interface นนบงคบ

– คลาสใหมท extends ของคลาสอนเพอ override บางเมทอดของคลาสพอ

• ใชออปเจกตของ anonymous คลาส– ในรปของ interface ท implements หรอ– ในรปของคลาสพอท extends

• anonymous = ไมมชอ เขยน constructor ไมได• anonymous class ควรมขนาดเลก ๆ

Page 9: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 9

Access Controls

• Top level class• Nested class

– Nested top-level– Member inner– Local inner– Anonymous inner

public, package-private

public, protected, package-private, private

หามเขยน

Page 10: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 10

ใช nested top-level class เมอไร ?

class A {...B b = new B();...

}

class B {...

}

class A {...B b = new B();...

}

private staticclass B {...

}

คลาส B ถกใชเฉพาะในคลาส A เทานน กให B เปน nested top-level ซง private เฉพาะในคลาส Aคลาส B ถกใชเฉพาะในคลาส A เทานน กให B เปน nested top-level ซง private เฉพาะในคลาส A

คลาสทมความสมพนธกนควรเขยนอยใกลกนคลาสทมความสมพนธกนควรเขยนอยใกลกน

Page 11: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 11

ใช member inner class เมอไร ?class Bag {Object [] data;Itr iterator() {return new Itr(this);}...}

class Itr {private Bag bag;private int idx;Itr(Bag b) {this.bag = b;

}Object next() {

return bag.data[idx++];}...

}

class Bag {private Object [] data;Itr iterator() {return new Itr();}

...}

class Itr {private int idx;Object next() {

return bag.data[idx++];}...

}

ลดความซบซอน : member inner ใช members ของ outer ไดเลยลดความซบซอน : member inner ใช members ของ outer ไดเลย

Page 12: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 12

ใช local inner class เมอไร ?

• เขยนเอง ใชเอง ภายในเมทอด ขางนอกไมรจก• มกใชออปเจกตของ local คลาสในรปของคลาสอนstatic Point getRectilinearPoint(Point p) {class RPoint extends Point implements Comparable {RPoint(int x, int y) {super(x, y);

}public int compareTo(Object obj) {Point that = (Point) obj;int dThis = Math.abs(this.x) + Math.abs(this.y);int dThat = Math.abs(that.x) + Math.abs(that.x);return dThis - dThat;

}}return new RPoint(p.x, p.y);

}

Page 13: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 13

ใช anonymous class เมอไร ?Point getRectilinearPoint(Point p) {

class RPoint extends Point implements Comparable {RPoint(int x, int y) { super(x, y); }public int compareTo(Object obj) {

Point that = (Point) obj;int dThis = Math.abs(this.x) + Math.abs(this.y);int dThat = Math.abs(that.x) + Math.abs(that.x);return dThis - dThat;

}}return new RPoint(p.x, p.y);

} Point getRectilinearPoint(final Point p) {

return new Point() // class ??? extends Point{

{ x = p.x; y = p.y; } // initializer blockpublic int compareTo(Object obj) {

Point that = (Point) obj;int dThis = Math.abs(this.x) + Math.abs(this.y);int dThat = Math.abs(that.x) + Math.abs(that.x);return dThis - dThat;

}};

} local inner ทใชเพยงตาแหนงเดยวเทานนในเมทอด → anonymouslocal inner ทใชเพยงตาแหนงเดยวเทานนในเมทอด → anonymous

Page 14: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 14

Lab 6 : BallWorld

public class BallWorld extends Canvas {Ball[] balls;public void begin() {

for (int i = 0; i < 10; i++) {balls[i] = new Ball(this);

}Graphics g = getGraphics();while (true) {for (int i = 0; i < balls.length; i++) {

balls[i].move(); balls[i].draw(g);}...repaint();

} }...

Page 15: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 15

Lab 6 : Balls

class Ball {int x, y, r, dx, dy;BallWorld world;public Ball(BallWorld ballWorld) {

world = ballWorld;...

}public void move() {

int ww = world.getWidth();x = x + dxint d = 2 * r;if (x + d >= ww) { x = ww - d; dx = -dx; }if (x <= 0) { x = 0; dx = -dx; }...

}...

}

Page 16: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 16

Lab 6.1 : Nested Top-Level Class

• ภายใต package com.somchai.lab6.nested มคลาส Ball และ BallWorld ทเปน top-level ทงค

• จงทาคลาส Ball ใหเปน private nested top-level เพอใสไวภายใน BallWorld

Page 17: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 17

Lab 6.2 : Member Inner Class

• ภายใต package com.somchai.lab6.member มคลาส Ball และ BallWorld ทเปน top-level ทงค

• จงทาคลาส Ball ใหเปน private member inner เพอใสไวภายใน BallWorld

Page 18: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 18

Lab 6.3 : Local Inner Class

• ภายใต package com.somchai.lab6.local มคลาส Ball และ BallWorld ทเปน top-level ทงค

• จงทาคลาส Ball ใหเปน private local inner class เพอใสไวภายในเมทอด begin

Page 19: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 19

Lab 6.4 : Anonymous Local Inner Class

• ภายใต package com.somchai.lab6.anonymous มคลาส Ball และ BallWorld ทเปน top-level ทงค

• ลองพยายามทาคลาส Ball ใหเปน anonymous inner เพอใสไวภายในเมทอด begin

Page 20: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 20

Lab 6.5 : Anonymous Local Inner Class

• ภายใต package com.somchai.lab6.comparator มคลาส Rational ท implements Comparable และเขยน compareTo ไวเรยบรอยแลว

• จงเขยน static method ชอ reverseOrder() ในคลาส Rational ทคน Comparator object ซงเมอใชกบ Arrays.sort(...) จะเรยงลาดบจากมากไปนอย

public class Rational {...public static Comparator reverseOrder() {

...}

}

Page 21: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 21

Lab 6.5 : Anonymous Local Inner Class

• Comparator เปน interface ทบงคบเมทอด– public int compare(Object obj1, Object obj2)– compare ใชในการจดอนดบของออปเจกตจากซายไปขวา– compare คนคาในทานองเดยวกบ compareTo

• คนคา 0 แสดงวา obj1 มคาเทากบ obj2• คนคา < 0 แสดงวา obj1 ตองอยทางซายของ obj2• คนคา > 0 แสดงวา obj1 ตองอยทางขวาของ obj2

• นา comparator ไปใชกบ Arrays.sort ได– Arrays.sort( Object[] d ) แบบนไมระบ comparator จะใชเมทอด compareTo ของตวออปเจกตเอง

– Arrays.sort( Object[] d, Comparator c ) แบบนระบ comparator จะใช compare ของ comparator และไมสนใจ compareTo ของออปเจกต

Page 22: ภาษาจาวา – Nested Classes

© S.Prasitjutrakul 2004 16/01/48 22

Lab 6.5 : Anonymous Local Inner Classclass ReverseComparator implements Comparator {public int compare(Object obj1, Object obj2) {Comparable c = (Comparable) obj1;return -c.compareTo(obj2); // reverse order

}}

class SortRationalTest {public static void main(String[] a) {Rational[] r = {new Rational(2, 1), new Rational(2, 2),new Rational(2, 3), new Rational(30, 4),new Rational(30, 3), new Rational(30, 2)

};Arrays.sort(r, new ReverseComparator());System.out.println(Arrays.asList(r));

}}

ตวอยาง reverse comparator แบบเขยนเปน top-level คลาสพรอมตวอยางการทดสอบ

ตวอยาง reverse comparator แบบเขยนเปน top-level คลาสพรอมตวอยางการทดสอบ