当前位置: 首页 > article >正文

Java第三周:继承和多态,抽象类和接口

目录

两个代码学会继承和多态,抽象类和接口

继承和多态

一、继承

二、多态

完整代码

抽象类和接口

一、抽象类

二、接口

概念

多实现

完整代码


继承和多态

一、继承

  1. 概念

    • 继承是面向对象编程中的一种机制,它允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。子类可以在父类的基础上进行扩展,添加新的属性和方法,或者重写父类的方法。

    • 例如,在Java中,使用extends关键字来实现继承关系。

// 定义父类Animal
class Animal {
    private String name;
    public Animal(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}
// 定义子类Dog,继承自Animal类
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

  • 在这个例子中,Dog类继承了Animal类。Dog类继承了Animal类的name属性和getName方法,并且添加了自己的bark方法。
  • 在Java中,super是一个关键字,用于指代父类对象。super(name)这种用法通常出现在子类的构造函数中,用于调用父类的构造函数并传递参数。

二、多态

  1. 概念
    • 多态是指同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在面向对象编程中,多态主要通过方法重写和接口实现来体现。
    • 例如,继续以上面的AnimalDog为例,我们可以有以下多态的体现:
// 定义子类Cat,继承自Animal类
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
    @Override
    public void makeSound() {
        System.out.println("喵喵喵");
    }
}
  • @Override是Java中的一个注解(Annotation)。它用于标识子类中的方法是重写(Override)父类中的方法。
  • 例如,在继承关系中,如果子类想要修改父类中已有的方法的实现,就需要重写该方法。使用@Override注解可以让编译器检查该方法是否正确地重写了父类中的方法。

完整代码

// 定义父类Animal
class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

// 定义子类Dog,继承自Animal类
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

// 定义子类Cat,继承自Animal类
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    @Override
    public void makeSound() {
        System.out.println("喵喵喵");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog("旺财");
        Animal animal2 = new Cat("小花");

        animal1.makeSound();
        animal2.makeSound();
    }
}

  1. 继承关系
    • Dog类和Cat类都继承自Animal类。它们通过super关键字在构造函数中调用父类的构造函数来初始化从父类继承的name属性。
  2. 多态体现
    • main方法中,创建了DogCat对象,但将它们赋值给Animal类型的变量animal1animal2。是多态的一种体现。
    • 当调用animal1.makeSound()animal2.makeSound()时,根据对象的实际类型(分别是DogCat),执行了各自类中重写后的makeSound方法,而不是Animal类中的makeSound方法,这展示了多态性。

抽象类和接口

一、抽象类

概念

抽象类是一种不能被实例化的类,它主要用于为其他类提供一个通用的模板或框架。抽象类中可以包含抽象方法(只有方法签名,没有方法体)和非抽象方法。

  1. 抽象方法
    • 抽象方法只有方法签名(方法名、参数列表、返回类型),没有方法体。它以abstract关键字修饰,并且抽象方法所在的类必须是抽象类。例如:
abstract class Shape {
    abstract double calculateArea();
}
  • 在这个Shape抽象类中,calculateArea就是一个抽象方法,它没有具体的实现,只是定义了一个计算形状面积的方法签名。这意味着任何继承Shape类的子类都需要实现这个方法来提供具体的面积计算方式。
  1. 非抽象方法

    1. 抽象类也可以包含非抽象方法,这些方法有完整的方法体,可以提供一些通用的功能给子类。例如:
abstract class Shape {
    public void printInfo() {
        System.out.println("这是一个形状");
    }
}
  • 这里的printInfo方法是一个非抽象方法,它可以被子类继承并直接使用,为子类提供了一个通用的打印形状相关信息的功能。

抽象类定义了一组相关类的通用行为和属性。它通过抽象方法强制子类实现某些特定的方法,从而保证子类具有一定的一致性。例如,在图形相关的类层次结构中,所有的图形类(如圆形、矩形等)都应该有计算面积的方法,通过将calculateArea定义为抽象方法,可以确保继承Shape抽象类的子类都实现这个方法。抽象类中的非抽象方法可以被多个子类复用。例如,printInfo方法可以在不同的图形子类中直接使用,无需在每个子类中重新编写相同的打印逻辑。

二、接口

概念

