Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java小白翻身 - Java接口教程,适合新人,通俗易懂

Java小白翻身 - Java接口教程,适合新人,通俗易懂

作者头像
剽悍一小兔
发布于 2021-07-20 02:22:08
发布于 2021-07-20 02:22:08
69600
代码可运行
举报
运行总次数:0
代码可运行

可能是老板看我太辛苦,就新招聘了一个员工 -- 小A。我,小白,作为老员工,肯定要好好带带他。我真的很担心小A的代码不规范,咋办呢?

步骤 1 用接口来规范代码

我把我的想法跟老板说了,老板也很赞同我的想法。因为我属于老员工了,老板也比较信任我。

"小白啊,小A刚来,你要多带带他。这个项目是你一手做起来的,这一点上我很赞同你的想法。你可以做接口设计,然后把具体的实现交给小A去做。"

"接口啊,大学里面好像有教过。"

"是啊,接口是一种特殊的类,里面只有方法的声明而没有方法的实现。不过最新的jdk也允许写方法体了。"

"嗯嗯,我知道的,可是上学那会我就特别不理解接口到底有啥用,不写方法实现,就是一个空壳子哇!"

"嗯,接口的作用还是很大的,这一点你以后会慢慢明白的。小A刚来,代码不规范,逻辑思维还不完善,所以你作为老员工,就需要用接口来规范代码。"

"哦。。。"我似懂非懂地点了点头。

接着,老板又仔细给我讲解了接口的用法,我这才茅塞顿开。原来,用接口能做这么优雅的事情,看来我在学校学的,还有自己理解的,都还只是皮毛啊,与实际工作脱节了。

步骤 2 创建客户服务接口

先不说接口到底啥概念了,先来看看怎么用接口。现在的菜单是这样子的:

image

控制台输入1,则登录客户信息。这个登录信息的代码,目前全部写在Application.java里面了,这样会带来一个问题,就是程序不好维护。随着业务逻辑越来越复杂,Application.java 就会越来越难懂。所以,要把这部分业务拆分出去。

老板的意思是,我来制定接口,然后让新来的小A来实现,这样的话,项目的大概思路就不至于滑坡。

创建一个service包,然后创建ICustomerService接口,看下面的步骤图。

image

image

注意,下面的Kind是Interface。

image

步骤 3 ICustomerService.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package service;

import entity.Customer;
import java.util.List;

/**
 * 客户服务接口
 * author 小白
 */
public interface ICustomerService {

    //加载文本的客户资料
    public abstract List<String> loadCustomerFormTxt(String path);

    //填充属性到客户对象
    //public 和 abstract可以省略
    Customer fillCustomer(List<String> props);

    /**
     * 保存客户对象到Excel
     * @param cst 客户对象
     * @param excelPath Excel的路径
     * @return
     */
    boolean saveToExcel(Customer cst,String excelPath);

}

接口的定义和类非常像,区别是:

1.接口用的关键字是interface,而不是class

2.接口里面的方法只有声明,没有方法体,这种方法也叫做抽象方法(用abstract关键字修饰)

3.接口里面的方法默认都是public

步骤 4 修改Application.java,引入服务接口

image

因为暂时没有接口的实现类(方法都是空的),所以这边只是引用,不去new。

步骤 5 修改main方法

先把原来的保存代码注释掉,然后依次调用接口的方法,顺便说一句,<preconsolas';font-size:10.5pt;" style="box-sizing: border-box; font-size: 15px; font-family: Helvetica;">cstList做成static的,方便调用。</preconsolas';font-size:10.5pt;">

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static TuziLinkedList cstList = new TuziLinkedList();

