ภาษาจาวา – 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();
© 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();
© 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 ได
© 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 ได)
© 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() {...
}}
© 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() {...
}}
© 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 ควรมขนาดเลก ๆ
© 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
หามเขยน
© 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
คลาสทมความสมพนธกนควรเขยนอยใกลกนคลาสทมความสมพนธกนควรเขยนอยใกลกน
© 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 ไดเลย
© 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);
}
© 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
© 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();
} }...
© 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; }...
}...
}
© 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
© 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
© 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
© 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
© 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() {
...}
}
© 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 ของออปเจกต
© 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 คลาสพรอมตวอยางการทดสอบ
Top Related