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

输出结果:

相关推荐
nice_lcj52023 分钟前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河661 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
SL_staff2 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A2 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
文丑颜不良啊3 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊3 小时前
LeetCode2001~2020题目解析
java·leetcode
用户3721574261353 小时前
Java 批量提取 Word 文档中的图片并保存到本地
java
SL_staff4 小时前
BI项目失败率90%?JVS如何用三阶闭环构建可落地的数据生产力平台
java·开源·全栈
nice_lcj5205 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐5 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang