You are on page 1of 12

Title: Java- Nhng cu hi t khi c tr

hoangdiep - September 14, 2005 09:25 AM (GMT)


Java- Nhng cu hi t khi c tr li !!!

Trc ht ti xin gii thch v thut ng Java IAQ (Java Infrequently Answered
Question). Th no l mt cu hi t khi c tr li? Mt cu hi m t khi c tr
li (IAQ Infrequently Answered Question) th ch c mt trong hai l do: ch c mt
s t ngi bit cu tr li, hoc l cu hi v mt iu m h hoc t nh no
(nhng chnh iu ny li c tnh quyt nh). Ti ngh ti pht hin ra thut ng
ny, nhng xem ra n cng c trnh by trn website About.com. C rt nhiu
vn xung quanh Java FAQ (Frequently Answered Question nhng cu hi
thng c tr li) nhng y ta ch cp n Java IAQ (Infrequently Answered
Question). Ngoi ra ta cn c mt ngha khc ca FAQ : Frequently Asked Questions
nhng cu hi thng gp.
Sau y l mt s cu tr li m c l bn t khi gp phi, hy c th nhng cu hi
v ngm ngh xem cu tr li tng ng c lm bn hi lng khng.
1. on m trong mnh finally s lun c thc hin?
Thng th iu ny l chnh xc nhng khng phi lun lun nh vy. Sau y l
mt v d trong on m finally s khng c thc thi bt chp gi tr ca bin
choice:
CODE
try {
if (choice) {
while (true);
} else {
System.exit(1);
}
}
finally {
code.to.cleanup();
}

2. Trong phm vi phng thc m ca mt lp C, c phi gi tr tr v ca hm


this.getClass( ) lc no cng l C khng?
Cu tr li l khng. Gi s c mt vi i tng x l th hin (instance) ca mt vi
lp con C1 no ca C khng c phng thc C1.m( ) hoc l c mt vi phng
thc trn x gi l super.m( ). i vi nhng i tng x nh vy th trong trng hp
no, gi tr tr v ca this.getClass( ) cng l C1 ch khng phi l C trong phm vi
ca C.m( ). Cn nu C c khai bo l final th bn ng.
3. Ti nh ngha mt phng thc equals, nhng Hashtable li b qua n. Ti sao?
Tht ng ngc nhin l nhng phng thc equals li rt t khi ng. Sau y l
nhng ch bn cn phi kim tra lm r nguyn nhn gy ra vn trn:
a. Bn nh ngha mt phng thc equals sai.
Chng hn bn vit nh sau:
CODE
public class C {
public boolean equals(C that) {
return id(this) == id(that);
}
}

Nhng hm table.get(c ) c th hot ng bn cn to phng thc equals nhn


Object nh mt i s ch khng phi l C.
CODE
public class C {
public boolean equals(Object that) {
return (that instanceof C) &&
id(this) == id(that);
}
}

Ti sao ? Ta c on m cho Hashtable.get nh sau:


CODE
public class Hashtable {
public Object get(Object key) {

Object entry;
...
if (entry.equals(key)) ...
}
}

By gi phng thc c gi qua li gi hm entry.equals(key) ph thuc vo kiu


thi gian thc thi (run time type) ca i tng c tham kho bi phn t entry
v kiu khai bo, kiu thi gian dch ca bin key. Chnh v th khi bn gi hm
table.get(new C()), chng trnh s tm trong lp C phng thc equals vi i s
thuc kiu Object. S khng thch hp nu bn nh ngha phng thc equals vi i
s thuc kiu C. Chng trnh s khng nhn phng thc v s tm mt phng
thc khc nhn Object lm i s. D nhin khi chng trnh s tm thy phng
thc Object.equals (Object). Nu bn mun qu ti (overload) mt phng thc th
phi s dng kiu i s mt cch chnh xc. Trong mt vi trng hp, c th bn
mun dng c hai phng thc v iu ny dn ti vic bn s khng phi mt chi ph
chuyn i kiu(casting) khi bn bit chc c mt i tng ca mt lp ng.
CODE
public class C {
public boolean equals(Object that) {
return (this == that)
|| ((that instanceof C)
&& this.equals(that));
}
public boolean equals(C that) {
return id(this) == id(that); //
}
}

