栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Java笔记10] 面向对象4(抽象类、接口)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Java笔记10] 面向对象4(抽象类、接口)

目录

抽象类

抽象类、抽象方法

模板方法模式

接口

接口被实现

接口与接口的关系:多继承

JDK8开始后新增方法

接口的注意事项


视频教程传送门 ->  https://www.bilibili.com/video/BV1Cv411372m?p=106

抽象类

抽象类、抽象方法

如果一个类中的某个方法的具体实现不能确定,就可以申明成abstract修饰的抽象方法(不能写方法体了),这个类必须用abstract修饰,被称为抽象类。

修饰符 abstract 返回值类型 方法名称(形参列表);
修饰符 abstract class 类名

注意:
抽象类可以理解成类的不完整设计图,是用来被子类继承的。
一个类如果继承了抽象类,必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

final和abstract是什么关系? => 互斥关系
abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承。
抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。

【例】Shark -> Animal,父类Animal和其中的方法run()用了abstract修饰

Animal.java

package com.test.d6_abstract_class;

public abstract class Animal {
    private String name;

    public abstract void run();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

创建子类后,重写抽象类的全部抽象方法

在IDEA中,按住 Alt + Enter,选择 "Implement methods"

选择父类的抽象方法

自动写好了重写抽象方法的架子

也可以输入run,回车

【例】加油站支付卡分类

分析实现:
创建一张卡片父类 -> 定义属性包括主人名称、余额、支付功能(具体实现交给子类)
创建一张金卡类 -> 重写支付功能,按照原价的8折计算输出。
创建一张银卡类 -> 重写支付功能,按照原价的8.5折计算输出。

父类 Card.java是抽象类

package com.test.d7_abstract_test;


public abstract class Card {
    private String name; // 主人名称
    private double money;

    
    public abstract void pay(double money);

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

子类 GoldCard.java需要重写pay()方法

package com.test.d7_abstract_test;


public class GoldCard extends Card{
    @Override
    public void pay(double money) {
        // 优惠后的金额算出来:
        double rs = money * 0.8;
        double remainMoney = getMoney() - rs;
        System.out.println(getName() + "当前账户总金额:"
                + getMoney() +",当前消费了:" + rs +",消费后余额:" +
                remainMoney);

        setMoney(remainMoney); // 更新账户对象余额
    }
}

执行测试类 Test.java

package com.test.d7_abstract_test;

public class Test {
    public static void main(String[] args) {
        GoldCard c = new GoldCard();
        c.setMoney(10000); // 父类的
        c.setName("鲨鲨");
        c.pay(300);
    }
}

输出:

模板方法模式

模板方法模式可以提高代码的复用性

实现步骤:
把功能定义成一个所谓的模板方法,放在抽象类中,模板方法中只定义通用且能确定的代码。
模板方法中不能决定的功能定义成抽象方法让具体子类去实现。

模板方法建议使用final修饰 <= 模板方法是给子类直接使用的,不是让子类重写的

接口

接口是一种规范

接口用关键字interface来定义,JDK8之前接口中只能是抽象方法和常量
public interface 接口名 {
       // 常量
       // 抽象方法

接口不能实例化
接口中的成员都是public修饰的,写不写都是,因为规范的目的是为了公开化

接口被实现

接口是用来被类实现(implements)的,实现接口的类称为实现类
实现类可以理解成所谓的子类,实现的关键字:implements
接口可以被类单实现,也可以被类多实现

说明:关于多实现,不同接口中有相同方法没关系反正要重写,但是如果返回值不同则会规范冲突

修饰符 class 实现类 implements 接口1, 接口2, 接口3 , ... {
}

注意事项:
一个类实现接口,必须重写完全部接口的全部抽象方法。

接口与接口的关系:多继承

类和类的关系 -> 单继承
类和接口的关系 -> 多实现
接口和接口的关系 -> 多继承,一个接口可以同时继承多个接口

接口多继承的作用:
规范合并,整合多个接口为同一个接口,便于子类实现。

JDK8开始后新增方法

(开发中很少使用,通常是Java源码会涉及)
默认方法:default修饰,实现类对象调用(类似普通实例方法)
静态方法:static修饰,必须用当前接口名调用
私有方法:private修饰,JDK9开始才有的,只能在接口内部被调用(类似私有实例方法)
以上都默认被public修饰

接口的注意事项

1、接口不能创建对象
2、一个类实现多个接口,多个接口中有同样的静态方法不冲突(调用不了,必须用接口名)
3、一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的
4、一个类实现了多个接口,多个接口中存在同名的默认方法,不冲突,这个类重写该方法即可
5、一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584550.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号