java 多态与抽象类详解总结

Java多态与抽象类详解总结

多态和抽象类是Java中重要的概念,在程序设计中经常被使用。这个总结将介绍Java中多态和抽象类的实现机制和使用场景。

多态

多态是指一个对象可以通过多种方式进行引用。Java中多态实现的机制是方法重写(override)和方法重载(overload)。

方法重写(Override)

当子类继承父类时,如果子类需要重写父类中的方法(方法名、返回值类型、参数列表都相同),则可以在子类中使用@Override注解重写父类方法,并在子类中实现不同的逻辑,实现多态。

示例一:

class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.eat(); // 输出"猫吃鱼"
    }
}

在这个示例中,Cat类继承了Animal类,并重写了eat()方法。在Main类中,用Animal类类型的变量来引用Cat类的实例对象,利用方法重写实现了多态。

方法重载(Overload)

方法重载是指一个类中可以有多个同名方法,但是它们的参数列表不同。方法重载可以实现不同的逻辑方法,实现多态。

示例二:

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

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

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        System.out.println(calculator.add(1, 2)); // 输出3
        System.out.println(calculator.add(1.2, 2.3)); // 输出3.5
    }
}

在这个示例中,Calculator类中有两个同名方法add(),但是参数不同,一个是int类型,返回值是int类型,另一个是double类型,返回值是double类型。在Main类中,分别使用这两个方法,利用方法重载实现了多态。

抽象类

抽象类是指不能被实例化的类,它可以用来实现多态、封装和模板方法。

如何实现

当一个类中存在抽象方法时,这个类也必须是抽象类。抽象方法是指没有具体实现的方法,只有方法签名。子类必须实现抽象方法才能被使用。

标记一个类为抽象类需要使用abstract关键字。抽象类可以有普通方法,也可以有成员变量。

示例三:

abstract class Person {
    public abstract void eat();
}

class Student extends Person {
    @Override
    public void eat() {
        System.out.println("学生在吃饭");
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Student();
        person.eat(); // 输出"学生在吃饭"
    }
}

在这个示例中,Person类是一个抽象类,它只有一个抽象方法eat(),没有具体实现。Student类继承Person类,并实现了eat()方法。在Main类中,使用Person类类型的变量来引用Student类的实例对象,实现了多态。

封装

抽象类还可以实现数据封装。抽象类中的成员变量和方法可以设置不同的访问修饰符,实现不同的访问权限控制,达到数据封装的效果。

示例四:

abstract class Shape {
    protected int x;
    protected int y;

    public Shape(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public abstract void draw();  // 抽象方法

}

class Circle extends Shape {
    protected int r;

    public Circle(int x, int y, int r) {
        super(x, y);
        this.r = r;
    }

    @Override
    public void draw() {
        System.out.println("圆形的半径是:" + r);
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(0, 0, 5);
        circle.draw(); // 输出"圆形的半径是:5"
        System.out.println("圆心坐标为:(" + circle.x + ", " + circle.y + ")");
    }
}

在这个示例中,Shape类是一个抽象类,它有两个成员变量x和y,分别表示图形的横坐标和纵坐标。成员变量x和y的访问修饰符是protected,表示它们在子类中可以访问,但是在其他地方不能直接访问,达到了数据封装的效果。

Circle类继承Shape类,使用super(x, y)调用Shape类的构造方法来初始化x和y,Circle类还有一个成员变量r,表示圆形的半径。Circle类实现了draw()方法,输出圆形的半径。

在Main类中,创建一个Circle类的实例对象,调用draw()方法输出圆形的半径,同时输出圆形的圆心坐标,由于x和y是被protected修饰的成员变量,在Main类中不能直接调用,只能通过Circle类或者Shape类的子类来调用。

模板方法

抽象类还可以实现模板方法模式。模板方法模式是指在抽象类中定义一个操作中的算法骨架,其中的某些步骤可以由具体子类来实现。在模板方法中,用抽象方法定义了一些基本操作的步骤,具体操作由子类实现。

示例五:

abstract class AbstractCalculator {
    public final int sum(int[] numbers) {
        int sum = 0;
        for (int i : numbers) {
            sum += i;
        }
        return getResult(sum);
    }

