当前位置: 首页 > article >正文

多态语法详解

多态语法详解

  • 一:概念
    • 1:多态实现条件
  • 二:重写:
  • 三:向上转型和向下转型
    • 1:向上转型:
      • 1:直接赋值:
      • 2:方法传参
      • 3:返回值
    • 2:向下转型

一:概念

1:同一个引用,调用了同一个方法,因为引用的对象不一样,所表现出来的行为也不一样。

1:多态实现条件

1:必须在继承体系下;
2:子类必须对父类中的方法进行重写;
3:通过父类引用调用重写的方法;

二:重写:

重写也称覆盖。重写是子类对父类非静态,非private,非final修饰,非构造方法等的实现过程进行重新编写。
重写规则
1:方法名,参数列表(参数类型,个数,顺序),返回类型都要相同,(返回类型可以构成父子类关系)。
2:子类重写父类同名的方法时,子类方法的访问权限要大于父类的。
3:当在父类的构造方法中,调用了子类和父类同名的方法时,此时会调用子类的方法。
提醒: 不要在构造方法中调用重写的方法。

class Person{
    public String name;
    public int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        fun();
    }

    public void fun(){
        System.out.println("父类的fun()方法");
    }
}
class Student extends Person{
    public Student(String name, int age) {
        super(name, age);
    }
    public void fun(){
        System.out.println("子类的fun()方法");
    }
}
public class Test {
    public static void main(String[] args) {
        Student student=new Student("张三",20);

    }
}

在这里插入图片描述4:父类方法被static ,final,private修饰不能重写

三:向上转型和向下转型

1:向上转型:

子类对象给到了父类对象,也可以理解为:父类引用引用的是子类对象,通过父类的引用去调用父类和子类同名的方法,不过调用的是子类的方法。(也叫作动态绑定)

1:直接赋值:

class Animal{
    private String name;
    private int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println(this.age+"在吃饭");
    }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃狗粮");
    }
}
public class Test {
    public static void main(String[] args) {
        Animal animal=new Dog("旺财",3);//父类引用引用了子类对象
        animal.eat();//通过父类引用访问了和父类同名的子类方法,

    }
}


在这里插入图片描述

2:方法传参

class Animal{
    private String name;
    private int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println(this.age+"在吃饭");
    }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃狗粮");
    }
}
class Cat extends Animal{

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃猫粮");
    }
}
public class Test {
    public static void fun(Animal animal){
        animal.eat();//同一个引用,引用了同一个方法,因为引用的对象不一样,所表现出来的行为不一样,我们把这种思想叫做多态
    }
    public static void main(String[] args) {
      Dog dog=new Dog("旺财",3);
      fun(dog);
      fun(new Cat("喵喵",2));

    }
}

在这里插入图片描述

3:返回值

作返回值,返回任意子类对象

class Animal{
    private String name;
    private int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println(this.age+"在吃饭");
    }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃狗粮");
    }
}
class Cat extends Animal{

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃猫粮");
    }
}
public class Test {
    public static Animal fun(){
        return new Dog("旺财",3);
    }
    public static void main(String[] args) {
      Animal animal=fun();
      animal.eat();

    }
}

2:向下转型

将一个子类对象经过向上转型后当成父类方法使用,再也无法调用子类特有的方法,

class Animal{
    private String name;
    private int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println(this.age+"在吃饭");
    }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃狗粮");
    }
}
class Cat extends Animal{

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃猫粮");
    }
    public void barks(){
        System.out.println(this.getName()+"摇尾巴");
    }
}
public class Test {

    public static void main(String[] args) {
     Animal animal =new Dog("旺财",3);
     animal.barks();
    }
}

在这里插入图片描述

但有时需要调用子类特有的方法,此时:将父类引用在还原为子类对象,也就是向下转型。

class Animal{
    private String name;
    private int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println(this.age+"在吃饭");
    }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }
    public void barks(){
        System.out.println(this.getName()+"摇尾巴");
    }
    @Override
    public void eat() {
        System.out.println(this.getName()+"吃狗粮");
    }
}
class Cat extends Animal{

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃猫粮");
    }

}
public class Test {

    public static void main(String[] args) {
        Dog dog=new Dog("旺财" ,2);
        Animal animal =dog;
        dog=**(Dog)** animal;
        dog.barks();

    }
}

在这里插入图片描述向下转型用的比较少,而且不完全,万一转换失败,运行时就会抛出异常,Java中为了提高向下转型的安全性,引入了instance,如果表达式为true,则可以安全转换。

class Animal{
    private String name;
    private int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println(this.age+"在吃饭");
    }
}
class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }
    public void barks(){
        System.out.println(this.getName()+"摇尾巴");
    }
    @Override
    public void eat() {
        System.out.println(this.getName()+"吃狗粮");
    }
}
class Cat extends Animal{

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.getName()+"吃猫粮");
    }

}
public class Test {

    public static void main(String[] args) {
        Animal animal = new Dog("旺财", 3);
       
        if (animal instanceof Dog) {
            Dog dog = (Dog) animal;
             ((Dog) animal).barks();
        }


    }
}

在这里插入图片描述


http://www.kler.cn/a/135502.html

相关文章:

  • 单例模式详解:如何优雅地实现线程安全的单例
  • LLM之模型评估:情感评估/EQ评估/幻觉评估等
  • 案例精选 | 河北省某检察院安全运营中异构日志数据融合的实践探索
  • 羊城杯2020Easyphp
  • 吾店云介绍 – 中国人的WordPress独立站和商城系统平台
  • 招聘app开发,人才招聘、求职首要方式
  • URAT串口通信协议
  • 05_常用API
  • MIB 6.1810操作系统实验:准备工作(Tools Used in 6.1810)
  • Flink(七)【输出算子(Sink)】
  • opencv(5): 滤波器
  • 四旋翼无人机的飞行原理--【其利天下分享】
  • ES6中实现继承
  • 基于变形卷积和注意机制的带钢表面缺陷快速检测网络DCAM-Net(论文阅读笔记)
  • 开源与闭源软件的辩论:对大模型技术发展的影响
  • 基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码
  • 常见的面试算法题:阶乘、回文、斐波那契数列
  • 【数据结构】树与二叉树(廿一):树和森林的遍历——先根遍历(递归算法PreOrder、非递归算法NPO)
  • Redis内存满了会宕机吗
  • 【Python百宝箱】掌握Python Web开发三剑客:Flask、Django、FastAPI一网打尽
  • 【Django-DRF用法】多年积累md笔记,第(4)篇:Django-DRF反序列化详解
  • Ubuntu 18.04/20.04 LTS 操作系统设置静态DNS
  • Hive常见的面试题(十二道)
  • 【JS】Chapter13-构造函数数据常用函数
  • 【python基础】类详解:如何编写类、__init__()、修改实例属性、类存储到模块并导入、py标准库、编写类的约定
  • STM32硬件调试器不一定准确,proteus不一定准确