Svårighetsgrad: Intermediate Förutsäg resultatet av följande Java-program. Program 1: Java public class Calculator { int num = 100; public void calc(int num) { this.num = num * 10; } public void printNum() { System.out.println(num); } public static void main(String[] args) { Calculator obj = new Calculator(); obj.calc(2); obj.printNum(); } } Alternativ: A) 20 B) 100 C) 1000 D) 2 Svar: A) 20 Förklaring: Här är klassinstansvariabeln name(num) samma som calc() metod lokal variabel namn(antal). Så för att referera till klassinstansvariabel från calc() metod detta nyckelord används. Så i statement this.num = num * 10 i en representerar den lokala variabeln för metoden vars värde är 2 och detta.num representerar klassinstansvariabel vars initiala värde är 100. Nu in printNum() metod eftersom den inte har någon lokal variabel vars namn är samma som klassinstansvariabel så vi kan direkt använda i en att referera till instansvariabel men detta.num kan användas. Program 2: Java public class MyStuff { String name; MyStuff(String n) { name = n; } public static void main(String[] args) { MyStuff m1 = new MyStuff('guitar'); MyStuff m2 = new MyStuff('tv'); System.out.println(m2.equals(m1)); } @Override public boolean equals(Object obj) { MyStuff m = (MyStuff) obj; if (m.name != null) { return true; } return false; } } Alternativ: A) Utdata är sant och MyStuff uppfyller Object.equals()-kontraktet. B) Utdata är falsk och MyStuff uppfyller kontraktet Object.equals(). C) Utdata är sant och MyStuff uppfyller INTE Object.equals()-kontraktet. D) Utdatat är falskt och MyStuff uppfyller INTE Object.equals()-kontraktet. Svar: C) Utdata är sant och MyStuff uppfyller INTE Object.equals()-kontraktet. Förklaring: Som lika (Objekt objekt) metod i klassen Objekt jämför två objekt på basis av ekvivalensrelation. Men här bekräftar vi bara att objektet är null eller inte, så det uppfyller inte Object.equals() kontrakt. Som m1 är inte null sant kommer att skrivas ut. Program 3: Java class Alpha { public String type = 'a '; public Alpha() { System.out.print('alpha '); } } public class Beta extends Alpha { public Beta() { System.out.print('beta '); } void go() { type = 'b '; System.out.print(this.type + super.type); } public static void main(String[] args) { new Beta().go(); } } Alternativ: A) alfa beta b b B) alfa beta a b C) beta alfa b b D) beta alfa a b Svar: A) alfa beta b b Förklaring: Uttalandet new Beta().go() körs i två faser. I första fasen Beta klasskonstruktor kallas. Det finns ingen instansmedlem närvarande i Beta klass. Så nu Beta klasskonstruktorn körs. Som Beta klass sträcker sig Alfa klass så samtalet går till Alfa klasskonstruktor som första sats som standard (Sätts av kompilatorn) är super() i Beta klass konstruktör. Nu som en instansvariabel( typ ) finns i Alfa klass så det ska få minne och nu Alfa klasskonstruktor exekveras och sedan anropar du tillbaka till Beta klasskonstruktör nästa uttalande. Så alfa beta är tryckt. I andra fasen gå() metod anropas på detta objekt. Eftersom det bara finns en variabel( typ ) i objektet vars värde är a . Så det kommer att ändras till b och tryckt två gånger. De super nyckelord här är till ingen nytta. Program 4: Java public class Test { public static void main(String[] args) { StringBuilder s1 = new StringBuilder('Java'); String s2 = 'Love'; s1.append(s2); s1.substring(4); int foundAt = s1.indexOf(s2); System.out.println(foundAt); } } Alternativ: A) -1 B) 3 C) 4 D) A StringIndexOutOfBoundsException kastas under körning. Svar: C) 4 Förklaring: append(String str) metodkonkatenera str till s1 . De delsträng (int index) metod returnerar strängen från det givna indexet till slutet. Men eftersom det inte finns någon String-variabel för att lagra den returnerade strängen så kommer den att förstöras. Nu indexOf(String s2) metod returnerar indexet för första förekomsten av s2 . Så 4 skrivs ut som s1='JavaLove'. Program 5: Java class Writer { public static void write() { System.out.println('Writing...'); } } class Author extends Writer { public static void write() { System.out.println('Writing book'); } } public class Programmer extends Author { public static void write() { System.out.println('Writing code'); } public static void main(String[] args) { Author a = new Programmer(); a.write(); } } Alternativ: A) Skriva... B) Skriva bok C) Skriva kod D) Kompileringen misslyckas Svar: B) Skrivbok Förklaring: Eftersom statiska metoder inte kan åsidosättas spelar det ingen roll vilket klassobjekt som skapas. Som a är en Författare refererad typ så alltid Författare klassmetoden kallas. Om vi tar bort skriva() metod från Författare klass då Författare klassmetoden kallas som Författare klass sträcker sig Författare klass.