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();
        }
    }

输出结果:

相关推荐
艾莉丝努力练剑21 分钟前
【Qt:问题解决】Qt程序入口点错误修复:MinGW ABI兼容问题
java·服务器·开发语言·qt·文件系统·动静态库
程序员黑豆7 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
wuyk5559 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
hey_sml9 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo9 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖10 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才11 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio11 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖12 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
不老刘13 小时前
【Java入门】Java服务部署方式全景对比:从java -jar到K8s
java·kubernetes·jar