b. Bn khng hin thc ng phng thc equals, mt phng thc equals phi i
xng, bc cu, v t phn chiu. i xng ngha l a.equals(B) phi c cng gi tr
vi b.equals(a). Bc cu ngha l nu gi tr ca a.equals(B) ng v gi tr ca
b.equals ng th a.equals cng phi ng. T phn chiu ngha l a.equals(a)
chc chn phi ng, l l do v sao c (this == that) trong on chng trnh
trn.
c. Bn qun phng thc hashCode.
Ngay khi bn nh ngha mt phng thc equals, bn nn nh ngha thm mt
phng thc hashCode. Bn phi chc chn rng hai i tng bng nhau phi c

cng mt hashCode. V nu bn mun s thc thi tt hn th bn cng phi m bo


nhng i tng khng bng nhau phi c hashCode khc nhau. C mt s lp li lu
tr hashCode ti v tr ring ca mt i tng n ch c tnh ton mt ln duy
nht m thi. Trong trng hp ny bn s tit kim thi gian nu trong phng thc
equals bn thm vo cu lnh: if (this.hashSlot != that.hashSlot) return false.
d. Bn khng qun l s tha k mt cch hp l. Trc ht hy xem xt vn
nu nh hai i tng ca hai lp khc nhau li c th ging nhau. Trc khi bn ni
Khng! Khng bao gi!, hy xem lp Rectangle vi hai trng d liu l width v
height, v lp Box vi hai trng d liu trn cng thm mt trng depth. Mt cu
hi c t ra l mt i tng ca lp Box vi depth == 0 c bng vi mt i
tng ca lp Rectangle nu hai trng d liu tng ng cn li ca chng l bng
nhau khng? C th bn mun tr li l ng. Nu bn ang final lm vic vi mt
lp khng phi l th c th lp ca bn c nhng lp con. C th l bn s mun c
mt lp m rng ca lp C c th dng phng thc
C. equals c t kha super nh sau:
CODE
public class C2 extends C {
int newField = 0;
public boolean equals(Object that) {
if (this == that) return true;
else if (!(that instanceof C2)) return false;
else return this.newField == ((C2)that).newField) && super.equals(that);
}
}

lm c nh trn bn phi ht sc cn thn i vi vic lm sao x l cc lp


bn trong nh ngha ca C.equals. Chng hn vic kim tra xem 'that' c phi l i
tng ca C hay khng thay v dng that.getClass == C.class. Hy xem li cu hi v
IAQ trc bit ti sao. Ch dng this.getClass( ) == that.getClass( ) nu bn
chc chn rng hai i tng phi cng mt lp th mi c xem l ging nhau.
e. Bn khng qun l cc tham chiu vng mt cch k cng. Hy xem trng hp
sau:
CODE
public class LinkedList {
Object contents;
LinkedList next = null;

public boolean equals(Object that) {


return (this == that)
|| ((that instanceof LinkedList)
&& this.equals((LinkedList)that));
}
public boolean equals(LinkedList that) {
return Util.equals(this.contents, that.contents) &&
Util.equals(this.next, that.next);
}
}

y, ti gi s c mt lp Util vi :
CODE
public static boolean equals(Object x, Object y) {
return (x == y) || (x != null && x.equals(y));
}

Ti mun phng thc ny thuc lp Object, nh vy ti s khng cn phi kim tra


trnh gi tr null. D th no th phng thc LinkedList.equals s khng bao gi
c tr v, n c yu cu so snh hai LinkedLists s dng tham chiu vng (mt
con tr t mt phn t ca danh sch lin kt tr v mt phn t khc ca danh sch
).
4. Ti c th chuyn tip mt phng thc n lp cha, nhng thnh thong n vn
khng hot ng. Ti sao?
y l on m ca cu hi trn :
CODE
/** mt phin bn ca Hashtable cho php bn
* table.put("dog", "canine"); v sau hm
* table.get("dogs") s tr v "canine". **/
public class HashtableWithPlurals extends Hashtable {
/** lm cho bng bm nh x c key
* v key + "s" vo mt tr bm**/
public Object put(Object key, Object value) {

super.put(key + "s", value);


return super.put(key, value);
}
}

