
1 public abstract class Animal {
2
3 public abstract void eat();
4 }
1 public class Cat extends Animal{
2
3 @Override
4 public void eat() {
5 System.out.println("猫吃鱼");
6 }
7
8 public void catchMouse(){
9 System.out.println("猫抓老鼠");
10 }
11 }
1 public class Dog extends Animal{
2 @Override
3 public void eat() {
4 System.out.println("狗是骨头");
5 }
6
7 public void watchHouse(){
8 System.out.println("狗看家");
9 }
10 }
1 /*
2 * 向上转型一定是安全的,正确的,没问题的,但是也有一个弊端:
3 * 对象一旦向上转型为父类,那么就无法调用子类原本特有的内容*/
4 public class Demo01Main {
5
6 public static void main(String[] args) {
7
8 //对象的向上转型,就是: 父类引用指向子类对象
9 Animal animal = new Cat();
10 animal.eat();
11
12 //animal.catchMouse(); //错误写法
13
14 //向下转型,进行"还原"动作
15 Cat cat = (Cat) animal;
16 cat.catchMouse();
17
18 //下面是错误的向下转型
19 //本来new的是一只猫,非要把它当狗
20 //java.lang.ClassCastException 类转换异常
21 Dog dog = (Dog) animal; //错误写法 , 编译不会报错,但是运行有异常
22 }
23 }
1 /*
2 * 如何才能知道一个父类引用的对象,本来是什么子类?
3 *
4 * 格式:
5 * 对象 Instanceof 类名称
6 * 这将得到一个boolean布尔值结果,也就是判断前面的对象能不能当做后面类型的实例*/
7 public class Demo02Instanceof {
8
9 public static void main(String[] args) {
10 Animal animal = new Cat(); //本来是一只猫
11
12 if(animal instanceof Cat){
13 Cat cat = (Cat) animal;
14 cat.catchMouse();
15 }
16 if (animal instanceof Dog){
17 Dog dog = (Dog) animal;
18 dog.watchHouse();
19 }
20
21 giveMeAnPet(new Dog());
22 }
23
24 public static void giveMeAnPet(Animal animal){
25 if(animal instanceof Cat){
26 Cat cat = (Cat) animal;
27 cat.catchMouse();
28 }
29 if (animal instanceof Dog){
30 Dog dog = (Dog) animal;
31 dog.watchHouse();
32 }
33 }
34 }