SCJP RQ


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

Chapter 3. Assignments
Chapter 4. Operators
-------------------------

Chapter 2. Object Orientation

1. Given: public abstract interface Frobnicate { public void twiddle(String s); } Which is a correct class? (Choose all that apply.) A. public abstract class Frob implements Frobnicate { public abstract void twiddle(String s) { } } B. public abstract class Frob implements Frobnicate { } C. public class Frob extends Frobnicate { public void twiddle(Integer i) { } } D. public class Frob implements Frobnicate { public void twiddle(Integer i) { } } E. public class Frob implements Frobnicate { public void twiddle(String i) { } public void twiddle(Integer s) { } } --- Зөв хариулт: B, E. A. Буруу. abstract method нь ';'-р төгсөх ёстой. {} гэж implementation-г бичих гэж байгаа бол abstract байж болохгүй. B. Зөв. abstract class нь удамшиж буй interface-нхээ method-уудыг заавал implement хийх шаардлагагүй. C. Буруу. class нь interface-г хэзээ ч extend хийдэггүй. D. Буруу. Concrete class боловч, interface-нхээ method-г (twiddle(String s)) implement хийгээгүй байна. twiddle(Integer i) нь зүгээр overload хийж байна. E. Зөв. Class-н зарлал нь байна. Concrete class. interface-нхээ method-г implement хийж чадсан байна. Мөн overloaded бас нэг method үүсгэсэн байна. --- Нэмэлт, - interface-н зарлалд abstract түлхүүр үгийг ашиглаж болно. 2. Given: class Top { public Top(String s) { System.out.print("B"); } } public class Bottom2 extends Top { public Bottom2(String s) { System.out.print("D"); } public static void main(String [] args) { new Bottom2("C"); System.out.println(" "); } } What is the result? A. BD B. DB C. BDC D. DBC E. Compilation fails --- Зөв хариулт: Е Top class нь String parameter авдаг construtor зарласан учир, default construtor үүсэхгүй. Мөн Bottom2-н construtor-н эхний мөр нь System.out.println("D"); байгаа учир compiler автоматаар super(); гэсэн мөр нэмж оруулна. Даанч super class буюу Top-д no-arg construtor байхгүй учир compiler-н алдаа заана. --- Нэмэлт, - Class дотор ямар ч constructor зарлагдаагүй үед л, default constructor үүснэ. Дээрх 2 class нь 2уулаа тусгайлан зарласан constructor-той байна. - Constructor болгоны эхний мөр нь нэг бол this, эсвэл super байх ёстой. Мөн эдгээр түлхүүр үг нь эхний мөрөөс хойш бичигддэггүй (дахин дуудах, боломжгүй гэсэн үг). Хэрэв аль ч бичигдээгүй бол, compiler автоматаар super() гэж тавьж өгдөг. - Хэрэв Top(String s) гэж биш, Top() гэж байсан бол, код зүгээр ажиллах байсан. "BD " гэж хэвлэгдэх байсан. 3. Given: class Clidder { private final void flipper() { System.out.println("Clidder"); } } public class Clidlet extends Clidder { public final void flipper() { System.out.println("Clidlet"); } public static void main(String [] args) { new Clidlet().flipper(); } } What is the result? A. Clidlet B. Clidder C. Clidder Clidlet D. Clidlet Clidder E. Compilation fails --- Зөв хариулт: А Энэ бага зэрэг ээдрээтэй асуулт байна. Class-уудын зарлал бол асуудалгүй. flipper method ч яг адилхан signature-тэй. Тэгэхээр override хийж байна гэж ойлгогдоно. Гэвч 2уулаа final байна. Ялангуяа Clidder доторх нь final байна. Тэгэхээр, Clidlet дотор Clidder-н flipper-г ovveride хийхийг зөвшөөрөхгүй гэсэн үг. Хэрэв ахиад сайн харвал Clidder.flipper нь private байна. Энэ тохиолдолд Clidlet-д Clidder.flipper огт харагдахгүй гэсэн үг. Тиймээс ч түүний override хийхгүй, зүгээр л цоо шинэ method-г л үүсгэнэ. Өөрөөр хэлбэл, энэ 2 method ямар ч холбоогүй гэсэн үг. Ингээд ажиллуулах үед "Clidlet" гэж хэвлэнэ. 5. Which statement(s) are true? (Choose all that apply.) A. Cohesion is the OO principle most closely associated with hiding implementation details B. Cohesion is the OO principle most closely associated with making sure that classes know about other classes only through their APIs C. Cohesion is the OO principle most closely associated with making sure that a class is designed with a single, well-focused purpose D. Cohesion is the OO principle most closely associated with allowing a single object to be seen as having many types --- Зөв хариулт: С А. Encapsulation : Implementation(гүйцэтгэл)-н талаар нууцлах B. Coupling : Нэг class нөгөө class-аа зөвхөн API-р нь дамжуулж л мэддэг байх, C. Cohesion : Class зөвхөн нэг л тодорхой зорилготой байх D. Polymorphism : Нэг обьект олон төрлөөр "харагдах" 6. Given the following, 1. class X { void do1() { } } 2. class Y extends X { void do2() { } } 3. 4. class Chrome { 5. public static void main(String [] args) { 6. X x1 = new X(); 7. X x2 = new Y(); 8. Y y1 = new Y(); 9. // insert code here 10. } 11. } Which, inserted at line 9, will compile? (Choose all that apply.) A. x2.do2(); B. (Y)x2.do2(); C. ((Y)x2).do2(); D. None of the above statements will compile --- Зөв хариулт: С А. Хэдий Y-н обьектыг зааж байгаа ч, X-н reference-р шууд Y-н method-г (do2) дуудаж чадахгүй. Cast хийх хэрэгтэй B. Зөв cast хийгдээгүй байна. Яг бичиглэлээр, x2-г Y болгож байгаа биш, do2()-с буцаж ирэх утгыг Y-руу cast хийж байгаа юм шиг харагдаж байна. С. Зөв cast хийгдсэн байна. D. C нь зөв учраас энэ хариулт буруу. 7. Given: 1. ClassA has a ClassD 2. Methods in ClassA use public methods in ClassB 3. Methods in ClassC use public methods in ClassA 4. Methods in ClassA use public variables in ClassB Which is most likely true? (Choose the most likely.) A. ClassD has low cohesion B. ClassA has weak encapsulation C. ClassB has weak encapsulation D. ClassB has strong encapsulation E. ClassC is tightly coupled to ClassA --- Зөв хариулт: С А. Cohesion-н талаар ярихын тулд бид тухайн class-н юу юу хийдгийг мэдэх хэрэгтэй, гэвч энд тийм мэдээлэл байхгүй учир, шууд ClassD-г low cohession-той гэж хэлж чадахгүй. B. Weak encapsulation-той байна гэдэг нь, тухайн class-н field-үүд рүү бусад class шууд хандахыг хэлнэ. Энд ClassA-руу бусад class тэгж хандаж байгаа талаар мэдээлэл байхгүй байна. С. Дээр дурьдсан зүйл, ClassB-н хувьд хүчинтэй. "4. Methods in ClassA use public variables in ClassB". Тиймээс зөв. D. "4. Methods in ClassA use public variables in ClassB" энэ шалтгаанаар ClassB-г strong encapsulation-тай гэж хэлэхгүй. E. Энэ 2 class-н хоорондох хамаарал нь "Methods in ClassC use public methods in ClassA" энэнээс өөрөөр бичигдээгүй болохоор, ингэж хэлж чадахгүй. 8. Given: 3. class Dog { 4. public void bark() { System.out.print("woof "); } 5. } 6. class Hound extends Dog { 7. public void sniff() { System.out.print("sniff "); } 8. public void bark() { System.out.print("howl "); } 9. } 10. public class DogShow { 11. public static void main(String[] args) { new DogShow().go(); } 12. void go() { 13. new Hound().bark(); 14. ((Dog) new Hound()).bark(); 15. ((Dog) new Hound()).sniff(); 16. } 17. } What is the result? (Choose all that apply.) A. howl howl sniff B. howl woof sniff C. howl howl followed by an exception D. howl woof followed by an exception E. Compilation fails with an error at line 14 F. Compilation fails with an error at line 15 --- Зөв хариулт: F 13-р мөрөнд, шинээр Hound-н обьектыг үүсгээд bark method-г дуудаж байна. Hound class нь Dog-с удамшсан мөн өөрөө override хийсэн bark method-тэй учир ямар ч асуудал байхгүй. 14-р мөрөнд шинээр үүсгэсэн Hound-н обьектоо Dog болгон cast хийгээд bark()-г дуудаж байна. Энэ нь Dog-н reference-р дамжуулж дуудсантай ялгаагүй бөгөөд, Dog class нь өөрөө bark() гэсэн method учир асуудалгүй дуудна. Харин ажиллах үедээ, Hound-н bark() ажиллана. 15-р мөрөнд мөн адил Dog-р дамжуулж sniff()-г дуудах гэж оролдож байна. Хэдий цаанаа Hound-н обьект байгаа ч, Dog class-р дамжиж буй учир, compiler энд алдаа заана. 9. Given: 3. public class Redwood extends Tree { 4. public static void main(String[] args) { 5. new Redwood().go(); 6. } 7. void go() { 8. go2(new Tree(), new Redwood()); 9. go2((Redwood) new Tree(), new Redwood()); 10. } 11. void go2(Tree t1, Redwood r1) { 12. Redwood r2 = (Redwood)t1; 13. Tree t2 = (Tree)r1; 14. } 15. } 16. class Tree { } What is the result? (Choose all that apply.) A. An exception is thrown at runtime B. The code compiles and runs with no output C. Compilation fails with an error at line 8 D. Compilation fails with an error at line 9 E. Compilation fails with an error at line 12 F. Compilation fails with an error at line 13 --- Зөв хариулт: А go2 method, Tree болон Redwood гэсэн parameter авч байна. 8-р мөрөнд яг тэр хэвээр нь өгч байгаа учир асуудал алга. 9-р мөрөнд, хэдий Tree-н обьект нь Redwood болж байгаа ч, Redwood нь Tree учир (Redwood IS A Tree) мөн л go2 асуудалгүй дуудагдаж чадна. 12-р мөрөнд Tree-н t1 гэсэн reference-г Redwood болгон cast хийгээд r2-т оноож байна. Үүнийг compile хийхэд асуудал байхгүй. 13-р мөрөнд r1-г Tree болгон cast хийгээд t2-т өгч байна. Үүнд cast хийх ч шаардлагагүй. Угаасаа Redwood IS A Tree учир. Ингээд програм-г compile хийхэд ямар ч асуудал алга. Гэвч, яг ажиллах үед, 8-р мөрөнд t1-т Tree-н обьектыг үүсгэж өгөөд, 12-р мөрөнд ирэхэд t1-г Redwood рүү cast хийхэд Tree-г Redwood рүү cast хийж чадахгүй байна гэсэн ClassCastException заана. Яг адил exception 9р мөрөнд Tree-н шинэ обьектыг Redwood болг cast хийхэд заана. 10. Given: 3. public class Tenor extends Singer { 4. public static String sing() { return "fa"; } 5. public static void main(String[] args) { 6. Tenor t = new Tenor(); 7. Singer s = new Tenor(); 8. System.out.println(t.sing() + " " + s.sing()); 9. } 10. } 11. class Singer { public static String sing() { return "la"; } } What is the result? A. fa fa B. fa la C. la la D. Compilation fails E. An exception is thrown at runtime --- Зөв хариулт: B Class-н зарлал, кодонд ямар нэг асуудал байхгүй, зүгээр compile хийгдэнэ. Tenor болон Singer class-уудад байгаа sing() method-ууд нь static болохоор, хоорондоо ямар ч хамааралгүй бөгөөд, instance method-ууд шиг "runtime үед аль class-ынх нь ажиллах" нь шийдэгдэхгүй. Шууд reference-нхээ class-т зарлагдсан method нь дуудагдана. Тэгэхээр, хэдий 2уулаа Tenor обьект ч, t, s гэсэн 2 өөр reference-р дуудаж буй учир, тус тус sing()-г дуудан "fa la" гэж хэвлэнэ. 11. Given: 3. class Alpha { 4. static String s = " "; 5. protected Alpha() { s += "alpha "; } 6. } 7. class SubAlpha extends Alpha { 8. private SubAlpha() { s += "sub "; } 9. } 10. public class SubSubAlpha extends Alpha { 11. private SubSubAlpha() { s += "subsub "; } 12. public static void main(String[] args) { 13. new SubSubAlpha(); 14. System.out.println(s); 15. } 16. } What is the result? A. subsub B. sub subsub C. alpha subsub D. alpha sub subsub E. Compilation fails F. An exception is thrown at runtime --- Зөв хариулт: C Сайн харвал, SubSubAlpha нь Alpha-с удамшсан байгаа, тэгэхээр SubAlpha-н private constructor нь ямар ч аюулгүй гэсэн үг. Ингээд С нь зөв болно. Харин энд SubSubAlpha нь Alpha-с биш SubAlpha-с удамшсан бол яах вэ гэдэг сонирхолтой байна. Энэ тохиолдолд 11-р мөрөндэх SubSubAlpha-н constructor-т эхний мөр болж super(); орж ирнэ. Гэвч SubAlpha() нь private учир, super()-д харагдахгүй энэнээс болж compiler-н алдаа заана. 12. Given: 3. class Building { 4. Building() { System.out.print("b "); } 5. Building(String name) { 6. this(); System.out.print("bn " + name); 7. } 8. } 9. public class House extends Building { 10. House() { System.out.print("h "); } 11. House(String name) { 12. this(); System.out.print("hn " + name); 13. } 14. public static void main(String[] args) { new House("x "); } 15. } What is the result? A. h hn x B. hn x h C. b h hn x D. b hn x h E. bn x h hn x F. b bn x h hn x G. bn x b h hn x H. Compilation fails --- Зөв хариулт: С Энд constructor-н ажиллах дарааллыг гаргаж байгаад харвал илүү зүгээр байх, 1. new House("x "); ажиллана 2. House(String name) { руу орно 3. House() { ийшээ үсрэнэ. 4. super() дуудагдана 5. Building() { руу орно, эндээс Object-н constructor руу үсрээд буцаад ирнэ. тэр хэсгийг бичээд яахав. 6. "b " гэж хэвлэнэ. буцаад 10-р мөрөнд очно. 7. "h " гэж хэвлэнэ. буцаад 12-р мөрөнд очно. 8. "hn x " гэж хэвлэнэ. буцаад 14-р мөрөнд очоод дуусна. 13. Given: 3. class Mammal { 4. String name = "furry "; 5. String makeNoise() { return "generic noise"; } 6. } 7. class Zebra extends Mammal { 8. String name = "stripes "; 9. String makeNoise() { return "bray"; } 10. } 11. public class ZooKeeper { 12. public static void main(String[] args) { new ZooKeeper().go(); } 13. void go() { 14. Mammal m = new Zebra(); 15. System.out.println(m.name + m.makeNoise()); 16. } 17. } What is the result? A. furry bray B. stripes bray C. furry generic noise D. stripes generic noise E. Compilation fails F. An exception is thrown at runtime --- Зөв хариулт: A Static method run-time обьектоо биш reference-аа дагаж дуудагддаг гэж дээр дурьдсан шиг, яг адил зүйл instance variable-уудын хувьд бас хамаатай. Энэ утгаараа 15-р мөрөнд буй m.name нь 8-р мөрийн "stripes"-г биш 4-р мөрийн "furry" -г заана. харин makeNoise-н хувьд 9-р мөрнийх нь дуудагдана (Polymorphism). 14. You’re designing a new online board game in which Floozels are a type of Jammers, Jammers can have Quizels, Quizels are a type of Klakker, and Floozels can have several Floozets. Which of the following fragments represent this design? (Choose all that apply.) A. import java.util.*; interface Klakker { } class Jammer { Set q; } class Quizel implements Klakker { } public class Floozel extends Jammer { List f; } interface Floozet { } B. import java.util.*; class Klakker { Set q; } class Quizel extends Klakker { } class Jammer { List f; } class Floozet extends Floozel { } public class Floozel { Set k; } C. import java.util.*; class Floozet { } class Quizel implements Klakker { } class Jammer { List q; } interface Klakker { } class Floozel extends Jammer { List f; } D. import java.util.*; interface Jammer extends Quizel { } interface Klakker { } interface Quizel extends Klakker { } interface Floozel extends Jammer, Floozet { } interface Floozet { } --- Зөв хариулт: A, C Эхлээд өгүүлбэр бүрээр нь задалж үзье, 1. "Floozels are a type of Jammers" гэдэг нь "Floozel IS A Jammer" гэсэн үг. Тэр нь Floozel нь Jammer-г extend/implement хийнэ гэсэн үг. 2. "Jammers can have Quizels" гэдэг нь "Jammer HAS A Quizel" гэсэн үг болно. 3. "Quizels are a type of Klakker" -> "Quizel IS A Klakker". 4. "Floozels can have several Floozets" гэдэг нь Floozel нь нэгээс илүү Floozet-г өөртөө агуулж болно гэсэн үг. Ингээд бодоод үзвэл, А. "public class Floozel extends Jammer" -> 1р зүйлийг хангаж байгааг харж байна. "class Jammer { Set q; }" -> 2 "class Quizel implements Klakker" -> 3 "Floozel extends Jammer { List f; }" -> 4 гэхээр А байж болох хувилбар байна. B. "class Quizel extends Klakker { }" -> 3 "class Jammer { List f; }" -> 2 1 болон 4-г хангаж чадахгүй байна. С. "class Quizel implements Klakker { }" -> 3 "class Jammer { List q; }" -> 2 "class Floozel extends Jammer { List f; }" -> 1, 4 С болно. D. Бүгд interface байгаа нь "IS A" нөхцлүүдийг хангаж болох ч, "HAS A"-г хангаж чадахгүй юм. 15. Given: 3. class A { } 4. class B extends A { } 5. public class ComingThru { 6. static String s = "-"; 7. public static void main(String[] args) { 8. A[] aa = new A[2]; 9. B[] ba = new B[2]; 10. sifter(aa); 11. sifter(ba); 12. sifter(7); 13. System.out.println(s); 14. } 15. static void sifter(A[]... a2) { s += "1"; } 16. static void sifter(B[]... b1) { s += "2"; } 17. static void sifter(B[] b1) { s += "3"; } 18. static void sifter(Object o) { s += "4"; } 19. } What is the result? A. -124 B. -134 C. -424 D. -434 E. -444 F. Compilation fails --- Зөв хариулт: D Толгой эргүүлж болох 2 зүйл байгаа нь, 16 болон 17р мөрөнд байгаа 2 method-н аль нь 11-р мөрөнд дуудагдах вэ? мөн 12-р мөрөнд байгаа 7, object болж чадах уу? 1. var-args method хамгийн сүүлд шалгагддаг учир, 17р мөрөндэх method дуудагдана. 2. 7 эхлээд Integer болоод (auto-box), дараа нь Object болно (widen). Ингээд хариулт нь -434 ------------------------------- Асуулт 1: | public class Tenor extends Singer { | .... | | Singer s = new Tenor(); | } Дээрх код дээр "Singer s = new Tenor();" гэж болдгийг тайлбарлаж өгөөч? Хариулт: Tenor нь Singer-с удамшсан байна. Энэ нь "Tenor IS A Singer" буюу "Tenor бол Singer" гэсэн үг. Singer s = new Tenor(); гэх үед, s -д оноогдож байгаа Tenor-с нэг асуултыг асууна "Tenor нь Singer мөн үү?" гэж, мөн учир ингэж оноож болно. Товчоор, superclass-н reference-д subclass-н обьектыг оноож болно.

No comments:

Post a Comment