SCJP RQ : Chapter 3


Энэ буландаа SCJP шалгалтанд бэлдэх KB-н номны дасгалуудыг тэдгээрийн хариулт, тайлбартай нь 
цуврал болгон хүргэх болно. 

Chapter 2. Object Orientation
Chapter 4. Operators
-------------------------

Chapter 3. Assignments

1. Given: class CardBoard { Short story = 200; CardBoard go(CardBoard cb) { cb = null; return cb; } public static void main(String[] args) { CardBoard c1 = new CardBoard(); CardBoard c2 = new CardBoard(); CardBoard c3 = c1.go(c2); c1 = null; // do Stuff } } When // doStuff is reached, how many objects are eligible for GC? A. 0 B. 1 C. 2 D. Compilation fails E. It is not possible to know F. An exception is thrown at runtime --- Зөв хариулт: С c1= null; гэсэн мөрөнд ирэх үед, 2 ширхэг CardBoard обьект үүссэн байна. CardBoard-н go method нь яг үнэндээ юу ч хийхгүй байна (null буцаахаас өөр). Тэгэхээр c3 дээр ямар нэг обьектын референс очихгүй, шинэ обьект ч үүсэхгүй. с1-т null утга оноосноороо, с1-н өмнө нь зааж байсан обьект сул (өөрийг нь зааж буй ямар нэг референсгүй) хоцорно. с2-н хувьд бол, ямар нэг өөрчлөлт байхгүй. Тиймээс, с1-н хуучин обьект нь GC-д орох боломжтой болно. Мөн CardBoard нь өөрөө story гэсэн Short (wrapper class) обьект агуулж буй учир тэр нь хамт GC-д орно. Ингээд 2 обьект боломжтой гэсэн үг. 2. Given: class Alien { String invade(short ships) { return "a few"; } String invade(short... ships) { return "many"; } } class Defender { public static void main(String [] args) { System.out.println(new Alien().invade(7)); } } What is the result? A. many B. a few C. Compilation fails D. The output is not predictable E. An exception is thrown at runtime --- Зөв хариулт: С Alien class-н зарлал нь зөв байна. Ямар нэг асуудал байхгүй. Харин java-д бүхий л тоонууд ямар нэг cast хийгдээгүй бол int болдог учир, compiler invate(int) гэдэг method хайгаад эхэлнэ. Мэдээж олдохгүй учир, алдаа заана. хэрэв new Alien().invade((short) 7); гэсэн бол "a few" гэж хэвлэгдээд B нь зөв болох байж. 3. Given: 1. class Dims { 2. public static void main(String[] args) { 3. int[][] a = {{1,2,}, {3,4}}; 4. int[] b = (int[]) a[1]; 5. Object o1 = a; 6. int[][] a2 = (int[][]) o1; 7. int[] b2 = (int[]) o1; 8. System.out.println(b[1]); 9. } } What is the result? A. 2 B. 4 C. An exception is thrown at runtime D. Compilation fails due to an error on line 4 E. Compilation fails due to an error on line 5 F. Compilation fails due to an error on line 6 G. Compilation fails due to an error on line 7 --- Зөв хариулт: С Эхний ээлжинд, {1, 2, } гэсэн бичиглэл зөв бөгөөд, алдаа заахгүй. а гэсэн хувьсагч, 2 хэмжээст массив-г заана. a[1] гэдэг нь {3, 4} гэсэн нэг хэмжээст массив бөгөөд b-д утга онооход ч асуудалгүй. Бүхий л обьект, массивууд хүртэл java.lang.Object учир, o1-т оноож болно. буцаагаад cast хийгээд a2-т онооход ч зүгээр. Харин o1-г нэг хэмжээст массив руу cast хийгээд утга оноож буй үйлдэл нь compiler талаасаа асуудалгүй мэт боловч, яг ажиллах үед, o1-т 2хэмжээст массив байгаа учир, энд ClassCastException заана. 4. Given: class Mixer { Mixer() { } Mixer(Mixer m) { m1 = m; } Mixer m1; public static void main(String[] args) { Mixer m2 = new Mixer(); Mixer m3 = new Mixer(m2); m3.go(); Mixer m4 = m3.m1; m4.go(); Mixer m5 = m2.m1; m5.go(); } void go() { System.out.print("hi "); } } What is the result? A. hi B. hi hi C. hi hi hi D. Compilation fails E. hi, followed by an exception F. hi hi, followed by an exception --- Зөв хариулт: F Юуны өмнө Mixer гэдэг class-аа шинжилж үзье, дотроо m1 гэсэн reference агуулсан, нэг constructor-оороо тэр reference-дээ утга оноодог, go method нь "hi" гэж л хэвлэдэг юм байна. main method-г авч үзвэл, m2-н обьект нь аргументгүй constructor-г нь дуудаж буй учир m2.m1 нь null байна. m3-н хувьд m2-г параметр-ээ болгож өгч буй учир, m3.m1 нь null биш m2-н утгатай адил байна. m3.go ч "hi"-аа хэвлэнэ. m4-н хувьд шинээр обьект үүсгэлгүй, m3.m1-г оноож буй учир m2-тэй ижил болно. m4.go ч мөн л "hi"-аа хэвлэнэ. Харин m5-д m2.m1-г оноож байна. m2-н m1 нь null учир, md5 = null; гэсэнтэй ялгаагүй болно. Энэ нь m5.go()-г дуудах үедээ NullPointerException үүсгэнэ. 5. Given: class Fizz { int x = 5; public static void main(String[] args) { final Fizz f1 = new Fizz(); Fizz f2 = new Fizz(); Fizz f3 = FizzSwitch(f1,f2); System.out.println((f1 == f3) + " " + (f1.x == f3.x)); } static Fizz FizzSwitch(Fizz x, Fizz y) { final Fizz z = x; z.x = 6; return z; } } What is the result? A. true true B. false true C. true false D. false false E. Compilation fails F. An exception is thrown at runtime --- Зөв хариулт: А Жаахан шинжилбэл, Fizz class нь зөвхөн x гэсэн int төрлийн field-тэй юм байна. бас FizzSwitch нь, x гэсэн аргумент-нхаа x гэсэн field-г нь 6 болгоод буцаагаад x-ээ буцаахаас өөр юм хийхгүй байна. Main дотор ороод үзвэл, f1, f2-н хуььд шинэ обьект(instance) үүсгэж байна. f3-т fizzSwitch-н буцах утгыг өгнө. Тэр нь f1 өөрөө буцаад ирнэ. Тэгэхээр f1, f3 2 нэг обьект руу зааж байгаа гэсэн үг. Тэр нь f1 == f3, мөн f1.x == f3.x гэсэн. Иймээс true true гэж хэвлэнэ. Энд нэг анхаарах юм байж болно. Тэр нь final гэж f1 болон z -г тэмдэглэсэн байна. Энэ нь энэ reference-д анх оноосон утгаа өөрчлөхгүй (өөр обьект заахгүй) гэсэн үг болохоос тэр обьект нь өөрөө өөрчлөгдөхгүй (method дуудах, доторх field-н утга өөрчлөгдөх) гэсэн үг биш. 6. Given: class Bird { { System.out.print("b1 "); } public Bird() { System.out.print("b2 "); } } class Raptor extends Bird { static { System.out.print("r1 "); } public Raptor() { System.out.print("r2 "); } { System.out.print("r3 "); } static { System.out.print("r4 "); } } class Hawk extends Raptor { public static void main(String[] args) { System.out.print("pre "); new Hawk(); System.out.println("hawk "); } } What is the result? A. pre b1 b2 r3 r2 hawk B. pre b2 b1 r2 r3 hawk C. pre b2 b1 r2 r3 hawk r1 r4 D. r1 r4 pre b1 b2 r3 r2 hawk E. r1 r4 pre b2 b1 r2 r3 hawk F. pre r1 r4 b1 b2 r3 r2 hawk G. pre r1 r4 b2 b1 r2 r3 hawk H. The order of output cannot be predicted I. Compilation fails --- Зөв хариулт: D Энэ Маралаагийн байнга ярьдаг зүйл байна. Энийг нэг тийш нь болгоё. Бидэнд юу юу байгаа вэ гэхээр, тухайн нэг class-н хувьд, - static initializer - instance initializer - constructor body Мөн super, sub гээд nested class-ууд байгаа гэж бодъё. static initializer-н хувьд classload үед дуудагдах учир, нөгөө 2той нь холиод хэрэггүй юм. Шаал өөр цаг хугацаанд явагдаж буй учир, Мэдээж sub class-аа уншихаасаа өмнө заавал super-г нь унших ёстой. Тийм учраас, эхлээд super class-нх нь static initializer-ууд байгаа дараалллаараа ажиллаж дуусаад, дараа нь sub class-нх руугаа орно. Харин constructor болон instance initializer 2ын хувьд шинэ instance үүсэх үед ажиллана. Гэхдээ эхлээд, super-нхийгээ хийж дууссаных нь дараа ажиллана. Эхлээд initializer нь дараа нь constructor-н body ажиллана. Аа харин static initializer-ууд маань main дотор байгаа "pre"-н хаана нь дуудагдах вэ гэхээр, main функц руу орохдоо, class-уудаа load хийх учир "pre"-н өмнө дуудагдана. Ингээд бодох юм бол, r1 r4 pre b1 b2 r3 r2 hawk гэж гарна. 7. Given: 3. public class Bridge { 4. public enum Suits { 5. CLUBS(20), DIAMONDS(20), HEARTS(30), SPADES(30), 6. NOTRUMP(40) { public int getValue(int bid) { return ((bid-1)*30)+40; } }; 7. Suits(int points) { this.points = points; } 8. private int points; 9. public int getValue(int bid) { return points * bid; } 10. } 11. public static void main(String[] args) { 12. System.out.println(Suits.NOTRUMP.getValue(3)); 13. System.out.println(Suits.SPADES + " " + Suits.SPADES.points); 14. System.out.println(Suits.values()); 15. } 16. } Which are true? (Choose all that apply.) A. The output could contain 30 B. The output could contain @bf73fa C. The output could contain DIAMONDS D. Compilation fails due to an error on line 6 E. Compilation fails due to an error on line 7 F. Compilation fails due to an error on line 8 G. Compilation fails due to an error on line 9 H. Compilation fails due to an error within lines 12 to 14 12-р мөрөнд номны алдаа байсан тул, энд засаад оруулсан болно. --- Зөв хариулт: А, B Enum-н талаар, мөн Enum-н override-н талаарх асуулт байна. NOTRUMP гэсэн enum-н intance нь, Suits-д зарласан getValue method-г override хйиж байна. Бусад нь Suits-нхээр ажиллаад, NOTRUMP болохоор өөрийнхөөрөө ажиллана гэсэн үг. Бусдаар өөр онцлох зүйл алга. 12-р мөрний утга нь (3 - 1) * 30 + 40 буюу 100 гарна. 13-р мөрөнд SPAPES гэдэг enum instance-аа шууд хэвлэж байна. Enum-ууд хэвлэгдэхдээ, өөрийн нэрээ хэвлэдэг учир, "SPADES" гэж гарна. Араас нь SPADES.points буюу 30 хэвлэгдэнэ. 14-р мөрний хувьд Suits.values() нь array буцаана, Array нь хэвллэгдэхдээ, шууд reference-хээ дугаарыг хэвлэдэг учир, @bf73fa иймэрхүү утга хэвлэнэ. Эндээс А, B 2 нь зөв болох нь гарах нь. 8. Given: 3. public class Ouch { 4. static int ouch = 7; 5. public static void main(String[] args) { 6. new Ouch().go(ouch); 7. System.out.print(" " + ouch); 8. } 9. void go(int ouch) { 10. ouch++; 11. for(int ouch = 3; ouch < 6; ouch++) 12. ; 13. System.out.print(" " + ouch); 14. } 15. } What is the result? A. 5 7 B. 5 8 C. 8 7 D. 8 8 E. Compilation fails F. An exception is thrown at runtime --- Зөв хариулт: E Static хувьсагчтай ижил нэртэй local хувьсагч(parameter) зарлаж болно, variable shadowing гэдэг нь. Харин local scope-т 2 ижил нэртэй байж болохгүй, өөрөөр хэлбэл, 9-р мөрний ouch, 11-р мөрний ouch 2 хамт байж болохгүй. Иймээс compiler-н алдаа заана. Харин 11-р мөрний ouch өөр нэртэй байсан бол яах вэ? for loop бидэнд ямар ч утгагүй болж хувирна, тэрийг алгасвал, 6р мөрөнд static variable-аа parameter болгоод өгч байна. go дотор тэрийг нь өөрчилж байна. 7 байсан утга нь 8 болоод 13 дээр хэвлэгдэнэ. Буцаад, 7 очоод харахад, static variable маань өөрчлөгдсөн байх уу? гэдэг нь хамгийн гол асуулт болно. Pass By Value гэдэг дүрмээр, static variable нь өөрөө биш утга нь л дамжаад, өөр local variable хадгалагдаад цаашаа явж буй учир, static variable маань хэвээрээ үлдэнэ. Иймээс 7р мөрөнд, 7 л гэж хэвлэнэ гэсэн үг. 9. Given: 3. public class Bertha { 4. static String s = ""; 5. public static void main(String[] args) { 6. int x = 4; Boolean y = true; short[] sa = {1,2,3}; 7. doStuff(x, y); 8. doStuff(x); 9. doStuff(sa, sa); 10. System.out.println(s); 11. } 12. static void doStuff(Object o) { s += "1"; } 13. static void doStuff(Object... o) { s += "2"; } 14. static void doStuff(Integer... i) { s += "3"; } 15. static void doStuff(Long L) { s += "4"; } 16. } What is the result? A. 212 B. 232 C. 234 D. 312 E. 332 F. 334 G. Compilation fails --- Зөв хариулт: A Юуны өмнө нэг юм санацгаая, - var-args-тай method хамгийн сүүлд шалгагддаг - widen -> box -> var-args гэдэг дарааллаар шалгана - Заавал widen/box хийх хэрэгтэй бол, эхлээд box дараа нь widen хийдэг, тэрнээс widen хийчихээд box хийдэггүй. Ингээд харвал, 7р мөрөнд, (int, boolean) гэсэн doStuff байхгүй учир, 13-н doStuff дуудагдана. дан ганц int авдаг doStuff ч алга, (Integer ... i) дуудагдаж болох юм шиг боловч, энэ var-arg байна. (Long L) хамгийн ойр байгаа юм шиг боловч, int -> Long болохын тулд эхлээд widen(long) дараа нь box(Long) болгох хэрэгтэй болно. Даанч тэгж ажилладаггүй, тэгэхээр энэ дуудагдахгүй, харин (Object o) байж болно, эхлээд box(Integer) дараа нь wide(Integer -> Object) хийсэн байна. Энэ нь ч (Integer ... i)-с өмнө шалгагдах учир, энэ ажиллана. Дараа нь 2 array авдаг doStuff байхгүй ч, бидэнд хэдэн ч java.lang.Object авдаг doStuff байгаа, бүх array явж явж Object учир, энэ дуудагдана. Ингээд, 212 буюу А нь зөв болно. 10. Given: 3. class Dozens { 4. int[] dz = {1,2,3,4,5,6,7,8,9,10,11,12}; 5. } 6. public class Eggs { 7. public static void main(String[] args) { 8. Dozens [] da = new Dozens[3]; 9. da[0] = new Dozens(); 10. Dozens d = new Dozens(); 11. da[1] = d; 12. d = null; 13. da[1] = null; 14. // do stuff 15. } 16. } Which two are true about the objects created within main(), and eligible for garbage collection when line 14 is reached? A. Three objects were created B. Four objects were created C. Five objects were created D. Zero objects are eligible for GC E. One object is eligible for GC F. Two objects are eligible for GC G. Three objects are eligible for GC --- Зөв хариулт: С, F Dozens гэдэг class маань өөрөө int[] гэсэн обьект агуулна, Dozens үүсэх үед өөртөө нь нийлээд 2 обьект бас хамт үүснэ гэсэн үг. Устах үед нь бас устана (доторх array-гаа өөр юманд аваачаад наачаагүй бол шд). Мөн array обьект үүсгэх үед (8р мөрөнд байгаа шиг). Хоосон (дүүрэн null бүхий) array л үүснэ. Гээд бодохоор, 8р мөрөнд 1, 9р мөрөнд 2, 10р мөрөнд 2 гээд 5 обьект үүссэн байна. 9 дээр d[0]-д утга онооно, 10 болон 11 дээр ижил обьектыг 2 референс-д (d[1] ч ялгаагүй нэг л референс) оноогоод, буцаагаад 12, 13 дээр тэр 2оо null-лаж байна. Тэгэхээр 10 дээр үүсэн Dozens обьект-г заасан ямар нэг референсгүй хоцроно. Тиймээс энэ обьект GC-д орох боломжтой болно, энийгээ дагаад доторх array нь ч явна. Тэгэхээр F нь зөв болно. 11. Given: 3. class Beta { } 4. class Alpha { 5. static Beta b1; 6. Beta b2; 7. } 8. public class Tester { 9. public static void main(String[] args) { 10. Beta b1 = new Beta(); Beta b2 = new Beta(); 11. Alpha a1 = new Alpha(); Alpha a2 = new Alpha(); 12. a1.b1 = b1; 13. a1.b2 = b1; 14. a2.b2 = b2; 15. a1 = null; b1 = null; b2 = null; 16. // do stuff 17. } 18. } When line 16 is reached, how many objects will be eligible for garbage collection? A. 0 B. 1 C. 2 D. 3 E. 4 F. 5 --- Зөв хариулт: B Alpha дотор b1-г static гэдгийг сайн анхаарах хэрэгтэй. Тэгэхээр тэр нь тухайн Alpha обьекттойгоо ямар ч хамааралгүй, class-аа дагаад л явна. харин b2 нь instance variable учир intance-аа дагаад явна. main дотор нийтдээ 4 обьект үүсч байна. 12р дээр b1-г Alpha.b1-т оноож байна. Хэдий a1.b1 гэж бичсэн ч, яг зөв бичиглэл нь Alpha.b1 юм. мөн b1-г a1.b2-т, b2-г a2.b2-т оноож байна. Буцаагаад, a2-с бусдыг нь null-лахад, a2 үлдэнэ. a2-г дагаад, a2.b2 дээр байгаа обьект буюу хуучин b2-н зааж байсан обьект үлдэнэ. Хуучин a1-н зааж байсан обьектыг нэг ч референс заахгүй байгаа учир устана. Харин b1-н хувьд бол, a1.b2 ялгаагүй устах мэт боловч, Alpha.b1 гэсэн бүүр том(scope талаасаа) хувьсагчид оноогдсон учир устахгүй. Ингээд ганцхан a1 л устах нь байна. 12. Given: 3. class Box { 4. int size; 5. Box(int s) { size = s; } 6. } 7. public class Laser { 8. public static void main(String[] args) { 9. Box b1 = new Box(5); 10. Box[] ba = go(b1, new Box(6)); 11. ba[0] = b1; 12. for(Box b : ba) System.out.print(b.size + " "); 13. } 14. static Box[] go(Box b1, Box b2) { 15. b1.size = 4; 16. Box[] ma = {b2, b1}; 17. return ma; 18. } 19. } What is the result? A. 4 4 B. 5 4 C. 6 4 D. 4 5 E. 5 5 F. Compilation fails --- Зөв хариулт: A go гэдэг method-г харвал, 2 аргумент аваад эхнийх нь size-г 4 болгоод, байрыг сольж array үүсгээд буцаачихаж байна. main дотор, b1 эхлээд 5 гэсэн size-тайгаар үүсч байна. Дараа нь 6 гэсэн шинэ үүсгэсэн обьекттой хамт go-руу илгээгдээд, ba-д орно. Тэр үед, b1-н size 5 байхаа болиод 4 болсон байна. ba ч {6, 4} гэсэн байрлалтай байна. 11р мөрөнд b1-г ba-н эхний гишүүн болгочихож байна. Ингэхээр, ba нь 2 ижил обьектыг агуулсан болно. Ингээд л хэвлэхэд 4 4 гарна. 13. Given: 3. public class Dark { 4. int x = 3; 5. public static void main(String[] args) { 6. new Dark().go1(); 7. } 8. void go1() { 9. int x; 10. go2(++x); 11. } 12. void go2(int y) { 13. int x = ++y; 14. System.out.println(x); 15. } 16. } What is the result? A. 2 B. 3 C. 4 D. 5 E. Compilation fails F. An exception is thrown at runtime --- Зөв хариулт: E local variable-уудын анхны утга нь автоматаар оноогддоггүй учир, ашиглахаасаа өмнө заавал утга оноосон байх шаардлагатай. Иймээс 10-р мөрөнд compiler-н алдаа заана.

No comments:

Post a Comment