Java面向对象之多态

Java面向对象之多态

Java是一门面向对象的编程语言,其中最重要的特性之一就是多态。多态是指同一个方法或者同一个类,在不同的时间、不同的对象上具有不同的表现形式。下面我们来仔细分析Java中的多态。

引言

Java的多态性分为静态多态和动态多态。

静态多态性是指在编译期就可以确定方法的调用对象,也就是说,在程序编译时已经确定了将要调用的方法。在Java中静态多态性可以通过方法的重载来实现。

动态多态性是指在运行期根据对象的实际类型决定要调用的方法。在Java中动态多态性可以通过方法的重写和接口来实现。

方法的重载

方法的重载是指在同一个类中定义两个或者多个具有相同名称但是参数不同的方法。编译器会根据传入的参数类型来选择正确的方法执行。

举个例子,假设我们有一个Calculator类,它有两个“add”方法,一个是int类型的,另一个是double类型的:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }
}

当我们使用Calculator类的时候,编译器会根据我们传入的参数类型来选择正确的方法。例如:

Calculator calculator = new Calculator();
int sum1 = calculator.add(1, 2);
double sum2 = calculator.add(1.0, 2.0);

在这个例子中,第一次调用“add”方法是传入了两个int类型的参数,因此编译器会自动选择第一个重载方法。第二次调用是传入了两个double类型的参数,因此编译器会自动选择第二个重载方法。

方法的重写

方法的重写是指在子类中覆盖父类中的同名方法。当子类的对象调用该方法时,会优先调用子类的方法。

举个例子,我们有一个Animal类和一个Dog类,Dog类是Animal类的子类。在Animal类中有一个“makeSound”方法,在Dog类中也有同名方法:

public class Animal {
    public void makeSound() {
        System.out.println("这是一个动物!");
    }
}

public class Dog extends Animal {
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

当我们创建一个Dog对象并且调用“makeSound”方法时,实际上会优先调用Dog类中的方法而不是Animal类中的方法:

Dog dog = new Dog();
dog.makeSound(); // 输出:"汪汪汪"

接口

接口是一种特殊的类,它只包含方法声明而没有方法实现。在Java中,一个类可以实现一个或多个接口,从而获得接口中声明的方法。

举个例子,我们有一个Animal接口和一个Dog类,Dog类实现了Animal接口,因此必须实现Animal接口中声明的所有方法:

public interface Animal {
    void makeSound();
}

public class Dog implements Animal {
    public void makeSound() {
        System.out.println("汪汪汪");
   }
}

当我们创建一个Dog对象并且调用“makeSound”方法时,实际上会调用Dog类中实现的makeSound方法:

Dog dog = new Dog();
dog.makeSound(); // 输出:"汪汪汪"

示例

下面通过两个例子来更好地理解Java中的多态性。

例子1

首先我们先创建一个Animal接口:

public interface Animal {
    public void makeSound();
}

然后我们创建一个Dog类实现Animal接口:

public class Dog implements Animal {
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

接着我们创建一个Cat类实现Animal接口:

public class Cat implements Animal {
    public void makeSound() {
        System.out.println("喵喵喵");
    }
}

最后我们创建一个AnimalSound类来调用“makeSound”方法:

public class AnimalSound {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.makeSound();
        animal = new Cat();
        animal.makeSound();
    }
}

在这个例子中,我们先创建了一个Dog对象并且将其转化为Animal类型。当我们调用“makeSound”方法时,实际上会调用Dog类中实现的makeSound方法。

接着我们创建一个Cat对象并且将其转化为Animal类型,同样调用“makeSound”方法时,实际上会调用Cat类中实现的makeSound方法。

例子2

再来看一个例子,我们先创建一个Shape类:

public abstract class Shape {
    public abstract void draw();
}

然后我们创建两个子类Circle和Rectangle:

public class Circle extends Shape {
    public void draw() {
        System.out.println("画一个圆形");
    }
}

public class Rectangle extends Shape {
    public void draw() {
        System.out.println("画一个矩形");
   }
}

最后我们创建一个ShapeDrawing类来调用“draw”方法:

public class ShapeDrawing {
    public static void main(String[] args) {
        Shape shape = new Circle();
        shape.draw();
        shape = new Rectangle();
        shape.draw();
    }
}

在这个例子中,我们先创建了一个Circle对象并且将其转化为Shape类型。当我们调用“draw”方法时,实际上会调用Circle类中实现的draw方法。

接着我们创建一个Rectangle对象并且将其转化为Shape类型,同样调用“draw”方法时,实际上会调用Rectangle类中实现的draw方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java面向对象之多态 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • hystrix配置中Apollo与Archaius对比分析

