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

输出结果:

相关推荐
NE_STOP2 小时前
Vibe Coding -- 完整项目案例实操
java
荣码2 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing2 小时前
Google第三方授权登录
java·后端·程序员
明月光8183 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑12 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯12 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路16 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还19 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev21 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序1 天前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端