首页 > 其他分享 >Day23:instanceof 和类型转换

Day23:instanceof 和类型转换

时间:2022-11-26 20:35:28浏览次数:51  
标签:instanceof 类型转换 Animals 子类 System Day23 Cat public

多态中的转型

转型

当父类的不能调用子类方法时,我们可以将父类转换成子类,然后就可以调用子类的方法。

转型分为两种:

向上转型:父类引用指向子类对象;

向下转型:父类引用转为子类对象;(强制转换)

转化的格式:

((目标类型)目标变量名).子类方法

我们从代码的形式上对转型进行了解:

class Animals{//父类
  public void play(){
      System.out.println("动物在玩");
}
}
class Cat extends Animals{//子类
    public void eat(){
        System.out.println("猫在吃鱼");
    }
}
public class Application{//测试类
    public class void main(String[] args){
        Animals a=new Cat();
        a.play();
        //a.eat();是调用不了的,多态形式中,方法的编译看左边,执行看右边;父类中没有eat这个方法,自然也就无法调用;
        //此时我们可以将a强制转换成Cat类型则可以进行调用eat方法;
        ((Cat)a).eat();
    }
}
//结果
猫在玩水
猫在吃鱼

引用类型的相互转换与基本类型转换的手法接近:向下转型则需要强制转换;向上转型则是自动转换;

这也就能解释为什么我们的cat对象可以直接变成Animals 类:Animals a=new Cat();

但是引用类型的转换是建立在两个类之间是有继承关系的,也可以说是建立在多态的形式上的!

但是低类型转换为高类型会失去低类型独有的的方法,就像基本数据类型由低到高转换会出现精度丢失的情况。

关于instanceof 的使用

instanceof 在Java语言中的功能是对两者之间是否有继承关系的判断。

我们在引用类型转换前可以通过instanceof来进行两者的判断

格式 : A(对象名) instanceof leiXing(待判断的引用类型)

instanceof的运行机制:

先判断是否能编译,然后再运行

先将A的引用类型与leiXing进行关系判断,若两者类型有继承关系则编译通过,然后再判断A是否为leiXing或者其子类的的实例对象。

让我们在代码中对instanceof 做进一步了解:

class Animals{//父类
  public void play(){
      System.out.println("动物在玩");
}
}
class Cat extends Animals{//子类
    public void play(){
        System.out.println("猫在玩水");
}
    public void eat(){
        System.out.println("猫在吃鱼");
    }
}
public class Application{//测试类
    public class void main(String[] args){
        Animals a=new Cat();
        System.out.println(a instanceof Cat);
        // a的引用类型为Animals,与Cat存在继承关系,编译通过;再判断对象a是否为Cat的实例对象,是,则整个判断下来为true;
        System.out.println(a instanceof Animals);
        // a的引用类型为Animals,编译通过;判断出a是 Animals子类Cat的实例,则整个判断下来为true;
        System.out.println(a instanceof Object);
        // a的引用类型为Animals,与Object存在继承关系,编译通过;判断出a是 Object子类Cat的实例,则整个判断下来为true;
        //System.out.println(a instanceof String);
        // a的引用类型为Animals,与String没有任何关系;编译不通过;
        
    }
}
//结果
true
true
true

标签:instanceof,类型转换,Animals,子类,System,Day23,Cat,public
From: https://www.cnblogs.com/CQliuwei/p/16928243.html

相关文章

  • R 类型转换 和问题
    BaseR单个变量data$x1<-as.numeric(as.character(data$x1))多个变量i<-c(2,3)data[,i]<-apply(data[,i],2,#Specifyownfunctionwithin......
  • JavaScript中类型转换
    原文链接:https://zhuanlan.zhihu.com/p/516440022一、概述前面我们讲到,JS中有六种简单数据类型:undefined、null、boolean、string、number、symbol,以及引用类型:obj......
  • 类型转换
    运算时不同的数据类型转化为同一数据类型再运算。内存溢出问题:超过数据类型的最大容量。inta=10_0000_0000;intb=20;longc=a*(long)b;Sy......
  • SQL Server数据类型转换函数cast()和convert()详解
    https://blog.csdn.net/m0_67401382/article/details/126117592常用的函数有cast()和convert()。cast()和convert()函数比较:(1)cast一般更容易使用,convert的优点是可以格......
  • C语言数据类型转换
    文章目录​​一、自动类型转换​​​​1、操作数中没有浮点型数据时​​​​2、操作数中有浮点型数据时​​​​3、赋值运算符两侧的类型不一致时​​​​4、右值超出左值类......
  • Spring MVC之Converter类型转换器
    SpringMVC框架的Converter<S,T>是一个可以将一种数据类型转换成另一种数据类型的接口,这里S表示源类型,T表示目标类型。开发者在实际应用中使用框架内置的类型转换器基......
  • 多态的概述,优势,类型转换问题
    多态的概述,多态的形式什么是多态同类型的对象,执行同一个行为,会表现出不同的行为特征多态的常见多态中成员访问特点1.方法调用:编译看左边,运行看右边2.变量调用:编译看......
  • day23
    【0020.有效的括号】classSolution{public:boolisValid(strings){stack<char>st1;for(inti=0;i<s.size();i++){if......
  • instanceof和类型转换
    instanceofpackagecom.oop.demo06;publicclassPerson{}//==========================packagecom.oop.demo06;publicclassTeacherextendsPerson{}......
  • Day8-3 instanceof和类型转换
    instanceof和类型转换判断一个对象是什么类型:instanceofxinstanceofy packagecom.oop; ​ importcom.oop.demo06.Person; importcom.oop.demo06.Student; im......