Java多态中的向上转型与向下转型浅析
烽起黎明 人气:0向上转型
概念明细
【原理】:实际就是创建一个子类对象,将其当成父类对象来使用.
语法格式:父类类型 对象名 = new 子类类型()
Animal animal = new Cat("元宝",2); //animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换
以下是定义的父类Animal类它的两个继承类Cat类和Dog类,分别重写了Animal类的eat()
方法
class Animal{ String name; int age; public Animal(String name, int age) { this.name = name; this.age = age; } public void eat(){ System.out.println(age + "岁的" + name + "正在吃东西"); } } class Cat extends Animal { public Cat(String name, int age) { super(name, age); } @Override public void eat() { System.out.println(age + "岁的" + name + "正在吃猫粮"); } } class Dog extends Animal { public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println(age + "岁的" + name + "正在吃狗粮"); } }
使用场景1:直接赋值
以下这种就是直接赋值类型的向上转型,将子类对象的引用给到父类对象。然后再将这个对象作为参数传递进去,就可以根据不同引用调用不同的行为
public class Test1 { public static void eat(Animal animal) { animal.eat(); } public static void main(String[] args) { Animal animal1 = new Animal("动物",3); Animal animal2 = new Cat("加菲猫",2); Animal animal3 = new Dog("哈士奇",1); eat(animal1); eat(animal2); eat(animal3); } }
使用场景2:
方法传参 第二种方法传参很简单,我们连对象都不需要创建,只需要直接将三种不同对象的引用作为实参传递给到eat()
中的形参接受,就可以产生【向上转型】
public class Test1 { public static void eat(Animal animal) { animal.eat(); } public static void main(String[] args) { eat(new Animal("动物",3)); eat(new Cat("加菲猫",2)); eat(new Dog("哈士奇",1)); } }
使用场景3:
方法返回 第三种便是在一个方法中将不同对象的引用进行返回,然后传递给到父类对象,也可以产生向上转型
public static void eat(Animal animal) { animal.eat(); }
稍微讲一下这个方法,可以看到形参是String
字符类型,在方法中通过判断外界传入进来的字符串然后对应地进行返回
- 若是“猫”就返Cat对象的引用;
- 若是“狗”就返Dog对象的引用;
- 若是其他就返null
public static Animal BuyAnimal(String var) { if(var.equals("猫")){ return new Cat("加菲猫",2); }else if(var.equals("狗")){ return new Dog("哈士奇",1); }else{ return null; } }
Animal animal1 = BuyAnimal("猫"); eat(animal1); Animal animal2 = BuyAnimal("狗"); eat(animal2); Animal animal3 = BuyAnimal("兔"); eat(animal3);
然后可以看到,前两个传入的是【猫】和【狗】,因此执行的便是不同对象的行为,但是在最后传入了【兔】,因此在BuyAnimal()方法中会return null
这就使得传入eat()方法中去调用相关对象的行为时因为不存在这个对象的引用,所以就会产生空指针异常
上述便是向上转型的三种场景。学会辨别和使用即可
向上转型的优缺点
【优点】:让代码实现更简单灵活,这个从上面的三个不同场景就可以看得出来
【缺点】:不能调用到子类特有的方法
加载全部内容