main方法源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args){

        newLine("******欢迎使用兔子餐厅会员系统******");
        newLine("[1]客户登记入库");
        newLine("[9]退出程序");

        //创建一个控制台输入对象,反正就这么写,目前不用去深究含义
        Scanner scanner = new Scanner(System.in);
        //获取用户的输入,程序会挂起等待
        int input = scanner.nextInt();

        //直接退出程序
        if(input == 9){
            newLine("程序退出,谢谢使用!");
            return;
        }

        //自动读取D盘的customer.txt文件,保存入库
        if(input == 1){
//          List<String> lines = FileUtil.readLines(new File("D:/customer.txt"), "GBK");
            Application app = new Application();
            //1、读取文本,获取客户资料
            List<String> props = app.customerService.loadCustomerFormTxt("D:/customer.txt");
            //2、解析客户资料到客户对象
            Customer customer = app.customerService.fillCustomer(props);
            //3、直接将客户对象保存到Excel中(暂时先不做批量入库了)
            boolean isSuccess = app.customerService.saveToExcel(customer,"D:/customer.xls");

            if(!isSuccess){
                System.out.println("保存失败,系统出现异常!");
            }else{
                //4、将这个对象存入链表,备用
                cstList.add(customer);
            }

//          //先创建一个客户对象,就是setFieldValue方法的第一个参数(给谁的属性赋值)
//          Customer cst = new Customer();
//
//          for (String line : lines) {
//              //System.out.println(line);
//              //用字符串的split方法,根据=分割成数组,比如name=张大胖,就会变成['name','张大胖']
//              String[] split = line.split("=");
//              String key = split[0]; //获取数组的第一个元素
//              String value = split[1]; //获取数组的第二个元素
//              //System.out.println(key + "," + value);
//              ReflectUtil.setFieldValue(cst,key,value);
//          }
//
//          //打印顾客对象,就是调用他的toString方法
//          System.out.println(cst);
//          System.out.println(cst.getName() + "保存完毕!");
        }

       //运行完毕后,继续执行main方法,这样程序就不会关闭
       Application.main(null);

   }

代码瞬间清晰了,这就是接口的魅力啊!我只需要负责设计出方法的名字,参数和返回值就可以了,剩下的,我去交给别人做。当然,现在这个程序是不能运行的,因为customerService没有赋值,还是null。

步骤 6 小A啊,这个接口你帮忙实现一下了哇!

“小A啊,这个接口你帮忙实现一下了哇!”,虽然有点不好意思,但我毕竟是老员工。而且很多业务逻辑已经在main方法里面写了,小A可以去照搬我之前的代码。不过,我也怕小A在别的地方胡乱创建class,所以把实现类也建好了。

image

image

image

image

image

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package service.impl;

import entity.Customer;
import service.ICustomerService;

import java.util.List;

public class CustomerServiceImpl implements ICustomerService{

    @Override
    public List<String> loadCustomerFormTxt(String path) {
        return null;
    }

    @Override
    public Customer fillCustomer(List<String> props) {
        return null;
    }

    @Override
    public boolean saveToExcel(Customer cst, String excelPath) {
        return false;
    }
}

步骤 7 接口的实现类必须重写所有抽象方法

接口的实现类必须重写所有抽象方法,CustomerServiceImpl既然实现了ICustomerService,就必须重写所有的抽象方法,这是一种约定。既然你打算遵循我设计的接口,就必须实现我要求的所有方法。

步骤 8 loadCustomerFormTxt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public List<String> loadCustomerFormTxt(String path) {
    return  FileUtil.readLines(new File(path), "GBK");
}

小A基本照搬了我的代码。

步骤 9 fillCustomer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public Customer fillCustomer(List<String> props) {
    //先创建一个客户对象,就是setFieldValue方法的第一个参数(给谁的属性赋值)
    Customer cst = new Customer();

    for (String line : props) {
        //用字符串的split方法,根据=分割成数组,比如name=张大胖,就会变成['name','张大胖']
        String[] split = line.split("=");
        String key = split[0]; //获取数组的第一个元素
        String value = split[1]; //获取数组的第二个元素
        ReflectUtil.setFieldValue(cst,key,value);
    }

    return cst;
}

还是照搬。

步骤 10 saveToExcel

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public boolean saveToExcel(Customer cst, String excelPath) {
    System.out.println("不会");
    return true
}

