前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础入门之多态和对象类型转换

Java基础入门之多态和对象类型转换

作者头像
Java进阶者
发布2021-01-22 10:45:23
4820
发布2021-01-22 10:45:23
举报
文章被收录于专栏:Java进阶学习交流

前面几篇文章用Java带大家一起了解Java的部分基础知识,感兴趣的小伙伴们可以去学习下了,一篇文章带你了解Java类的设计和封装及类成员的访问控制一篇文章带你了解this关键字和单例模式Java基础入门篇——面向对象和类的定义,这篇文章带大家一起学习下Java知识中的接口及其继承知识,一起来看看吧。

一、多态

1.假设实现一个动物发出的叫声方法,我们知道不同的动物,它们的叫声是不一样的。当在方法中传入一个参数类型,例如猫的叫声、狗的叫声。在同一个方法,当参数不同它们的执行结果各不相同,这就是多态。

2.多态是把子类对象赋给父类引用时,调用重写的方法时,表示的是子类的行为。

3.怎么实现多态例子

代码语言:javascript
复制
//定义接口Fruit
interface Fruit{
    void info();//定义抽象方法info()
}
//定义Cherry类实现Fruit接口
class Cherry implements Fruit{
    double weight=66;//weight属性为重量
    //实现info()方法
    public void info(){
        System.out.println("我是一个樱桃!"+"重量为:"+weight+"g");
  }
}
//定义Apple类实现Fruit接口
class Apple implements Fruit{
    double weight=250;//weight属性为重量
    //实现info()方法
    public void info(){
        System.out.println("我是一个苹果!"+"重量为:"+weight+"g");
  }
}
public class p30 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Fruit f1=new Cherry();//创建Cherry对象,Fruit类型变量f1引用
        Fruit f2=new Apple();//创建Apple对象,Fruit类型变量f2引用
        fruitInfo(f1);//调用fruitInfo()方法,把f1参数传入
        fruitInfo(f2);//调用fruitInfo()方法,把f2参数传入
}
    //定义静态的fruitInfo()方法,接受一个Fruit的参数f
    public static void fruitInfo(Fruit f){
        f.info();
  }
}

运行的结果是:

代码语言:javascript
复制
我是一个樱桃!重量为:66.0g
我是一个苹果!重量为:250.0g

从上面代码中,定义了一个Fruit接口,定义了抽象方法info()。定义Cherry类和Apple类实现Fruit接口,定义变量weight属性和实现info()方法。“Fruit f1=new Cherry()、Fruit f2=new Apple()”实现子类对象赋给父类引用,调用fruitInfo()方法,父类引用了两个子类对象分别传入f1和f2参数。

二、对象类型转换

1.子类对象是可以自动转换成父类。

2.父类转换成子类对象就需要强制转换。

例如:

代码语言:javascript
复制
//定义接口Fruit
interface Fruit{
    void info();//定义抽象方法info()
}
//定义Cherry类实现Fruit接口
class Cherry implements Fruit{
    double weight=66;//weight属性为重量
    //实现info()方法
    public void info(){
        System.out.println("我是一个樱桃!"+"重量为:"+weight+"g");
}
    //定义pro()方法
    void pro(){
        System.out.println("产地:浙江");
  }
}
public class p31 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Fruit f1=new Cherry();//创建Cherry类的实例对象
        fruitInfo(f1);//调用fruitInfo()方法,把f1参数传入
}
    //定义静态方法fruitInfo(),接受一个Fruit参数f
    public static void fruitInfo(Fruit f){
        f.info();//调用传入参数f的info()方法
        f.pro();//调用传入参数f的pro()方法
  }
}

运行的结果是:

从上面可以看出编译出错了,调用fruitInfo()方法传入Cherry对象,方法参数是Fruit类型的,把Cherry的子类当作父类使用导致程序编译出现错误,程序在运行到f.pro()这行代码发现这个方法没有定义。因为传入的是Cherry类,在Cherry类中定义了pro()方法需要强制转换才可以运行,就是把Fruit类型变量强制转换成Cherry类型。

修改后代码如下所示:

代码语言:javascript
复制
//定义静态方法fruitInfo(),接受一个Fruit参数f
    public static void fruitInfo(Fruit f){
        Cherry f1=(Cherry)f;
        f1.info();//调用传入参数f的info()方法
        f1.pro();//调用传入参数f的pro()方法
}

再次运行的结果是:

代码语言:javascript
复制
我是一个樱桃!重量为:66.0g
产地:浙江

三、instanceof关键字

1.instanceof关键字作用

判断一个实例对象是否属于一个类,它的语法如下:

代码语言:javascript
复制
对象 instanceof 类

2.在进行引用类型转换前先使用instanceof关键字判断,例如:

代码语言:javascript
复制
if( f instanceof Cherry){   //如果f指的是Cherry对象类型时,返回的是true。
    Cherry f1=(Cherry)f;
}

四、总结

本文主要介绍了多态、对象类型转换、instanceof关键字。

多态是子类对象赋给父类引用时,调用重写的方法时,表示的是子类的行为。通过怎么实现多态例子帮助理解这个用法。

对象类型转换是子类对象是可以自动转换成父类、父类转换成子类对象就需要强制转换。

instanceof关键字用来判断一个实例对象是否属于一个类,希望大家通过本文的学习,对你有所帮助!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java进阶学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、多态
    • 二、对象类型转换
      • 三、instanceof关键字
        • 四、总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档