1. Transformación
1.1 clase abstracta
cn.itcast.day10.demo06 paquete; Animal clase abstracta pública { comer public abstract void (); }
1.2 clase Dog
cn.itcast.day10.demo06 paquete; public class Perro extiende Animal { @ Override comer public void () { System.out.println ( "狗吃MIERDA"); } Pública caseta de vigilancia void () { System.out.println ( "狗看家"); } }
Clase 1.3 del gato
Paquete cn.itcast.day10.demo06; Cat public class {Animal extiende la @Override public void EAT () { System.out.println ( "pez gato"); } // método específico subclase catchMouse public void () { el Sistema .out.println ( "gato y el ratón"); } }
1.4 Transformación
cn.itcast.day10.demo06 Pena paquete de; / * transición ascendente debe ser seguro, no hay problema, a la derecha. Pero también hay un lado negativo: el objeto de transición hacia arriba una vez que la clase padre, entonces no se puede llamar una subclase del contenido original único. Solución: abatido con el objeto [reducción]. * / Demo01Main Clase pública { public static void main (String [] args) { // objeto transición hacia arriba, es: las referencias al objeto clase padre. animales Animal = new Cat (); // creado originalmente cuando un gato animal.eat (); // peces gato // animal.catchMouse (); // error de escritura! // abatido, la "restauración" acción CAT Cat = (gato) Animal; cat.catchMouse (); // gato y el ratón // Aquí está abatido mal // hubiera sido nuevo cuando un gato, ahora los perros tienen que asumir // error de escritura! Compilador no se da, pero la operación será anormal: // java.lang.ClassCastException, clase fundido excepción de perro Perro = (perros) animales; } }
1.5 ¿Cómo puede un padre conocer los objetos referenciados, lo que podría haber sido una subclase
cn.itcast.day10.demo06 Pena paquete de; / * ¿Cómo puede saber un padre los objetos referenciados, lo que podría haber sido una subclase? Formato: Objeto Nombre de la clase instanceof Este resultado será un valor booleano, que se determina como los objetos anteriores pueden escribir los siguientes casos. * / Demo02Instanceof Clase pública { void Main (args String []) {public static Animal = nuevo perro nuevo (); // podría haber sido un perro animal.eat (); // perro come MIERDA // Si desea intercambiar con niño los métodos de clase-específicas requieren abatido // determinar qué animal referencia clase padre no originalmente Dog IF (la instanceof perro animal) { perro perro = (perros) animales; dog.watchHouse (); } // determinar qué animal no es originalmente Cat IF (Animal el gato instanceof) { cat = CAT (CAT) Animal; cat.catchMouse (); } GiveMeAPet (nuevo perro ()); } Static public void giveMeAPet (animal Animal) { si (animal instanceof perro) { perro perro = (perros) animales; dog.watchHouse (); } Si (animal instanceof Cat) { cat cat = (Cat) de los animales; cat.catchMouse (); } } }