import java.util.HashSet; class Hund { private String namn; public Hund(String namn) { this.namn = namn; } public String toString() { return "Hunden " + namn; } } // Hund class Hundras { protected final String namn; public Hundras(String namn) { this.namn = namn; } // Hitta felet: // public Hundras(String name) { this.namn = namn; } public String toString() { return "Hundrasen " + namn; } public int compareTo(Object o) { Hundras rhs = (Hundras)o; return this.namn.compareTo(rhs.namn); } public boolean equals (Object o) { if (!(o instanceof Hundras)) return false; Hundras rhs = (Hundras)o; return this.namn == rhs.namn; } } // Hundras class Hundras2 extends Hundras { public Hundras2(String namn) { super(namn); } public boolean equals (Object o) { if (!(o instanceof Hundras)) return false; Hundras rhs = (Hundras)o; return this.namn.equals(rhs.namn); } } // Hundras2 class Hundras3 extends Hundras2 { public Hundras3(String namn) { super(namn); } public int hashCode() { return 42; } } // Hundras2 public class Metodtest { public static void main(String[] args) { // Skapa två hundar och skriv ut dem Hund buster = new Hund("Buster"); Hund pluto = new Hund("Pluto"); System.out.println("pluto: " + pluto); System.out.println("buster: " + buster); // Prova "=="-operatorn på hundarna System.out.println("buster == buster: " + (buster == buster)); System.out.println("buster == pluto: " + (buster == pluto)); // Skapa fler hundar och skriv ut dem Hund fido1 = new Hund("Fido"); Hund fido2 = new Hund("Fido"); Hund fido3 = fido2; System.out.println("fido1: " + fido1); System.out.println("fido2: " + fido2); System.out.println("fido3: " + fido3); // Prova "=="-operatorn på hundarna System.out.println("buster == fido1: " + (buster == fido1)); System.out.println("fido1 == fido2: " + (fido1 == fido2)); System.out.println("fido2 == fido3: " + (fido2 == fido3)); System.out.println("buster == new Hund(\"Buster\"): " + (buster == new Hund("Buster"))); System.out.println("new Hund(\"Karo\") == new Hund(\"Karo\"): " + (new Hund("Karo") == new Hund("Karo"))); // Slutsats: En Hund-instans är bara "==" med sig själv // Nu ska vi prova "equals"-metoden på samma hundar System.out.println("buster.equals(buster): " + buster.equals(buster)); System.out.println("buster.equals(pluto): " + buster.equals(pluto)); System.out.println("fido1.equals(fido1): " + fido1.equals(fido1)); System.out.println("fido1.equals(fido2): " + fido1.equals(fido2)); System.out.println("fido2.equals(fido3): " + fido2.equals(fido3)); // Slutsats: En Hund-instans är bara "equals" med sig själv // Nu ska vi prova "<"-operatorn och "compareTo"-metoden på hundarna // System.out.println("buster < pluto: " + (buster < pluto)); // Ger kompileringsfel: // Metodtest.java:56: operator < cannot be applied to Hund,Hund // System.out.println("buster.compareTo(pluto): " + (buster.compareTo(pluto))); // Ger kompileringsfel: // Metodtest.java:81: cannot resolve symbol // symbol : method compareTo (Hund) // Slutsats: Man kan inte alls storleksjämföra hundar // Klassen "Hundras" har en "equals"-metod och en "compareTo"-metod Hundras pudel = new Hundras("pudel"); Hundras pitbull = new Hundras("pitbull"); // Nu ska vi prova "=="-operatorn på några hundraser System.out.println("pudel: " + pudel); System.out.println("pitbull: " + pitbull); System.out.println("pudel == pudel: " + (pudel == pudel)); System.out.println("pudel == pitbull: " + (pudel == pitbull)); Hundras schäfer1 = new Hundras("schäfer"); Hundras schäfer2 = new Hundras("schäfer"); System.out.println("pudel == schäfer1: " + (pudel == schäfer1)); System.out.println("schäfer1 == schäfer2: " + (schäfer1 == schäfer2)); // Slutsats: Även en Hundras-instans är bara "==" med sig själv // Nu ska vi prova "equals"-metoden på samma hundraser System.out.println("pudel.equals(pudel): " + pudel.equals(pudel)); System.out.println("pudel.equals(pitbull): " + pudel.equals(pitbull)); System.out.println("schäfer1.equals(schäfer1): " + schäfer1.equals(schäfer1)); System.out.println("schäfer1.equals(schäfer2): " + schäfer1.equals(schäfer2)); // Slutsats: En Hundras-instans är "equals" med sig själv, // och med alla andra Hundras-instanser som har samma "namn" // Nu ska vi prova "<"-operatorn och "compareTo"-metoden på hundraserna // System.out.println("pudel < pitbull: " + (pudel < pitbull)); // Ger kompileringsfel: // Metodtest.java:142: operator < cannot be applied to Hundras,Hundras System.out.println("pudel.compareTo(pitbull): " + (pudel.compareTo(pitbull))); System.out.println("schäfer1.compareTo(schäfer2): " + (schäfer1.compareTo(schäfer2))); // System.out.println("pudel.compareTo(pluto): " + (pudel.compareTo(pluto))); // Ett undantag kastas: // Exception in thread "main" java.lang.ClassCastException // at Hundras.compareTo(Metodtest.java:22) // at Metodtest.main(Metodtest.java:146) // Men hallå där! SAMMA namn? Är "equals"-metoden verkligen rätt? Hundras labrador1 = new Hundras(new String("Labrador")); Hundras labrador2 = new Hundras(new String("Labrador")); System.out.println("labrador1 == labrador2: " + (labrador1 == labrador2)); System.out.println("labrador1.equals(labrador2): " + labrador1.equals(labrador2)); // Kolla om det blev bättre med "equals" i st f "==" i "compareTo" labrador1 = new Hundras2(new String("Labrador")); labrador2 = new Hundras2(new String("Labrador")); System.out.println("labrador1 == labrador2: " + (labrador1 == labrador2)); System.out.println("labrador1.equals(labrador2): " + labrador1.equals(labrador2)); // Prova det där med hashCode HashSet hundraser = new HashSet(); hundraser.add(labrador1); System.out.println("hundraser.contains(labrador1): " + hundraser.contains(labrador1)); System.out.println("hundraser.contains(labrador2): " + hundraser.contains(labrador2)); // Kolla om det blev bättre med en "hashCode"-metod hundraser.remove(labrador1); labrador1 = new Hundras3(new String("Labrador")); labrador2 = new Hundras3(new String("Labrador")); hundraser.add(labrador1); System.out.println("hundraser.contains(labrador1): " + hundraser.contains(labrador1)); System.out.println("hundraser.contains(labrador2): " + hundraser.contains(labrador2)); // Slutsats: Om man gör en egen "equals", // ska man också göra en egen "hashCode" } // main } // Metodtest