说明:

(1) 本篇博客主要内容:内部接口;然后,本篇博客介绍的内容,是一个可以长期积累的开发技巧;以后,可能会时不时的用到这个技巧;

目录

一:为什么写篇博客?

1.先看几个前面遇到的案例;

2.本篇博客的两个疑问;(核心!)

二:关于内部类的内容,可以参考的几篇博客;

三:解答本篇博客疑问;(核心!)

1.什么是内部接口;

2.为什么,我们定义内部接口,并在内部接口中写几个变量后;可以通过【外部类.内部接口.内部接口中定义的属性】的方式,获取到内部接口中定义变量;


一:为什么写篇博客?

1.先看几个前面遇到的案例;

● 案例1: 在【Spring Boot电商项目42:商品模块八:前台的【商品列表】接口;】中,出于程序安全的考虑,在Constant类中,通过内部接口,预设了几种排序方式;

● 案例2.1: 在【Spring Boot电商项目46:购物车模块四:【添加商品到购物车】接口;】,出于能快速明确商品的上架状态1、0的含义,通过内部接口,进行了定义和说明;

案例2.2: 在【Spring Boot电商项目53:订单模块二:【前台:创建订单】接口;】中,出于能快速明确商品的上架状态1、0的含义,通过内部接口,进行了定义和说明;

案例3: 在【Spring Boot电商项目46:购物车模块四:【添加商品到购物车】接口;】中,出于能快速明确购物车中的商品是否勾选1、0的含义,通过内部接口,进行了定义和说明;

可以发现,上面的案例中,我们使用了【在类中定义“内部接口”】的技术;而,自己以前接触的都是内部类; 所以,本篇博客主要就是了解一下内部接口,深入理解一下为什么面对【在程序中,定义常量,这个需求】,可以通过【内部接口,这个技术】来实现; (然后顺道回顾了一下内部类)

2.本篇博客的两个疑问;(核心!)

由上面的案例,就引出了两个疑问?

(1) 内部接口是什么?

(2) 为什么,我们定义内部接口,并在内部接口中写几个变量后;可以通过【外部类 . 内部接口 .内部接口中定义的属性 】的方式,获取到内部接口中定义变量;


二:关于内部类的内容,可以参考的几篇博客;

(1)Java多态十三:内部类定义;成员内部类;】;

● 介绍了什么是内部类;

● 重点介绍了成员内部类;包括,如何实例化成员内部类对象,内部类的访问修饰符,内部类和外部类互访等;

(2)Java多态十四:静态内部类】;

● 介绍了什么是静态内部类;

● 这儿介绍了静态内部类的一些技术特点;

● 但是,其中介绍的:可以直接利用【外部类 . 静态内部类 . 静态内部类中的静态成员】的方式,去访问静态内部类中的静态成员;似乎和本篇博客中介绍的主题比较契合;(这也是为什么,自己意识到要针对内部接口,需要专门写一篇博客的,主要原因)

(3) 有关内部类,【Java多态十五:方法内部类;】和【Java多态十六:匿名内部类】还介绍了方法内部类和匿名内部类;同时,有关内部类的更多内容,可以参考【(1)Java】专栏中更多的内容;

……………………………………………………

(4) 鉴于【可以在类中,定义内部类】、【可以在接口中,定义内部类】、【可以在类中,定义内部接口】、【可以在接口中,定义内部接口】;自己能感觉到,类和接口在某种程度上,其实差别不打;只是,因为自己目前还没怎么看过JavaSE的源码,所以,并不能很透彻的理解;


三:解答本篇博客疑问;(核心!)

1.什么是内部接口;

内部接口很简单;就是,在类或接口内部,定义的接口;

2.为什么,我们定义内部接口,并在内部接口中写几个变量后;可以通过【外部类 . 内部接口 .内部接口中定义的属性

】的方式,获取到内部接口中定义变量;

(1)接口本身的特点:

● 在接口中,定义变量时,可以省略public, static 和final,即接口中的变量,系统默认有这三个修饰符。

● 关于这一点,还可以参考【接口中的变量默认是public static final的】:

解释1:接口是一种高度抽象的”模版”,而接口中的属性也就是’模版’的成员,就应当是所有实现”模版”的实现类的共有特性,所以它是public static的 ,是所有实现类共有的.假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?

解释2:接口中如果可能定义非final的变量的话,而方法又都是abstract的,这就自相矛盾了,

有可变成员变量,但对应的方法却无法操作这些变量,虽然可以直接修改这些静态成员变量的值,但所有实现类对应的值都被修改了,这跟抽象类有何区别?

接口是一种更高层面的抽象,是一种规范、功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化、规范化的作用。所以接口中的属性必然是final的。

解释3:接口只是对事物的属性和行为更高层次的抽象 。对修改关闭,对扩展(不同的实现implements)开放。

summary:

1.接口必须要具体类实现才有意义,所以必须是public 2. 接口中的数据对所有实现类只有一份,所以是static

3.要使实现类为了向上转型成功,所以必须是final的.这个举例子很好理解.比如接口A,A有变量value.实现类A1,A2,可以向上转型.假如代码中有一句: A a=null; a=…(2)实际实现类 System.out.println(a.value);

利用向上转型,可以得到接口a的值,在第2步中,我不关你是实现类A1,还是new A2(),通过转型,我们可以得到正确的值.要是类中可以更改,我们得不到一个统一的值,接口也没有了意义

● 也可以参考【Java多态七:接口中抽象方法的tips;接口中的常量;接口应用中的常见问题;】;

(2)内部接口的特点:

● 因为接口是不能实例化的,内部接口只有当它是静态的才有意义。因此,默认情况下,内部接口是静态的,不管你是否手动加了static关键字。(参考自【Java内部类及内部接口】);

……………………………………………………

(3)本篇博客的疑问,就很容易理解了;

……………………………………………………

(4)内部接口不是什么新的设计,而是一种思想方式,可以让代码扩展性更高;

PS:本篇博客的内容,也算是一种编程技巧吧;可以积累起来;