Java 面向接口编程

面向接口编程

接口介绍

接口 (interface) ,用来描述一个类应该做什么,而不指定它们的具体逻辑

举一个生活中的例子,比如说一部手机。我们可以定义一个"手机"接口标准,例如充电器要使用TYPE-C,安卓系统以及大小尺寸等,然后各大手机厂商就按照这个标准来生产手机,有一天手机坏掉了,但是充电器还是好的,那么我们只要换个手机就还可以使用原来的充电器充电了。

在Java中的接口也是一样,接口不是类,而是对希望符合这个接口的类的一组需求。在代码设计中,我们事先约定好项目的各个功能的接口(接口的签名和方法),实际开发时就可以直接实现这个接口就可以继续完成实际逻辑了,并且如果项目在后续进行升级,我们只需要按照接口约定重新实现一下,就可以达到项目升级和扩展的目的。面向对象 是以对象为基本单位进行编程,面向接口编程则是以接口为最小单位,编写接口,实现接口,进行开发。

接口的特点

  1. 接口之间可以多继承
  2. 接口中的方法都是抽象方法,不能有方法体
  3. 接口不能够实例化
  4. 接口中的常量默认省略 public static final
  5. 接口中的方法默认是public并且是抽象方法
  6. 接口和抽象类不同,抽象类是部分模板,部分规范;接口是完全规范

代码实操

一个类可以实现(使用implements关键字) 一个或多个接口。

创建一个Car接口,Car接口用于规范汽车。

public interface Car {
     void drive();
}

在来一个Car接口的实现类:

public class BYD implements Car {
    // 重写了Car的方法
    @Override
    public void drive() {
        System.out.println("BYD... 启动");
    }
}

测试类

public class Main {
    public static void main(String[] args) {
        BYD byd = new BYD();
        byd.drive();
    }
}

输出:

BYD... 启动

项目中的使用

在一个项目中,我们需要对用户信息进行管理或者CRUD操作。那么可以封装一个User类用于封装用户信息。

之后我们定义一个UserService接口,用于规范对User的操作。

接口的一大作用就是解耦

如下图UserService的实现都放到impl中,如果要升级代码,就将原来的直接替换掉即可。

在这里插入图片描述

User类

package com.jc.bean;

public class User {
    private long userId; // 用户ID

    private String username; // 用户名

    private String password; // 密码

    public User() {
    }

    public User(long userId, String username, String password) {
        this.userId = userId;
        this.username = username;
        this.password = password;
    }

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

UserService

package com.jc.service;

import com.jc.bean.User;

public interface UserService {
    /**
     * 登录方法
     * @param username
     * @param password
     * @return
     */
    String login(String username, String password);

    /**
     * 注册方法
     * @param user
     * @return
     */
    User register(User user);
}

UserService实现类

package com.jc.service.impl;

import com.jc.bean.User;
import com.jc.service.UserService;

public class UserServiceImpl implements UserService {
    @Override
    public String login(String username, String password) {
        // TODO
        return "success";
    }

    @Override
    public User register(User user) {
        // TODO
        return user;
    }
}

测试

package com.jc;

import com.jc.bean.User;
import com.jc.service.UserService;
import com.jc.service.impl.UserServiceImpl;
import org.junit.Test;

public class UserTest {
    // 使用Spring就是从容器里自动注入的
    UserService userService = new UserServiceImpl();

    @Test
    public void testLogin() {
        String username = "abcde";
        String password = "123456";
        String r = userService.login(username, password);
        System.out.println(r);
    }

    @Test
    public void testRegister(){
        User user = new User(1, "abced", "123456");
        User r = userService.register(user);
        System.out.println(r);
    }
}

输出:

success

User{userId=1, username='abced', password='123456'}

补充

Java8新增特性,接口中可以定义defalt方法,此方法可以拥有方法体。

public interface Test {
    default void test() {
        System.out.println("Hello, World!");
    }
}
  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
、Person类的多态性设计。 设计一个Person类,其中包含一个方法pay(),计算工资支出。再从Person类派生出助教类(Assistant)、讲师类(Instructor)、副教授类(AssistantProfessor)和教授类(Professor)。其中:工资支出=基本工资+授课时数teachingHours*每课时课金。 助教基本工资为800元,每课时课金25元;讲师基本工资为1000元,每课时课金35元;副教授基本工资为1200元,每课时课金40元;教授基本工资为1400元,每课时课金50元;在主方法中显示各人员的工资支出。用以下两种方式实现: ○1将Person类设计为抽象类,pay()为抽象方法,设计程序实现多态性。 ○2将Person类设计为接口,设计程序实现多态性。 提示:设置授课时数teachingHours为成员变量,计算工资支出为成员方法,考虑是否定义构造方法。 2、编写一个Java程序,在程序中定义一个接口Achievement,其中有一个计算平均分的抽象方法avg();定义一个父类Person,其中有数据成员:姓名name和年龄age,构造方法初始化数据成员name和age,重写toString()方法显示成员信息;定义一个子类Student继承类Person并实现接口Achievement,增加数据成员:语文成绩chnScore、数学成绩mathScore和英语成绩engScore,增加设置三门课成绩的setScore()方法,并实现接口Achievement的计算平均分的抽象方法avg(),主函数中测试,部分代码如下所示: Student s=new Student(“张三”,16); //创建子类对象 System.out.println(s.toString()); //显示s的个人信息,调用继承父类的toString方法 s.setScore(80,88,95); //设置三门课的成绩 System.out.printf(“三门课的平均分:%.2f”, s.avg()); //显示对象s的三门课的平均分 输出结果如下: 姓名:张三,年龄:16 三门课的平均分:87.67 3、编写一个Java程序,在程序中定义一个School类,在School类中定义一个内部类Student,分别创建这两个类的对象,访问各个对象中的方法,其中: School类: 数据成员:学院名称schoolName; 成员方法:显示信息方法showSchoolMsg():在方法中创建内部类Student的对象,并显示该对象的信息(调用内部类Student的显示信息的成员方法)。 Student类: 数据成员:姓名sname,年龄sage; 构造方法,初始化姓名sname、年龄sage以及所属学院名(即外部类数据成员:学院名称schoolName); 成员方法:显示信息showStudentMsg(),显示的信息包括:姓名、年龄以及所属学院名。 主函数中测试,部分代码如下所示: …… // 创建外部类School的对象 …… // 通过外部类对象调用其显示信息的方法showSchoolMsg() System.out.println(“-------------我是华丽的分割线-------------”); …… // 创建内部类Student的对象 …… // 通过内部类对象调用其显示信息的方法showStudentMsg()

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神烦狗闯入了你的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值