Bn cn phi cn thn khi giao tip vi lp cha. c bit, bn cn phi hiu r nhng
phng thc ca lp cha hot ng nh th no. Trong trng hp ny, mc ch ca
hm Hashtable.put l n s ghi li nh x gia bin key v value trong bng bm.
Tuy nhin nu bng bm qu y, hm Hashtable.put s cp pht mt mng ln hn
cho bng sao chp tt c nhng i tng c qua, v sau s gi quy li hm
table.put(key,value). Lc ny, do Java phn gii cc phng thc vo thi gian thc
thi ca i tng ch, vic gi quy bn trong on m ca Hashtable s dn
HashtableWidthPlurals.put(key,value), v kt qu l thnh thong bn s nhn c
thm mt cho dogss thay v ch c dogs.
5. Ti sao i tng Properties ca ti khng chp nhn nhng gi tr mc nh khi ti
gi hm get()?
Bn khng nn gi hm get trn i tng Properties, thay vo bn nn dng
getProperty. Nhiu ngi cho rng ch c mt s khc bit duy nht l getProperty c
kiu tr v l String, trong khi get c kiu tr v l Object. Nhng thc ra n cn c
mt s khc bit ln hn l getProperty xem xt n nhng gi tr mc nh trong
khi get th c tha k t Hashtable, v n khng xem xt nhng gi tr mc nh.
Do , n s thc thi mt cch chnh xc nhng iu c a ra trong lp
Hashtable, nhng thng khng phi l nhng g bn mong i. Nhng phng thc
khc c tha k t Hashtable (nh l Empty v toString) cng hnh x tng t.
Chng hn nh on m sau:
CODE
Properties defaults = new Properties();
defaults.put("color", "black");
Properties props = new Properties(defaults);
System.out.println(props.get("color") + ", " + props.getProperty(color));
// kt qu in ra l "null, black"

iu ny c c cp trong ti liu hng dn khng? C l l c. Ti liu hng


dn ca Hashtable cp n nhng phn t trong mt bng, v hnh vi ca i
tng Properties l nht qun nu bn gi s rng gi tr mc nh khng phi l phn

t ca bng.
6. Ti sao trong Java khng c bin ton cc?
Bin ton cc trong Java khng c s dng ch yu v nhng l do sau:
Vic thm vo mt bin ton cc c th ph v tnh r rng ca on m (bn khng
cn hiu c mt pht biu hay biu thc nu nh khng xt n ng cnh ca ton
b chng trnh).
Bin ton cc lm gim tnh lin kt ca mt chng trnh: bn cn phi tm hiu li
xem mt s ni trong chng trnh hot ng nh th no. Vn ch yu ca lp
trnh hng i tng l chuyn t trng thi ton cc vo mt tp nhng trng thi
cc b d hiu hn.
Khi thm vo mt bin, bn gii hn phm vi s dng ca chng trnh trong mt
trng hp m thi. Nhng g bn ngh l ton cc th ngi khc c th cho l cc
b: c th h mun thc thi hai bn sao ca chng trnh cng mt lc.
7. Null c phi mt i tng khng?
Chc chn l khng. ca ti l cu lnh (null instanceof Object) s tr v false.
Ngoi ra bn nn bit thm mt s iu v null:
a. Bn khng th gi mt phng thc trn null: gi x.m() l sai khi x l null v m l
mt phng thc khng static (tnh).
b. Ch c mt gi tr null, ch khng phi mi lp u c mt gi tr null. Do c
th xem String null cng chnh l Hashtable null.
c. Ta c th truyn tr null nh l mt i s cho mt phng thc vi iu kin
phng thc cn ti n. Mt s phng thc chp nhn iu ny, mt s khc th
khng. V d nh System.out.println (null) th chp nhn cn string.compareTo(null)
th li khng. i vi nhng phng thc m bn vit, Java s bo cho bn bit ni
no null c chp nhn, tr khi l iu hin nhin.
d. Cc b JDK phin bn t 1.1 cho ti 1.1.5 coi null nh i s xc nh cu trc
ca mt lp ni v danh. V d new SomeClass (null) {} l nguyn nhn dn n
vic bin dch sai. Vic truyn mt biu thc c gi tr null hoc mt gi tr null bt
buc l hon ton hp l, chng hn new SomeClass((String) null) {}.

