public class A { public void whoAmI() { System.out.println("I'm class " + getClass().getSimpleName()); } public static void isInstanceOf(A... args) { A a = args[1]; System.out.println("Metodo isInstanceOf"); System.out.println("\ta instanceof A: " + (a instanceof A)); System.out.println("\ta instanceof B: " + (a instanceof B)); } public static void main(String[] args) { A a = new A(); A ab = new B(); A ac = new C(); A ad = new D(); B b = new D(); System.out.println("Test instanceof"); System.out.println("Oggetto `a`"); System.out.println("\ta instanceof A: " + (a instanceof A)); System.out.println("\ta instanceof B: " + (a instanceof B)); System.out.println("Oggetto `ab`"); System.out.println("\tab instanceof A: " + (ab instanceof A)); System.out.println("\tab instanceof B: " + (ab instanceof B)); System.out.println("Oggetto `ac`"); System.out.println("\tac instanceof A: " + (ac instanceof A)); System.out.println("\tac instanceof C: " + (ac instanceof C)); System.out.println("\tac instanceof B: " + (ac instanceof B)); System.out.println("Oggetto `ad`"); System.out.println("\tad instanceof A: " + (ad instanceof A)); System.out.println("\tad instanceof D: " + (ad instanceof D)); System.out.println("\tad instanceof B: " + (ad instanceof B)); System.out.println("Oggetto `b`"); System.out.println("\tb instanceof A: " + (b instanceof A)); System.out.println("\tb instanceof B: " + (b instanceof B)); // Metodo che accetta tipi differenti, ma compatibili A.isInstanceOf(a, ab, ac, ad, b); System.out.println("Test metodi"); a.whoAmI(); // A -> A ab.whoAmI(); // A -> B ac.whoAmI(); // A -> C ad.whoAmI(); // A -> D b.whoAmI(); // B -> D D d = new D(); b.sayHello(); d.sayHello(); // ab.sayHello(); // Non è possibile richiamare il metodo sayHello (ab è di tipo A) ((B)ab).sayHello(); // Cast 1 B b1 = (B)ab; // Cast 2, b1 è la copia di ab. Quello che accade in b1 accade anche in ab b1.sayHello(); System.out.println("Cast ((B)ab): " + ((B)ab).getDescrizione()); System.out.println("Cast b1: " + b1.getDescrizione()); ((B)ab).setDescrizione("Descrizione con primo esempio di cast"); System.out.println("Cast ((B)ab): " + ((B)ab).getDescrizione()); System.out.println("Cast b2: " + b1.getDescrizione()); b1.setDescrizione("Ora mi chiamo B, secondo sempeio di cast"); System.out.println("Cast ((B)ab): " + ((B)ab).getDescrizione()); System.out.println("Cast b2: " + b1.getDescrizione()); } }