Sværhedsgrad: Mellem Forudsig output fra følgende Java-programmer. 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(); } } Valgmuligheder: A) 20 B) 100 C) 1000 D) 2 Svar: A) 20 Forklaring: Her er klasseinstansvariablen navn(antal) den samme som calc() metode lokal variabel navn(antal). Så for at henvise til klasseforekomstvariabel fra calc() metode denne søgeord er brugt. Så i statement dette.tal = antal * 10 i en repræsenterer den lokale variabel for metoden, hvis værdi er 2 og dette.num repræsenterer klasseinstansvariabel, hvis startværdi er 100. Nu i printNum() metode, da den ikke har nogen lokal variabel, hvis navn er det samme som klasseforekomstvariabel, så vi direkte kan bruge i en at referere instansvariabel selvom dette.num kan bruges. 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; } } Valgmuligheder: A) Outputtet er sandt, og MyStuff opfylder Object.equals()-kontrakten. B) Outputtet er falsk, og MyStuff opfylder Object.equals()-kontrakten. C) Outputtet er sandt, og MyStuff opfylder IKKE Object.equals()-kontrakten. D) Outputtet er falsk, og MyStuff opfylder IKKE Object.equals()-kontrakten. Svar: C) Outputtet er sandt, og MyStuff opfylder IKKE Object.equals()-kontrakten. Forklaring: Som er lig med (Objekt obj) metode i objektklassen sammenligner to objekter på basis af ækvivalensrelation. Men her bekræfter vi bare, at objektet er null eller ej, så det opfylder ikke Object.equals() kontrakt. Som m1 er ikke null sand vil blive udskrevet. 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(); } } Valgmuligheder: 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 Forklaring: Udtalelsen ny Beta().go() udføres i to faser. I første fase Beta klasse konstruktør kaldes. Der er intet instansmedlem til stede i Beta klasse. Så nu Beta klassekonstruktør udføres. Som Beta klasse strækker sig Alfa klasse så opkald går til Alfa klasse konstruktør som første sætning som standard (sat af compileren) er super() i Beta klasse konstruktør. Nu som én instansvariabel( type ) er til stede i Alfa klasse, så den får hukommelse og nu Alfa klassekonstruktør udføres, kald derefter tilbage til Beta klassekonstruktør næste udsagn. Så alfa beta er udskrevet. I anden fase gå() metode kaldes på dette objekt. Da der kun er én variabel( type ) i det objekt, hvis værdi er -en . Så det bliver ændret til b og trykt to gange. De super nøgleord her nytter ikke noget. 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); } } Valgmuligheder: A) -1 B) 3 C) 4 D) A StringIndexOutOfBoundsException kastes under kørsel. Svar: C) 4 Forklaring: append(String str) metodesammenkæd str til s1 . De understreng (int index) metode returnerer strengen fra det givne indeks til slutningen. Men da der ikke er nogen strengvariabel til at gemme den returnerede streng, så vil den blive ødelagt. Nu indexOf(String s2) metode returnere indekset for første forekomst af s2 . Så 4 udskrives 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(); } } Valgmuligheder: A) Skrivning... B) Skrivning af bog C) Skrivning af kode D) Kompilering mislykkes Svar: B) Skrivebog Forklaring: Da statiske metoder ikke kan tilsidesættes, er det lige meget hvilket klasseobjekt der oprettes. Som -en er en Forfatter refererede type så altid Forfatter klasse metode kaldes. Hvis vi fjerner skrive() metode fra Forfatter klasse så Forfatter klasse metode kaldes som Forfatter klasse strækker sig Forfatter klasse.