e. C t nht 3 ngha khc nhau thng c dng din t null:


Uninitialized cha khi to. Mt binhoc mt v tr vn cha c gn gi tr
thc ca n.
Non-existant/not applicable khng tn ti/khng dng c. V d: node cui
cng ca mt cy nh phn c th c m t nh mt node bnh thng vi con tr
ch n node con mang gi tr rng.
Empty - rng. V d: bn c th dng null m t mt cy rng. Ch rng iu
ny
khc vi trng hp v d trn. D vy vn c mt s ngi khng hiu c s
khc
nhau ca hai trng hp ny. S khc bit la ch null c th l mt node trn cy
hoc
null ch l du hiu ch khng phi l gi tr ca mt node trn cy. Hy so snh 3
hin
thc ca cy nh phn theo trnh t di y
CODE
// null ngha l khng dng c
// khng c cy rng.
class Node {
Object data;
Node left, right;
void print() {
if (left != null)
left.print();
System.out.println(data);
if (right != null)
right.print();
}
}
// null ngha l cy rng
// ch cc phng thc tnh v khng tnh
class Node {
Object data;
Node left, right;
void static print(Node node) {
if (node != null) node.print();
}
void print() {
print(left);

System.out.println(data);
print(right);
}
}
// null khng c dng
interface Node { void print(); }
class DataNode implements Node{
Object data;
Node left, right;
void print() {
left.print();
System.out.println(data);
right.print();
}
}
class EmptyNode implements Node {
void print() { }
}

8. Mt i tng th ln c no? Ti sao n khng c sizeof?


Ngn ng C c ton t sizeof v n cn ton t ny v ngi s dng phi qun l
vic gi hm malloc v v kch thc ca cc kiu nguyn thy ca n (nh kiu long)
khng c chun ha. Cn Java th khng cn n sizeof nhng n vn c mt cch
khc lm iu . Bn c th lm nh sau:
CODE
static Runtime runtime = Runtime.getRuntime();
...
long start, end;
Object obj;
runtime.gc();
start = runtime.freememory();
obj = new Object();
end = runtime.freememory();
System.out.println("That took " + (start-end) + " bytes.");

Phng php ny th khng r rng lm, v garbage collection (qu trnh dn rc) c
th xy ra phn gia ca on m m bn ang thc thi lm gin on qu trnh
m. Ngoi ra nu bn ang s dng trnh bin dch just-in-time, mt s byte c th

n t vic pht sinh m.


C th bn s ngc nhin khi nhn ra rng mt i tng s c kch thc 16 byte
hoc 4 word. S phn chia c thc hin nh sau: c mt header kch thc 2 word
trong c mt word l con tr tr ti lp ca i tng v word cn li tr ti bin.
Ngay c khi i tng khng c bin, Java vn ch nh mt word cho bin. Kt qu
l s c mt handle l mt con tr khc tr ti header. Sun ni rng vic thm vo
mt cp gin tip nh vy lm cho vic qu trnh dn rc tr nn n gin hn.
Vic khi to new String() chim 40 byte hoc l 10 word: trong 3 word l ca con
tr, 3 word dnh cho bin (phn bt u, kt thc v dy k t) v 4 word cho dy k
t trng. Vic to mt chui con ca mt chui ch chim 6 byte v mng k t
c dng chung. Vic a mt kha Integer v tr Integer vo Hashtable chim 64
byte: iu ny bn phi t tm hiu xem ti sao li nh vy.
9. Ti c th c c nhng li khuyn b ch t nhng cun sch v Java hay
khng?
C rt nhiu sch v Java, c th chia lm 3 loi nh sau:
Khng tt: ng tic l hu ht nhng cun sch v Java u thuc loi ny. Chng
c vit bi nhng ngi khng th kim c mt vic lm t t vi t cch l mt
lp trnh vin v Java (lp trnh th lun c tr cng cao hn l vit sch; ti bit
c iu ny v ti cng tng lm c hai cng vic ny). Nhng cun sch ny
loi ny cha y li, nhng li khuyn v chng trnh th rt d. Chng thc s c
nh hng khng tt i vi nhng ngi mi bt u vi Java, nhng cng c th d
dng b nhn ra v loi b bi nhng lp trnh vin c cht t kinh nghim vi nhng
ngn ng lp trnh khc.
Tuyt vi: ch c mt s lng nh nhng cun sch v Java thuc loi ny. Ti
thch nhng cun sch vit bi Arnold v Gosling, Marty Hall v Peter van der
Linder. tham kho th ti thch b sch Java in a Nutshell v vic tham kho trn
mng ti trang Web ca Sun.
Thng thng bc trung: y l loi nm khong gia hai loi trn. Chng c
vit mt cch cu th bi nhng ngi hoc khng b nhiu thi gian hiu mt
cch tng tn Java lm vic nh th no hoc vi v c c ci g xut bn
cho nhanh. Mt minh chng r rng cho s na vi ny l cun Java and the new
Internet programming paradigm ca Edward Yourdon. Sau y l nhng g m
Yourdon ni v s khc bit ca Java:
Functions have been eliminated Cc hm b loi b trong Java. ng l khng