这。。。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java小白翻身 - Java多态的理解,适合新人,通俗易懂
CustomerServiceImpl 是 ICustomerService接口的实现类,ICustomerService是父,CustomerServiceImpl 是子,他们有一种父子关系。父类的引用指向子类对象,这个就是多态。
剽悍一小兔
2021/07/21
5620
Java小白翻身 - Java多态的理解,适合新人,通俗易懂
Java小白翻身教程-链表结构与编译大法(1)
咳咳,我是小白,没错,主线剧情又回来了。现在我遇到麻烦了,老板要我设计一个类,可以用来保存多个客户的资料。
剽悍一小兔
2021/07/14
2980
Java小白翻身教程-链表结构与编译大法(1)
SSH框架之Spring+Struts2+Hibernate整合篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/09/23
6310
Java项目:CRM客户关系管理系统(Spring+SpringMVC+MyBatis + maven)
步骤2:修改CustomerController,用于显示 customer/add.jsp 页面
陶然同学
2023/02/24
3.8K0
CRM第一篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
3830
CRM第二篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
1.1K0
Java小白翻身教程-如何引用外部类
为了简单起见,我们就不给Demo加package了,这样可以直接在Editplus里面快速运行。
剽悍一小兔
2021/07/14
6010
Java小白翻身教程-如何引用外部类
SSH框架之Spring第一篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/09/23
3150
Java小白翻身教程-包的作用
之前讲了打印数据的方法:System.out.println,写这么多字有点麻烦啊。那么我们不妨创建一个StringUtil,Util是工具的意思,里面设计一个newLine方法,用于字符串的打印。
剽悍一小兔
2021/07/14
3610
Java小白翻身教程-包的作用
Spring第四天:SSH的整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用
*****注意:Struts2和Hibernate都引入了一个相同的jar包(javassist包)。删除一个******
AlbertYang
2020/09/08
6990
Spring第四天:SSH的整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用
day53_BOS项目_05
定区可以将取派员、分区、客户信息关联到一起。 页面:WEB-INF/pages/base/decidedzone.jsp
黑泽君
2018/10/11
1.2K0
day53_BOS项目_05
02.Scala:面向对象、Object、抽象类、内部类、特质Trait
scala是支持面向对象的,也有类和对象的概念。我们依然可以基于scala语言来开发面向对象的应用程序。
Maynor
2021/04/09
1.3K0
Java接口详解
①接口中的抽象方法必有两个固定的修饰符,即public和abstract,所以可以省略;
訾博ZiBo
2025/01/06
470
Java小白翻身 - webservice教程3
如果你用的是jdk1.8,请在lib目录(我的是在C:\jdk\lib)新建一个jaxp.properties,里面写上一句话
剽悍一小兔
2021/07/20
6170
Java小白翻身 - webservice教程3
序列化和反序列化的简单理解[通俗易懂]
把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。
全栈程序员站长
2022/09/07
1.3K0
SSH整合
Spring的配置文件是applicationContext.xml和web.xml
用户3112896
2019/09/26
1.5K0
SSH整合
带你快速掌握Scala操作———(4)
文章目录: 1、iterator迭代器 使用迭代器遍历集合 2、类和对象 创建类和对象 定义和访问成员变量 3、使用下划线初始化成员变量 4、定义成员方法 5、访问修饰符 6、类的构造器 主构造器 辅助构造器 7、单例对象 定义单例对象 8、工具类案例 9、main方法 10、伴生对象 private[this]访问权限 11、继承 示例 | 类继承 示例 | 单例对象继承 12、override和super 1、iterator迭代器 scala
刘浩的BigDataPath
2021/04/13
7290
带你快速掌握Scala操作———(4)
友佳书屋实训项目(三)
CustomerServiceImpl实现类具体操作与上篇雷同,不再截图展示具体过程。
杨校
2021/10/19
4090
挖新坑—Java
只记录Java最入门的内容,模块并不完整,更深入的知识在Java基础、Java提高、JavaWeb模块
用户6948990
2025/04/03
450
挖新坑—Java
Java小白翻身 - webservice教程2
来一个HelloWorld,SpringBoot发布WebService可简单啦。
剽悍一小兔
2021/07/20
8050
Java小白翻身 - webservice教程2
相关推荐
Java小白翻身 - Java多态的理解,适合新人,通俗易懂
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验