Java中的多态

目录

1.多态的实现条件

2.向上转型

2.1三种转型方法

2.2.1直接赋值

2.2.2方法的传参

2.2.3方法的返回值

2.2转型之后的运行规则

3.多态的使用


1.多态的实现条件

三个条件:

①必须式继承关系

②子类必须要对父类中的方法进行重写

③向上转型:用父类类型的引用,指向子类的对象

2.向上转型

2.1三种转型方法

2.2.1直接赋值

父类A,子类B

A a=new B(参数);

java 复制代码
//Animal.java
public class Animal {
    String name;
    int age;

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

    public void eat(){
        System.out.println(name+"吃吃吃");
    }
}
//Dog.java
public class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }
    public void bark(){
        System.out.println(name+"汪汪汪");
    }
}
//test.java
public class test {
    public static void main(String[] args) {
    Animal animal=new Dog("xiaohuang",12);
    }
}

2.2.2方法的传参

java 复制代码
public class test {
    public static void fun1(Animal animal){
        animal.eat();
    }
    public static void main(String[] args) {
        Dog dog = new Dog("xiaobai", 23);
        fun1(dog);

2.2.3方法的返回值

java 复制代码
public static Shape method() {
    // 返回子类对象 → 自动向上转型
    return new Circle();
}

2.2转型之后的运行规则

只能调用父类有的成员变量或者方法,如果子类中重写了父类中的方法,虽然调用的还是父类中的方法,但是实际上执行的是子类中的方法

举个例子:

java 复制代码
//Animal.java
public class Animal {
    String name;
    int age;

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

    public void eat(){
        System.out.println(name+"吃吃吃");
    }
}
//Dog.java
public class Dog extends Animal{
    public Dog(String name, int age) {
        super(name, age);
    }
    public void eat(){
        System.out.println(name+"吃狗粮");
    }
}
//test.java
public class test {

    public static void main(String[] args) {
        Animal animal=new Dog("xiaohuang",12);
        animal.eat();
    }
}

执行结果:

而不是xiaohuang吃吃吃

3.多态的使用

多态的使用,可以帮助你省掉大量的if、else语句

例如:

java 复制代码
//Shape.java
public class Shape {
    public void draw(){}
}
//Circle.java
public class Circle extends Shape {
    @Override
    public void draw() {
        super.draw();
        System.out.println("画一个⚪");
    }
}
//Juxing.java
public class Juxing extends Shape{
    @Override
    public void draw() {
        System.out.println("画一个□");
    }
}
//Sanjiaio.java
public class Sanjiao extends Shape{
    @Override
    public void draw() {
        System.out.println("画一个◁");
    }
}
//test.java
public class test {
    public static void main(String[] args) {
        Shape shape1=new Circle();
        Shape shape2=new Sanjiao();
        Shape shape3 =new Juxing();
        shape1.draw();
        shape2.draw();
        shape3.draw();
}

输出结果:

或者:

java 复制代码
public class test {
    public static void main(String[] args) {
Circle circle=new Circle();
        Sanjiao sanjiao=new Sanjiao();
        Juxing juxing=new Juxing();
        Shape[] shapes={circle,circle, sanjiao,juxing};
        for(Shape shape:shapes){
            shape.draw();
        }
    }

输出结果:

相关推荐
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang2 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++