c t kha function trong Java. Java gi chng l methods-phng thc (Perl gi l


subroutines-thng trnh con, Scheme gi l procedures- th tc, nhng r rng bn
khng th ni rng nhng ngn ng ny loi b cc hm). Chng ta ch c th ni
mt cch chc chn rng khng c hm ton cc trong Java. Nhng ti ngh s r rng
hn khi ni khng c hm no c phm vi ton cc, ch l chng phi c nh ngha
bn trong mt lp v c gi l static method C.f thay v l function f.
Automatic coercions of data types have been
eliminated vic p kiu t ng b loi b. ng l vn c gii hn trong vic p
kiu nhng cn lu chng mi b loi b. Bn vn c th dng (1.0 + 2) v 2 s c
t ng p kiu l double. Hoc bn c th dng (one + 2) v 2 s c kiu l string.
Pointers and pointer arithmetic have been eliminated cc con tr cng vi con tr
s hc b loi b . ng l con tr s hc c loi b. Nhng cc con tr thun
ty th vn cn.
Tht ra, mi tham kho n mt i tng u l mt con tr (iu gii thch ti
sao chng ta c NullPointerException). Tht kh c th tr thnh mt ngi lp trnh
kh v Java khi khng hiu c iu ny. Mi lp trnh vin Java u phi c kh
nng hiu c on m sau:
CODE
int [ ] a = {0 , 1 , 2};
int [ ] b = a;
b [0] = 99;

khi a[0] cng bng 99 v a v b u l con tr (hoc tham kho) n cng mt i


tng. Because structures are gone , and arrays and strings are represented as
objects, the need for pointers has largely disappeared bi v cc cu trc khng cn
na, v mng cng vi chui c th hin nh l cc i tng, s cn thit phi
dng con tr bin mt. y cng l mt s lm ng lc li. u tin phi khng
nh cc cu trc khng bin mt chng ch c t tn li thnh lp m thi. Ci
bin mt chnh l lp trnh vin khng cn phi tn nhiu cng sc iu khin cc
i tng c cp pht trn heap hay stack. Trong Java, tt c i tng u c
cp pht trn heap. iu gii thch ti sao c th khng cn to mt du hiu v
mt c php cho cc con tr nu nh chng tham kho n mt i tng. N chnh l
con tr. Yourdan ng khi ni rng c nhng con tr tr n gia mt chui hoc mt
dy, iu ny c xem nh l ng dng ph hp trong ngn ng C v hp ng (v
bi mt s ngi dng C++), nhng n khng c h tr cng nh b b qun
trong nhng ngn ng lp trnh khc.
Nguyn c Thnh

Theo Peter Norvig


Chn thnh cm n bo hc lp trnh cung cp ti liu ny cho TinCntt.com
(Theo:Nguyn c Thnh - Bo hc lp trnh)

You might also like