Ch

Trong l p trình h và tính a hình. ng it

ng 2: H

ng

it

ng.

ng có 3 tính ch t quan tr ng là tính óng gói, tính k th a

1. Encapsulation (Tính óng gói). Hãy t ng t ng n u b n vi t code cho m t l p, và nhi u l p trình viên khác trong công ty s d ng l i l p c a b n. H n b n s không thích cách c x c a l p khi m t vài bi n th c th c a nó có th c t l i giá tr mà b n không l ng tr c c. Khi ó code c a h s làm code c a b n b l i. Ví d : B n t o m t l p v i bi n th c th là public và cho phép l p trình viên khác thi t t l i bi n tr c ti p nh o n code sau: public class BadOO { public int size; public int weight; ... } public class ExploitBadOO { public static void main (String [] args) { BadOO b = new BadOO(); b.size = -5; // i u này là cho phép nh ng mà không t t!! } } Và bây gi b n g p r c r i. Làm th nào b n có th thay i l p theo cách mà có th cho phép x lý v n khi ai ó thay i bi n size n m t giá tr gây ra l i? Cách t t nh t là b n nên s d ng tính óng gói c a l p trình h ng i t này b n v n có th b o v cho o n mã trong l p v a có th cung c p ph l p trình viên khác truy c p và l y giá tr bi n size. V y b n làm i u ó nh th nào? a. B o v bi n th c th (Th ng là d ng t khóa private). b. T o ph ng th c truy c p public, và s d ng code g i ph truy c p tr c ti p vào bi n. ng th c thay vì ng. B ng cách ng th c cho c

c. Ví d :

i v i các ph ng th c, s d ng quy c t tên JavaBeans nh set<someProperty> và get<someProperty>.

public class Box { // B o v bi n th c th , ch có thành ph n trong Box m i có th truy c p nó. private int size; // Cung c p public getters and setters public int getSize() { return size; } public void setSize(int newSize) { size = newSize; } } Hình 1: Minh h a truy c p g i ph vào bi n. ng th c trong l p óng gói thay vì truy c p tr c ti p

out. Has-A (K th a). if (!t1. } // lots of complex test code here } L p Foo có th hi n tính óng gói không? Vì sao? 2. public void setLeft(int leftNum) { left = leftNum. Inheritance. right = leftNum/3. Th a k b t c m i n i trong Java. public int right = 3.equals(t2)) System.println("t1's an Object"). Is-A. } } K t qu c a o n mã trên là: .println("they're not equal"). i u ó nói r ng h u nh th a k s d ng r t nhi u. if (t1 instanceof Object) System.Bài luy n t p: class Foo { public int left = 9.out. Test t2 = new Test(). rõ thêm v ch ng này ta s d ng toán t instanceof xem xét ví d sau: class Test { public static void main(String [] args) { Test t1 = new Test(). th m chí không th vi t ch ng trình java nh nh t mà không dùng k th a.

i u ó t ng ng v i m t ph ng th c c th a k hàng t l n. Và k t qu ch ra r ng t1 chính là th c th c a l p Object. Còn tr ng h p th 2 nó h i t1 có ph i là m t th c th c a l p Object không. . } // more code } class PlayerPiece extends GameShape { public void movePiece() { System. thúc y s d ng l i mã. Ta có th t o các m i quan h k th a b ng cách m r ng l p.out.println("moving game piece").they're not equal t1's an Object tr ng h p so sánh th nh t ta th y bi n t1 là m t ki u c a Test và do ó nó không th b ng m t ph ng th c trong l p Test. i u ó nói lên r ng. Khi t o ra m t l p b n ã t ng k th a các ph ng th c c a l p Object. m i m t l p mà b n ã t ng s d ng ho c ã t ng vi t s k th a t l p Object.println("displaying shape").out. s d ng tính a hình. i u ó c ng quan tr ng hi u r ng 2 lý do ph bi n s d ng k th a là: a. } // more code } public class TestShapes { public static void main (String[] args) { PlayerPiece shape = new PlayerPiece(). b. Ví d : class GameShape { public void displayShape() { System.

displayShape(). } } K t qu : displaying shape moving game piece Vì PlayerPiece k th a l p GameShape nên khi g i shape. có ng c . có ng c « Gi có l p Car (xe h i) nó s k th a t t c nh ng c i m c a xe c gi i nh có bánh xe. } . ây là m t ví d n gi n v k th a. M i quan h IS-A và HAS-A IS-A: Quan h IS-A có th hi u n gi n là: A ³is a´ B n u i t ng A có nh ng c b n c a i t ng B và có th có nh ng c tính riêng c a nó. public class Vehicle { // Cool Vehicle code goes here } public class Car extends Vehicle { // Important Car-specific stuff goes here // Don't forget Car inherits accessible Vehicle members which // can include both methods and variables.shape.displayShape() thì k t qu xu t displaying shape tr c. c tính Ví d ta có m t l p c s là Vehicle ( xe c gi i) nó có c i m: là ph ng ti n i l i. là ph ng ti n i l i ngoài ra nó có c i m riêng c a nó nh là mui tr n ho c mui kín. Nh v y ta có th nói l p xe h i k th a t l p c b n là xe c gi i. có bánh xe.movePiece(). shape.

A ³has a´ B n u trong i t ng A có m t thành ph n là i t ng B.out. Nói cách khác. c a ra vào. // Delegate tie behavior to the // Halter object } } public class Halter { public void tie(LeadRope aRope) { // Do the actual tie work here } } Bài luy n t p class GameShape { public void displayShape() { System.HAS-A Quan h HAS-A là quan h d a trên s d ng h n là k th a.tie(rope). public void tie(LeadRope rope) { myHalter. t ng. c a xe. ng c . i t ng ngôi nhà thì có thành ph n là i t ng mái nhà.println("displaying shape"). Hay nh i t ng con ng a thì có thành ph n là i t ng dây c ng« public class Horse extends Animal { private Halter myHalter = new Halter(). } // more code } class PlayerPiece extends GameShape { public void movePiece() { . Ví d : i t ng xe h i có thành ph n là i t ng bánh xe.

displayShape(). doShapes(player). } public static void doShapes(GameShape shape) { shape. } // more code } //G i ph ng th c và xu t k t qu . doShapes(tile). } } K t qu xu t ra là gì? Vì sao? 3. ng Java nào có nhi u h n 1 quan h IS-A u có th .out. } // more code } class TilePiece extends GameShape { public void getAdjacent() { System. public class TestShapes { public static void main (String[] args) { PlayerPiece player = new PlayerPiece().System. b t k m t i t c coi là a hình.println("moving game piece"). TilePiece tile = new TilePiece().out. Polymorphism ( a hình).println("getting adjacent tiles"). Hãy nh r ng.

} public void animate() { System.Cách duy nh t truy c p m t i t ng là thông qua m t bi n tham chi u. 2. và ây là vài i u c n nh v tham chi u: 1. M i tham chi u là m t bi n.println("animating. M t bi n tham có th tham kh o b t k i t ng nào cùng lo i nh là m t khai báo tham chi u. do ó nó có th gán l i cho i t ng khác ( tr khi tham chi u ó c khai báo là final). Có ngh a là ch có m t l p cha cho m i l p. } L p PlayerPiece m r ng t l p GameShape và th c thi Animatable interface..println("moving game piece"). Bi n tham chi u có th là m t ki u duy nh t.. N u nó khai báo là m t interface thì nó có th tham chi u t i b t k m t i t ng nào c a b t k m t class nào c th c t interface ó. 3.out. M t bi n tham chi u có th khai báo nh là m t ki u class ho c là m t Interface. public interface Animatable { public void animate(). 4. Animatable { // NO! // more code } Gi s bây gi mu n l p PlayerPiece Animatable ta ph i làm th nào? c m r ng t 2 l p GameShape và Câu tr l i là b n hãy t o m t Animatable interface.out. và ch có các l p con c a GameShape th c thi interface. Ki u c a bi n tham chi u s quy t nh các ph ng th c c g i trong i t ng mà bi n ó tham chi u n. và c khai báo 1 l n."). class PlayerPiece extends GameShape implements Animatable { public void movePiece() { System. . 5. ki u có th không bao gi thay i ( m c dù i t ng mà nó tham chi u n có th thay i). Trong Java không cho phép a k th a. class PlayerPiece extends GameShape.

Ví d : public class Animal { public void eat() { System. GameShape shape = player.println("Horse eating hay). Overriding / Overloading. Overriding B t k lúc nào b n c ng có th vi t l i method c k th t method c a l p cha. . } } class Horse extends Animal { public void eat() { System.out. Animatable mover = player. 4. // Mô t c th là ng a n c khô« } } B n không th thay i gi i h n truy c p m t ph ng th c khi b n overridde ph ng th c ó. } } Ta có th th y c i t ng PlayerPiece v a th hi n là chính nó.} // more code } public class TestShape { public static void main (String [] args) { PlayerPiece player = new PlayerPiece ().out. Tính a hình còn th hi n qua vi c: cùng m t ph ng th c nh ng có n i dung th c hi n khác nhau trên các i t ng khác nhau.// Mô t cách th c n chung chung c a l p ng v t. GameShape và Animatable. v a th hi n c là Object. Object o = player. L i ích khi overridding là b n có th xác nh c hành vi c th c a l p con. V n này s nghiên c u ph n ti p theo.println("Generic Animal Eating Generically").

M t vài quy t c s d ng Overloaded: 1.println("Generic Animal Eating Generically").println("Generic Animal Eating Generically"). } } N u m t ph ng th c mà không c k th a thì b n không th overridde nó. // Runs the Animal version of eat() b. Ph i thay i danh sách các i s .out. 3.println("Horse eating hay.eat(). 4. . 2.Ví d : public class TestAnimals { public static void main (String [] args) { Animal a = new Animal(). và giá tr tr v ). but a Horse object a. //Animal ref. } } class Animal { private void eat() { System. Animal b = new Horse().out. } } class Horse extends Animal { } Overloading Ph ng th c Overloaded cho phép b n s d ng l i tên c a ph ng th c trong m t l p nh ng v i tham s c thay i ( có th là ki u. // Không cho phép vì l p Horse không k th a ph ng th c eat. Có th khai báo m i ho c m r ng ki m tra ngo i l . oats. Ví d : public class TestAnimals { public static void main (String [] args) { Horse h = new Horse(). Có th thay i ki u tr v .out. h. // Runs the Horse version of eat() } } class Animal { public void eat() { System. Có th thay i ph ng th c truy c p.eat(). " + "and horse treats"). } } class Horse extends Animal { private void eat() { // i u này là không cho phép System.eat().

doStuff(animalRefToHorse). } public void doStuff(Horse h) { System. Ví d : class Animal { } class Horse extends Animal { } class UseAnimals { public void doStuff(Animal a) { System.doStuff(horseObj). long s) throws IOException { } } Cách g i m t ph ng th c Overloaded: Gi s b n có m t l p mà có 3 ph ng th c gi ng nhau ch khác nhau i s là doStuff(int i).println("In the Animal version"). Animal animalObj = new Animal(). String s) { } public void moreThings(int x) { } } class Bar extends Foo { public void doStuff(int y. Nói cách khác n u m t l p nh ngh a m t ph ng th c doStuff(int i) thì nó có th nh ngh a thêm m t ph ng th c doStuff(String s) ó c g i là Overloaded. thì k t qu s là: In the Animal version Bài luy n t p Polymorphism và Overriding / Overloading . ua. } } K t qu tr v s là: In the Animal version In the Horse version Còn n u b n tham chi u Animal n i t ng Horse: Animal animalRefToHorse = new Horse(). doStuff(String s).println("In the Horse version"). ua. doStuff(float f) n u nh b n g i ph ng th c doStuff v i i s là m t String thì doStuff(String s) s c g i. } public static void main (String [] args) { UseAnimals ua = new UseAnimals().5. Có th g i luôn trong l p ho c g i l p con. Ví d : public class Foo { public void doStuff(int y.out.out. ua. Horse horseObj = new Horse().doStuff(animalObj).

out. } class UseAnimals { public static void main (String [] args) { Horse horseObj = new Horse(). .println("Horse eating hay "). và chúng ta s xem xét v n . } } public class Horse extends Animal { public void eat() { System.println("Horse eating " + s). Animal animal = new Dog(). eat(s). Chuy n i các ki u d li u tham chi u là m t c tr ng c a tính a hình. animalObj.out. String s = pizza.out. } public void eat(String s) { System. eat().public class Animal { public void eat() { System.println("Generic Animal Eating Generically"). horseObj. Nh ng i u gì s x y ra n u nh b n mu n s dung animal g i m t ph ng th c trong l p Dog? Gi s o n code sau là úng. Animal animalObj = horseObj. Reference Variable Casting. } } K t qu xu t ra là gì? T i sao? 5.

ta còn có ki u upcasting nh sau: class Animal { } class Dog extends Animal { } . d.lang. new Dog().playDead(). N u nh trong tr ng h p này ta s b l i khi ép ki u: class Animal { } class Dog extends Animal { } class DogTest { public static void main(String [] args) { Animal animal = new Animal().out. Dog d = (Dog) animal. Cách t t nh t có th th c hi n c playDead là a Animal v thành Dog if(animal instanceof Dog) { Dog d = (Dog) animal.out.println("generic noise"). // try to do a Dog behavior ? } } } } V n s xu t hi n khi animal c g ng th c hi n m t hành vi c a Dog. for(Animal animal : a) { animal.makeNoise(). var. // compiles but fails later } } Không th ép t ki u cha v ki u con c vì khi c g ng th c hi n chúng ta s nh n c vài exception nh sau: java. Vì là Dog c k th a t Animal nên có ph ng th c mà Dog có nh ng Animal không có nên khi c g ng th c hi n nh v y s x y ra l i.class Animal { void makeNoise() {System.ClassCastException ây g i là ép ki u downcasting. } void playDead() { System. // casting the ref.println("bark"). } } class Dog extends Animal { void makeNoise() {System.println("roll over"). if(animal instanceof Dog) { animal. } } class CastTest2 { public static void main(String [] args) { Animal [] a = {new Animal().out. } Tuy nhiên ó là do animal là m t th c th c a Dog nên ta m i ép ki u c.playDead(). Tuy nhiên khác v i downcasting. new Animal() }.

7. cái nào không. M t interface có th t m r ng b n than t m t interface khác. // ép ki u ng m nh Animal a2 = (Animal) d. Khi b n th c thi m t interface có ngh a là b n ph i th c hi n t t c các method có trong interface ó trên class c a b n. Serializable. Return Type Declarations Return Types on Overloaded Methods .. 6. // ép ki u t ng mình } } Trên ây ta th y có 2 lo i ép ki u là ép ki u ng m nh và ép ki u t ng minh. nh ng không bao gi th c thi b t k i u gì. public interface Bounceable extends Moveable { } Bài luy n t p class Foo { } class Bar implements Foo { } interface Baz { } interface Fi { } interface Fee implements Baz { } interface Zee implements Foo { } interface Zoo extends Foo { } interface Boo extends Fi { } class Toon extends Foo. Runnable{ . M t class có th th c thi nhi u interface. Implementing an Interface.class DogTest { public static void main(String [] args) { Dog d = new Dog(). Cách ép ki u t con v cha không s x y ra l i vì l p cha có th ch a h t thu c tính c a l p con. Animal a1 = d. Button { } class Zoom implements Fi. Legal Return Types. c hai lo i trên không bao gi s exception. public class Ball implements Bounceable. Baz { } interface Vroom extends Fi. } 2. Baz { } / class Yow extends Foo implements Fi { } Hãy ch ra cái nào b l i.. Ví d nh ta có m t interface là Bounceable có các ph ng th c là bounce() và setBounceFactor() thì class th c thi Bounceable s ph i th c thi t t c các ph ng th c c a Bounceable có: public class Ball implements Bounceable { // Keyword 'implements' public void bounce() { } public void setBounceFactor(int bf) { } } Có 2 nguyên t c c n bi t khi s d ng interface là: 1.

Tr v m t m ng. Ho c nh trong Java 5. . overloaded m t ph ng th c hãy nh là b n c n ph i thay i c danh sách các i s c a ph ng th c. a. public String[] go() { return new String[] {"Fred". } } Overriding and Return Types. Ví d : class Alpha { Alpha doStuff(char c) { return new Alpha().4 thì s g p l i. Ví d : public class Foo{ void go() { } } public class Bar extends Foo { String go(int x) { return null. các l p con ph i xác nh m t ph ng th c phù h p v i phiên b n c a l p k th a. and Covariant Returns M t l p con mu n thay i m t ph ng th c th c thi khi k th a. } } class Beta extends Alpha { Beta doStuff(char c) { // legal override in Java 1. B n có th tr v null v i các ki u tr v là m t i t ng tham chi u. } b.5 return new Beta(). "Barney". b n c phép thay i ki u tr v trong ph ng th c overriding mi n là ki u tr v m i là ki u con c a ki u c mô t trong ph ng th c overriding (l p cha). Returning a Value Có 6 i u b n nên nh khi làm vi c v i giá tr tr v . } } Tuy nhiên ch là v i Java 5 tr lên thì s không sao nh ng n u b n c g ng biên d ch v i Java 1. public Button doStuff() { return null. T t nhiên là b n không th ch thay i m i ki u tr v c. "Wilma"}.i v i Overloaded thì b n có th khai báo b t k giá tr tr v nào b n thích .

Trong m t ph ng th c v i ki u tr v là m t i t ng tham chi u. public int foo () { float f = 32.2. return (int) f. // Assume Horse extends Animal } public Object getObject() { int[] nums = {1. // Return an int array. return nums. V i ki u tr v là void thì b n không c n return b t k giá tr gì. public Animal getAnimal() { return new Horse(). T ng t nh i u th 3.3}. Trong m t ph ng th c có ki u tr v là m t ki u nguyên th y thì b n có th return b t k m t giá tr hay bi n mà m c nh có th chuy n i sang ki u tr v b n khai báo. } e. Constructors and Instantiation. // char is compatible with int } d. // Not legal!! } f. b n có th return v m t giá tr hay bi n c ép ki u v ki u b n ã khai báo. // which is still an object } 8.} c. return c. B n có th tr v b t k m t i t ng c ng m nh ép ki u v ki u c khai báo.5f. public void bar() { return "this is it". public int foo() { char c = 'c'. .

th c thi các công vi c ó trong Java a ra khái ni m ph ng th c kh i t o (constructor). . "Fido". Có th có ho c không có tham s . 5. 8. 2. Luôn có tên trùng v i tên l p. Interface thì không có constructor. g i m t constructor t m t constructor khác ta s d ng this( tham s phù h p). 9. Foo(String name. "Gigi"}[x].random() * 5). Ng c l i thì b t bu c ph i dùng constructor ã c khai báo. 6. M t l p tr u t ng thì có constructor và constructor c g i khi m t l p c th c kh i t o.name = name. N u class không khai báo constructor nào thì m c nh s là constructor không có tham s . this. khi i t ng c t o thì các bi n thành ph n các hàm lien quan c ng s ph i c thi t l p giá tr ban u và c g i n. int size) { this. } static String makeRandomName() { int x = (int) (Math. String name. Bài luy n t p public class Animal { String name. "Rover". 3. Constructor thì không th k th a.name = name. ho c là super() g i constructor c a l p cha. String name = new String[] {"Fluffy". M t l p có th có 1 ho c nhi u constructor (liên quan n overload). "Spike". Cách duy nh t g i constructor là t m t constructor khác. Animal(String name) { this.Khi t o ra 1 l p coi nh ta ã t o ra 1 ki u d li u m i. Khi ó ta có th s d ng l p nh ngh a và t o ra các i t ng. } } M t vài c i m c a constructor: 1. 10. k c t khóa void. Nhi m v c a constructor là thi t l p các giá tr ban u cho các i t ng và g i các hàm liên quan n quá trình kh i t o i t ng« class Foo { int size. 4. 7. } Animal() { this(makeRandomName()). Không có ki u tr v .size = size.

Trong cùng m t l p n u bi n là static thì method g i bi n c ng ph i static: class Frog { static int frogCount = 0. new Frog().name).frogCount). Method. // Modify the value in the constructor } } class TestFrog { public static void main (String [] args) { new Frog(). } public static void main (String [] args) { Animal a = new Animal().out. // Declare and initialize // static variable public Frog() { frogCount += 1. // Modify the value in the constructor } public static void main (String [] args) { new Frog(). Bi n : là bi n dùng chung cho m i i t ng c a l p. // Declare and initialize // static variable public Frog() { frogCount += 1. System. nó c truy c p qua i t ng c a l p ho c qua tên l p khi g i t l p khác.return name. Animal b = new Animal("Zeus"). System. new Frog(). System.println(b.out. Ví d : class Frog { static int frogCount = 0.print("frogCount:"+Frog.name). //Access static variable } } 2. } } K t qu c a o n code trên là gì? 9. Statics.println(a. Static có th c dùng nh ngh a: 1.out. c khai báo .

// Access instance // method using f } } Tóm t t: it ng c a l p: . System. System.new Frog().println("Frog count is now " + frogCount).out. } public Frog(int s) { frogSize = s. } } N u bi n là nonstatic thì có th truy c p thông qua class Frog { int frogSize = 0.getFrogSize()).println(f. new Frog(). } public static void main (String [] args) { Frog f = new Frog(25). public int getFrogSize() { return frogSize.out.

print("a "). } } class Dog extends Animal { static void doStuff() { // it's a redefinition. x++) a[x].out. // not an override System.length. for(int x = 0. new Animal()}.print("d "). hãy nh r ng m t ph ng th c static thì không th overridden. // invoke the static method } } K t qu xu t ra s là: a a a . Nó không có ngh a là ph ng th c ó không c khai báo l i trong l p con.doStuff(). new Dog(). x < a. Hãy xem ví d : class Animal { static void doStuff() { System.Cu i cùng.out. } public static void main(String [] args) { Animal [] a = {new Animal(). nh ng khai báo l i và overridden là không gi ng nhau.

Sign up to vote on this title
UsefulNot useful