    public abstract int getResult(int sum);
}

class Adding extends AbstractCalculator {
    @Override
    public int getResult(int sum) {
        return sum;
    }
}

class Subtraction extends AbstractCalculator {
    @Override
    public int getResult(int sum) {
        return -sum;
    }
}

public class Main {
    public static void main(String[] args) {
        AbstractCalculator calculator;
        int[] numbers = {1, 2, 3, 4, 5};
        calculator = new Adding();
        System.out.println("Adding模板计算结果为:" + calculator.sum(numbers)); // 输出"Adding模板计算结果为:15"
        calculator = new Subtraction();
        System.out.println("Subtraction模板计算结果为:" + calculator.sum(numbers)); // 输出"Subtraction模板计算结果为:-15"
    }
}

在这个示例中,AbstractCalculator类是一个抽象类,它有一个sum()方法,接收一个整型数组作为参数,计算数组中所有元素的和,并将结果传递到getResult()方法中,由子类来实现具体的操作,抽象方法getResult()定义了基本操作的步骤,由具体子类来实现操作逻辑。

Adding和Subtraction类继承AbstractCalculator类,并重写getResult()方法,具体实现加法和减法操作。在Main类中,分别使用Adding类和Subtraction类,调用其sum()方法计算数组中所有元素的和,并输出计算结果。

总结

多态实现的基本机制是方法重写和方法重载,可以同时使用。

抽象类是一种特殊的类,不能被实例化,可以实现多态、封装和模板方法。

多态和抽象类是Java中重要的概念,在程序设计中经常被使用。程序员必须对多态和抽象类有深入的理解,才能写出可读性好、维护性高的代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 多态与抽象类详解总结 - Python技术站

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

相关文章

  • Spring boot整合jsp和tiles模板示例

    当使用Spring Boot时,整合JSP和Tiles模板是非常简单的。下面是整合的完整攻略: 步骤1: 新建Spring Boot项目 首先,你需要创建一个新的Spring Boot项目。你可以在Spring Boot官网中创建一个新项目或者在Eclipse、IntelliJ IDEA等IDE中创建一个新的Spring Boot项目。 步骤2:配置pom.…

    Java 2023年6月15日
    00
  • Java 读取文件方法大全

    Java 读取文件方法大全 在Java中,读取文件是一个非常基础的操作,也是开发中经常用到的操作之一。本文将提供多种Java读取文件的方法,以供读者参考。 1. 使用 BufferedReader import java.io.*; public class ReadFromFile { public static void main(String[] ar…

    Java 2023年5月20日
    00
  • JAVA十大排序算法之归并排序详解

    JAVA十大排序算法之归并排序详解 一、概述 归并排序是一种高效稳定的排序算法,它将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将有序的子序列合并成整体有序的序列。由于归并排序是基于比较的排序算法,因此时间复杂度为 O(nlogn)。 二、算法流程 归并排序算法分为两个过程:分治和合并。 分治:将待排序的序列平分成两个子序列,对左右两个子序列分…

    Java 2023年5月26日
    00
  • 全面解析Java支持的数据类型及Java的常量和变量类型

    全面解析Java支持的数据类型及Java的常量和变量类型 Java支持的基本数据类型 Java支持八种基本数据类型,分别是:byte、short、int、long、float、double、char和boolean。具体说明如下: byte:8位有符号整数类型。用于节省内存,适合于低级数据。 short:16位有符号整数类型。和byte类似,被用于节省空间。…

    Java 2023年5月26日
    00
  • 解析关于java,php以及html的所有文件编码与乱码的处理方法汇总

    解析关于java,php以及html的所有文件编码与乱码的处理方法汇总 在开发web应用时,经常会遇到关于文件编码与乱码的问题。下面是关于Java、PHP和HTML文件编码与乱码的处理方法的汇总。 文件编码 文件编码是指在存储文件时所使用的编码格式。Web开发中,常用的编码格式有UTF-8编码和GB2312编码。 UTF-8编码 UTF-8编码是一种可变长度…

    Java 2023年5月20日
    00
  • Kafka producer端开发代码实例

    下面是详细的Kafka producer端开发代码实例攻略: 1. 搭建开发环境 首先,需要搭建Kafka的开发环境。可以参考官方文档:http://kafka.apache.org/quickstart。 2. 引入Kafka的依赖库 在Maven项目中,需要引入以下依赖: <dependency> <groupId>org.apa…

    Java 2023年5月20日
    00
  • Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解

    下面是关于“Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解”的完整攻略。 前言 在Java程序中,我们有时会需要将一个文件夹以及其中的文件打包成ZIP格式的压缩文件并下载。本文将介绍如何实现这个功能。 代码实现 Java提供了ZipOutputStream类和ZipEntry类,可以轻松地打包一个文件夹中的所有文件并生成ZIP文件。我们可以使…

    Java 2023年5月19日
    00
  • Springboot整合多数据源配置流程详细讲解

    下面我将为你详细讲解Springboot整合多数据源配置流程的完整攻略。 1. 引入多数据源依赖 在 pom.xml 文件中引入多数据源依赖。这里我们以 Druid 数据源为例,示例代码如下: <dependency> <groupId>com.alibaba</groupId> <artifactId>dru…

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