接口是一种特殊的抽象类型,它只包含方法签名、常量(默认是public static final修饰的)和默认方法。接口定义了一组方法的规范,一个类可以实现一个或多个接口,表示这个类具有接口所定义的行为。

  1. 方法签名
    • 只有方法签名没有方法体。例如:
interface Flyable {
    void fly();
}
  • 这里的fly方法就是接口Flyable中定义的抽象方法,任何实现Flyable接口的类都必须实现这个fly方法。

  1. 常量
    1. 接口中的常量默认。例如:
interface Constants {
    int MAX_VALUE = 100;
}
  • 在这个Constants接口中,MAX_VALUE是一个常量,它可以被实现这个接口的类直接使用。
  1. 默认方法
    1. 为了在接口中提供一些默认的实现,Java 8引入了默认方法。默认方法有方法体,可以在接口中直接实现一些通用的功能。例如:
interface Greetable {
    default void greet() {
        System.out.println("Hello!");
    }
}

多实现

  1. 一个类可以实现多个接口,这与类的单继承(一个类只能有一个直接父类)不同。这使得类可以具有多种不同的行为。
class MyClass implements Serializable, Cloneable {
    // 实现类的具体逻辑
}
  • 这里MyClass类同时实现了Serializable(可序列化)接口和Cloneable(可克隆)接口,从而具备了可序列化和可克隆的能力。

完整代码

// 抽象类Shape
abstract class Shape {
    // 抽象方法,计算面积
    abstract double calculateArea();
    // 非抽象方法,打印形状信息
    public void printInfo() {
        System.out.println("这是一个形状");
    }
}

// 圆形类,继承Shape抽象类
class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double calculateArea() {
        return Math.PI * radius * radius;
    }
}

// 可飞行接口
interface Flyable {
    void fly();
}

// 鸟类,实现Flyable接口并继承Object类(默认继承)
class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("鸟儿在飞翔");
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);
        circle.printInfo();
        System.out.println("圆形面积: " + circle.calculateArea());

        Bird bird = new Bird();
        bird.fly();
    }
}

在这个示例中:

  1. 首先定义了抽象类Shape,其中包含抽象方法calculateArea和非抽象方法printInfoCircle类继承Shape类并实现了calculateArea方法。
  2. 接着定义了接口FlyableBird类实现了Flyable接口并实现了fly方法。
  3. main方法中,分别创建了CircleBird的实例,并调用了它们相应的方法,展示了抽象类和接口在实际代码中的应用。

http://www.kler.cn/news/363191.html

相关文章:

  • Linux:进程优先级 进程调度切换 调度算法
  • 【AI创新】优化ChatGPT提示词Prompt设计:释放AI的无限潜能
  • 【操作系统的使用】Linux 系统环境变量与服务管理:设置与控制的艺术
  • 上拉电阻和下拉电阻在电路中的作用(一)
  • 【ELK】初始阶段
  • [Vue3核心语法] setup语法糖
  • 基于SSM消防物资存储系统的设计
  • 实验03分支---7-9 真睡还是装睡
  • 构建后端为etcd的CoreDNS的容器集群(四)、etcd挂载私有自签名证书进行访问测试
  • 探索未来社交新纪元:元宇宙展厅的无限魅力
  • 修改huggingface的缓存目录以及镜像源
  • 代码随想录算法训练营第三十七天|509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
  • C语言中单字符I/O的使用
  • Go的客户端与服务器通信案例
  • 基于PHP+MySQL+Vue的网上订餐系统
  • jmeter是怎么用的,怎么设计接口测试用例的
  • SEO基础:什么是LSI关键词?【百度SEO优化专家】
  • elementUI提示、通知、弹框每次只出现一个
  • Flutter仿京东商城APP底部导航实现
  • 代码随想录训练营Day06 | 454.四数相加II - 383. 赎金信 - 15. 三数之和 - 18. 四数之和
  • 毕业设计选题:基于django+vue的个人博客系统设计与开发
  • Github 2024-10-17 Go开源项目日报 Top10
  • 华为Eth-Trunk级联堆叠接入IPTV网络部署案例
  • 网络安全:数字世界的护卫
  • 访问kerberos认证华为的kafka集群
  • 【Python爬虫实战】使用BeautifulSoup和Scrapy抓取网页数据!