Java入门5(多态)

这篇具有很好参考价值的文章主要介绍了Java入门5(多态)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多态

编译时的多态:方法重载

运行时的多态:动态绑定

多态的三大前提

  1. 类之间要有继承关系
  2. 要出现方法重写
  3. 父类的引用指向了子类的对象

测试样例

// 定义Person类
public class Person {
    public String name;
    public String sex;
    public int age;
    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public void eat(){
        System.out.println("Person => eat()");
    }
}
// 定义Student类,继承Person类
public class Student extends Person{
    public int stuNum;
    public int score;
    public Student(String name, String sex, int age) {
        super(name, sex, age);
    }
    public void study(){
        System.out.println("Student => study()");
    }
	// 重写父类方法
    @Override
    public void eat() {
        System.out.println("Student => eat()");
    }
}
// 测试类(Application)
public class Application {
    public static void main(String[] args) {
        Person robot01 = new Student("robot01","female",18);
        Person robot02 = new Person("robot02","male",18);
        robot01.eat(); // Student => eat()
        robot02.eat(); // Person => eat()
        // robot01.study(),爆红
    }
}

多态的转型

为什么需要转型

​ 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误,也就是说,不能调用子类拥有 而父类没有的方法,编译都错误,更别说运行了,所以,想要调用子类特有的方法,必须做向下转型

向上转型(父类类型 变量名 = 子类对象

​ 多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的,当父类引用指向一个子类对象时,便是向上转型

向下转型(子类类型 变量名 = (子类类型) 父类变量名

​ 父类类型向子类类型向下转换的过程,这个过程是强制的,一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。

// 定义父类Draw
public class Draw {
    public void drawPicture(){
        System.out.println("Draw => draw()");
    }
}
// 定义子类Circle
public class Circle extends Draw{
    // 重写父类方法
    @Override
    public void drawPicture() {
        System.out.println("Circle => DrawCircle()");
    }
    // 子类独有的方法
    public void roll(){
        System.out.println("Circle => roll()");
    }
}
// 测试类
public class Application {
    public static void main(String[] args) {
        // 向上转型
        Draw picture = new Circle();
        // 只能使用被重写的方法
        picture.drawPicture(); // Circle => DrawCircle()
        
        // 向下转型
        Circle circlePic = (Circle)picture;
        // 可以使用子类自己的方法
        picture.drawPicture(); // Circle => DrawCircle()
        circlePic.roll(); // Circle => roll()
    }
}

instance of 运算符

作用:判断左面的对象是否是右面的类的实例,返回值为bool类型文章来源地址https://www.toymoban.com/news/detail-409637.html

// 定义父类Father
public class Father {
    public void say(){
        System.out.println("I'm father!");
    }
}
// 定义接口Eat
public interface Eat {
    public void eat();
}
// 定义子类Son1,继承父类Father以及接口Eat
public class Son1 extends Father implements Eat{
    // 重写父类方法
    @Override
    public void say() {
        System.out.println("I'm son1!");
    }
	// 实现接口方法
    @Override
    public void eat() {
        System.out.println("Son1 => eat()");
    }
}
// 测试类(Application)
public class Application {
    public static void main(String[] args) {
        Father robot01 = new Son1();
        Eat robot02 = new Son1();
        robot01.say(); // I'm son1!
        robot02.eat(); // Son1 => eat()
        System.out.println(robot01 instanceof Father); // true
        System.out.println(robot01 instanceof Son1); // true
        System.out.println(robot02 instanceof Father); // true
        System.out.println(robot02 instanceof Son1); // true
    }
}

多态的好处

  1. 限制类的使用者只能使用父类定义的方法,无法使用子类新定义的方法
  2. 可以扩展数据存储的范围
  3. 可以拓展方法的参数类型和返回值类型

到了这里,关于Java入门5(多态)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(73)
  • python中的类class: 继承、覆盖、重写、重载、扩展、多态、封装

    使用  class  创建类。类中有方法、属性。 1.1 __init__() 函数 类的内置  __init__()  函数。所有类都有一个名为 __init__() 的函数,它在启动类时执行。 使用 __init__() 函数将值赋给对象属性,或者在创建对象时需要执行的其他操作。 每次使用类创建新对象时,都会 自动调

    2024年02月08日
    浏览(49)
  • C++多态与虚拟:运算符重载(Operator Overloading)

    运算符重载: 与function overloading异曲同工的是,C++提供所谓的Operator overloading。所谓operators是像    + (加) - (減) * (乘) / (除) (位右移) (位左移)之类的符号,代表一种动作。 面对operators,我们应该把他想像是一种函数,只不过形式比较特殊罢了。一般函数的参

    2024年04月25日
    浏览(73)
  • java面试基础 -- 方法重载 & 方法重写

    目录 重载 重写           方法的重载是指在同一个类中定义多个方法, 他们具有相同的名称, 但是具有不同的参数列表, 例如:         此处我们看到三个不同参数的, 但是具有相同返回值和方法名的方法. 有如下测试案例: 运行结果为:  我们将其中一个myMethod方法的返回值改

    2024年02月12日
    浏览(51)
  • 【C++篇】OOP下部分:友元、运算符重载与多态

    友情链接:C/C++系列系统学习目录 知识总结顺序参考C Primer Plus(第六版)和谭浩强老师的C程序设计(第五版)等,内容以书中为标准,同时参考其它各类书籍以及优质文章,以至减少知识点上的错误,同时方便本人的基础复习,也希望能帮助到大家   最好的好人,都是犯过

    2024年02月10日
    浏览(32)
  • 关于Java中方法重载和方法重写

    方法重写是子类继承父类(默认继承Object类)后覆盖父类的方法 需要保证同名 同参 同返回值 且访问权限范围不能缩小(publicprotecteddefaultprivate) 方法重载是同类中可以有多个同名但参数不同的方法 调用方法的时候可根据传参情况执行对应的方法 需要注意参数不同可以指参数数量

    2023年04月20日
    浏览(52)
  • Java_方法(重载方法签名等详解)

    在之前我们学习C语言时,当我们想要重复使用某段代码的功能时,我们会将这段代码定义为一个函数,而在java中我们把这段重复使用的代码叫做方法。 类体的内容分为变量的声明和方法的定义,方法的定义包括两部分:方法头和方法体。 // 方法定义 修饰符 返回值类型 方法

    2024年02月20日
    浏览(33)
  • Java-方法重载

    同一个类中,多个方法的名称相同,但是形参列表不同。 同一个类中,方法名称相同、形参列表不同 形参的个数、类型、顺序不同 形参的名称无关 当程序调用一个重载方法时,编译器会根据参数列表的不同自动匹配最合适的方法,这种机制叫做方法重载的“重载解析”。

    2024年02月02日
    浏览(33)
  • Java:方法的重载

    在使用方法的过程中我们可能会遇到以下如同例子的情形: 在计算ret1时我们可以很容易得到结果,但在计算ret2时由于double转换到参数的int会有损失而报错,这里我们一般是再另外写一个方法,然后给两个方法起不同的名字: 这样做我们说确实能解决问题,但不友好的地方是

    2024年02月15日
    浏览(28)
  • C++编译与运行:其一、静态类型和动态类型

    先说结论:编译期间可以明确的类型是静态类型;运行期间才能明确的类型是动态类型。 后半句可能有点不好理解,通俗地说,需要通过执行代码才能明确的类型是动态类型。 假如我们有两个类,分别是基类A,和派生类B。 第一行,编译的时候编译器就知道了,a的类型是

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包