    下面是关于“hystrix配置中Apollo与Archaius对比分析”的完整攻略。 1. 什么是Hystrix Hystrix是一个库,用于隔离远程系统,服务或第三方库,防止它们故障并使自己的应用程序保持连续性,并实现弹性、弹性、监控和回退机制。 2. Hystrix中的配置管理 在Hystrix中,除了默认的配置外,大多数配置都可以在运行时进行更改。Hy…

    Java 2023年6月15日
    00
  • Struts1简介和入门_动力节点Java学院整理

    Struts1简介和入门攻略 什么是Struts1 Struts1是一个基于MVC设计模式的开源Web应用框架,可以快速构建基于Java EE的Web应用程序。它的主要组成部分包括Action、Form、Configuration、RequestProcessor等。 Struts1的优点 开源免费,社区支持活跃 遵循MVC设计模式,易于维护和扩展 可以快速…

    Java 2023年5月20日
    00
  • SpringBoot 项目瘦身maven/gradle详解

    SpringBoot 项目瘦身 maven/gradle 详解 简介 对于使用 Maven 和 Gradle 构建的 Spring Boot 项目,在打包成 jar 或 war 文件时可能会比较大,占用过多的磁盘空间和运行内存。因此,我们需要对项目进行瘦身,减少不必要的依赖和文件。 本篇文章旨在介绍 Maven 和 Gradle 的瘦身方法,并提供两个示例以…

    Java 2023年6月2日
    00
  • Jackson的用法实例分析

    Jackson的用法实例分析 本文将介绍Jackson在Java中的用法实例,包括POM文件的配置、解析JSON字符串和生成JSON字符串。 POM文件配置 为了使用Jackson,需要在项目的POM文件中添加以下依赖项: <dependency> <groupId>com.fasterxml.jackson.core</gro…

    Java 2023年5月26日
    00
  • JVM内置函数Intrinsics介绍

    关于“JVM内置函数Intrinsics介绍”的完整攻略,我会从以下几个方面进行讲解: Intrinsics是什么以及作用 Intrinsics的分类 Intrinsics的使用 示例说明 Intrinsics是什么以及作用 Intrinsics(内置函数)是一种Java虚拟机的内部实现机制。在编写Java代码时,我们有时会使用一些高性能的代码段,如数学运算…

    Java 2023年5月26日
    00
  • 什么是JVM参数?

    JVM参数是用于控制JVM行为的命令行参数。JVM参数可以分为两大类:标准参数和非标准参数。 标准参数 标准参数指的是JVM规范中定义的参数,它们可以在所有的JVM实现中使用。以下是一些常见的标准参数。 -Xmx 用于设置JVM最大可用内存大小。例如,以下命令行将JVM最大内存设置为2G: java -Xmx2g MyApp -Xms 用于设置JVM初始内存…

    Java 2023年5月10日
    00
  • Spring Boot 文件上传与下载的示例代码

    下面是 “Spring Boot 文件上传与下载的示例代码”的完整攻略,包含了两条示例。 Spring Boot 文件上传与下载的示例代码 文件上传 1. 准备工作 在pom.xml中添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <art…

    Java 2023年5月19日
    00
  • java 非常好用的反射框架Reflections介绍

    Java 反射框架 Reflections 介绍 什么是 Reflections Reflections 是一个非常好用的 Java 反射框架,可以用于查找和获取 Java 类中的注解、方法、属性等信息。通过 Reflections 可以方便地实现自动化扫描和创建组件、注册 Bean 等功能。 Reflections 的使用方法 使用 Reflections…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部