【原理】:实际就是创建一个子类对象,将其当成父类对象来使用.
语法格式:父类类型 对象名 = new 子类类型()
Animal animal = new Cat("元宝",2);
//animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换
复制代码
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 + "正在吃狗粮");
}
}
复制代码
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);
}
}
复制代码
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));
}
}
复制代码
public static void eat(Animal animal)
{
animal.eat();
}
复制代码
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);
复制代码
上述便是向上转型的三种场景。学会辨别和使用即可
【优点】:让代码实现更简单灵活,这个从上面的三个不同场景就可以看得出来 【缺点】:不能调用到子类特有的方法
class Dog extends Animal {
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println(age + "岁的" + name + "正在吃狗粮");
}
public void lookdoor(){
System.out.println(name + "在看门");
}
}
复制代码
【注意事项】
接下去我们来讲讲向下转型,这种类型的转化不太安全,如果没有特殊需求,不建议使用
Animal animal1 = new Dog("哈士奇",1);
animal1.eat();
//animal1.lookdoor();
Dog dog = (Dog) animal1;
dog.lookdoor();
复制代码
那为什么说向下转型不安全呢,因为它存在安全隐患
Animal animal1 = new Cat("加菲猫",2);
animal1.eat();
//animal1.lookdoor();
Dog dog = (Dog) animal1;
dog.lookdoor();
复制代码
向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。 Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换
Animal animal1 = new Cat("加菲猫",2);
animal1.eat();
//animal1.lookdoor();
if(animal1 instanceof Dog){ //判断一下animal1是否获取到了Dog类的引用
Dog dog = (Dog) animal1;
dog.lookdoor();
}
复制代码
如果对instance关键字感兴趣的可以看看官方的文档 ——> instanceof关键字
可能在上面这一系列说来有点难分辨,我们再来对比看看
来总结一下本文所学到的内容
原文链接:https://juejin.cn/post/7205406121678225445
页面更新:2024-03-08
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号