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日

相关文章

  • java自定义异常以及throw和throws关键字用法

    Java 自定义异常 Java 中有一些运行时异常是由Java自己设置的,但是在大多数情况下,程序员需要根据程序的需要自定义异常。在Java中可以通过继承Exception类或者RuntimeException类来自定义异常。 自定义异常类的继承结构: Throwable Exception RuntimeException 自定义异常类 示例: 假设有一个…

    Java 2023年5月27日
    00
  • springboot全局异常处理代码实例

    下面就给您详细讲解一下“springboot全局异常处理代码实例”的完整攻略。 什么是SpringBoot全局异常处理 SpringBoot是一种非常流行的Java Web框架,它具有快速构建应用、开箱即用等优点。然而,当我们的应用出现错误时,如果不进行有效的异常处理,就会给用户带来不好的使用体验。SpringBoot提供了全局异常处理机制,可以针对应用中的…

    Java 2023年5月27日
    00
  • Java面向对象类和对象实例详解

    Java面向对象类和对象实例详解攻略 Class和Object简介 Java是一种面向对象的编程语言,在Java中,类是一种对现实世界事物的抽象,包括对象的属性和行为。而对象是类的一个实例。类是定义对象的蓝图,对象则是根据该蓝图创建的实体。 声明类 在Java中,声明类需要使用class关键字。下面是一个简单的声明类并定义构造函数的示例: public cl…

    Java 2023年5月19日
    00
  • Java毕业设计实战之养老院管理系统的实现

    Java毕业设计实战之养老院管理系统的实现攻略 一、项目概述 养老院管理系统是一款基于Java语言开发的管理系统,可实现对养老院人员、床位等资源进行管理,并可对养老院内发生的事情进行记录、统计和分析,让养老院管理更加高效、便捷。 二、项目特点 采用MVC架构,运用Spring Boot、MyBatis等框架和技术实现系统开发。 实现对登录的权限分配,管理员用…

    Java 2023年5月24日
    00
  • 如果你项目使用了MyBatis-Plus你一定要用它

    还是先举个例子,魂斗罗小游戏应该很多90后都玩过,那个时代没有Iphone,没有各种电子产品(小学初中时代),这种小游戏应该就是很多90后的青春,反正那个时候只要放假就白天黑夜得玩。它就是那种2个好基友边玩边捡各种装备的游戏,越玩的远捡的装备越好,玩得越高兴。而MyBatis-Plus就类似Mybatis的的另一个好基友,那真是太好用了。基友搭配,效率翻倍。…

    Java 2023年4月22日
    00
  • MyBatis注解实现动态SQL问题

    下面是针对”MyBatis注解实现动态SQL问题”的完整攻略: 动态SQL语句的背景: 在进行数据库操作时,我们经常会用到动态SQL语句,而MyBatis也提供了多种方式来实现动态SQL,比如XML方式等,但是本文主要讲解注解实现动态SQL的问题。注解方式的实现相比XML更加简洁,可读性更强。在注解方式中,我们可以使用MyBatis提供的@SelectPro…

    Java 2023年5月20日
    00
  • Java的基本数据类型和运算方法(必看篇)

    Java的基本数据类型和运算方法(必看篇) Java中的基本数据类型包括八种:byte、short、int、long、float、double、char、boolean。 整型 主要包括 byte、short、int、long 四种类型。其中 byte 类型占用 1 个字节,取值范围为 -128 到 127;short 类型占用 2 个字节,取值范围为 -3…

    Java 2023年5月20日
    00
  • JDBC数据库连接步骤解析

    JDBC是Java Database Connectivity的缩写,用于Java语言访问关系型数据库的API。下面就来详细讲解JDBC数据库连接步骤解析。 JDBC数据库连接步骤 加载数据库驱动:通过Class.forName()方法加载数据库驱动,例如加载mysql数据库驱动可以使用以下代码: Class.forName(“com.mysql.jdbc.…

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