一:接口
使用继承和多态来自己实现一下USB接口的操作;接口是一个特殊的Java类,接口可以做到多继承(接口的继承称之为实现,接口可以多实现)。
1、基本接口
1、1接口的定义、声明
- Java类使用的是class关键字,接口使用interface关键字声明
- 语法:public interface 接口的名字
- 接口中都会有哪些东西
A:属性
定义属性如下
属性被编译后的结果如下
由此可见,接口中的属性默认是使用public static final修饰,在声明时默认赋予初始值
B:方法
被编译之后的结果
总结: - 在接口中,没有代码块、没有静态代码块、没有构造方法、没有普通方法、也没有最终方法
- 在接口中可以有静态方法
- 在接口中可以有抽象方法:使用abstract修饰的没有方法体{ }的方法叫做抽象方法,默认抽象方法是使用public abstract修饰的
- 接口也不能像其他类那样new自己
- 接口中的属性都是公共,静态,常量,必须在声明的时候赋予初始值
1、2接口如何使用
接口不能像其他类一样直接的去new自己
接口的实例化是使用已知实现子类,采用多态的思想来实例化对象
1、2、1接口的实现
实现方法:使用implements关键字来实现接口,实现接口的子类必须重写该接口的所有抽象方法,而且重写后的方法必须有具体的方法体
1、2、2具体的调用
- 调用静态方法:直接使用接口名.方法名调用
注意:静态方法不能被继承,也不能被重写
- 对于默认方法而言:可以继承,可以重写,想怎么用就怎么用
注意:如何调用父类接口中的默认方法
使用父类名.super.方法名
1、2、3使用匿名对象的写法来调用
匿名对象就是,实例化一个对象,没有具体的引用。匿名对象只能用一次,匿名对象不能被重复使用
接口的总结:
- 接口可以自己实例化自己,在实例化的时候,使用new 接口名(){ 重写并实现接口中的所有抽象方法 };
- 接口可以使用多态的思想,用自己的已知实现子类来实例化自己。最终接口的方法其实就是调用已知实现子类重写的方法
- **接口的作用:**接口是用来做方法的规定的。具体要根据最终实现自己的子类来决定具体应该怎么做。一定要使用多态的思想。接口就是用来规定方法的。
- 注意:默认方法和静态方法都是jdk1.8版本之后才有的
- 接口所在的包是dao包,接口的实现包在dao.imp包
二:函数式接口
有且仅有一个抽象方法的接口称为抽象接口,使用注解@FunctionalInterface类判断该接口是不是函数式接口
1、声明
2、函数式接口的使用
第一种:原始用法:使用已知实现子类、使用匿名对象的写法
new 接口名字(){ 重写抽象方法 };
第二种:Lambda表达式的用法(为1.8之后的新特性)
- Lambda表达式主要是1.8jdk中为了简化对函数式接口的实例化操作
- 语法:函数式接口类型变量 = (参数…) -> { 重写的方法中具体的执行代码 }
()在参数只有一个的情况下可以省略
{ }在方法只有一条执行代码的时候可以省略
他的参数可以不指定类型 - 分为四种情况
无参数无返回值
有参数无返回值
无参数有返回值
有参数有返回值
package com.xingyun.函数式接口;
/**
* 函数式接口的声明
* @author langlang
*
* 2020年11月2日下午9:53:25
*/
@FunctionalInterface
public interface FunInter {
//没有参数没有返回值
void eat();
}
@FunctionalInterface
interface FunInter01{
//有参数没有返回值
void eat(int a,int b);
}
@FunctionalInterface
interface FunInter02{
//没有参数有返回值
int eat();
}
@FunctionalInterface
interface FunInter03{
//有参数有返回值
int eat(int a,int b);
}
package com.xingyun.函数式接口;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
/**
* 测试类
* @author langlang
*
* 2020年11月2日下午10:30:45
*/
class FunInterTest {
@Test
//普通匿名对象方式来实例化函数式接口
void test() {
//没有参数没有返回值
new FunInter() {
@Override
public void eat() {
System.out.println("开始吃饭");
}
}.eat();
}
//函数式接口,lambda表达式的实例化调用
@Test
void test01(){
// 没有参数没有返回值
//实例化接口 对象
FunInter fi=()->{ System.out.println("啥啥都别吃了");};
fi.eat();
}
@Test
void test02() {
//有参数没有返回值
//实例化对象,接口,()中的参数为重写抽象方法之后的形式参数
FunInter01 fi =(int a,int b)->{ System.out.println("他们的总和是"+(a+b)); };
fi.eat(10, 40);
}
@Test
void test03() {
//没有参数有返回值
FunInter02 fi =()->{ return 200; };
System.out.println(fi.eat());
}
@Test
void test04() {
//有参数有返回值
FunInter03 fi = (int a,int b)->{
int sum = a+b;
return sum;
};
int eat = fi.eat(40, 59);
System.out.println(fi.eat(40, 59));
}
}
三、抽象类
1、定义
-
抽象类是用类做功能描述,但是没有具体的执行
-
声明:使用abstract关键字来修饰的类,就是抽象类
-
抽象类,可以有普通类的所有成员,还可以有抽象方法,必须使用abstract关键字修饰
-
抽象类不能自己直接实例化自己,可以使用匿名对象写法,重写抽象类中的抽象方法
-
抽象类可以被子类继承,子类可以拥有父类的所有非私有、非静态成员,必须重写父类中的所有抽象方法
-
抽象类中的成员如代码所示
package com.xingyun.抽象类;
/**
* 动物抽象类
* @author langlang
*
* 2020年11月3日下午12:01:33
*/
public abstract class Animal {
//抽象类中可以有属性
String name;
static int age;
final String color="黑色";
static final String type = "动物";
//抽象类中可以有代码块
{
System.out.println("我是代码块");
}
//抽象类中可以有静态代码块
{
System.out.println("我是静态代码块");
}
//抽象类中可以有构造方法
public Animal() {
System.out.println("我是构造方法");
}
//抽象类中可以有静态方法
public static void eat(int a) {
}
//抽象类中可以有普通方法
public void eat() {
}
//抽象类中可以有抽象方法
abstract void run();
}
2、接口和抽象类的区别是什么
-
接口中只有静态常量、静态方法、默认方法、抽象方法;
抽象类可以有普通类的所有以及抽象方法 -
接口可以被实现,一个类可以实现多个接口
抽象类只能被继承,子类必须重写父类的所有抽象方法,要是不想重写子类也必须是抽象类
-
抽象类可以继承抽象类,接口可以继承接口
-
抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型的
-
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约(方法规定)。
而抽象类在代码实现方面发挥作用,可以实现代码的重用。
四、枚举类(Enumeration)
-
枚举类是用来指定固定的值的类,他是一个特殊的类,使用enum表示
-
枚举类的语法:public enum 类名 { }
-
规定:
枚举类中的属性,是类,也是枚举类的一个实例对象
枚举类中的属性必须写在类中的第一行
枚举类中的属性是私有的
枚举类中的构造方法是私有的,不能被别人实例化 -
使用
将枚举类当作参数类使用,使用类名.属性名
五、内部类
内部类就是在普通类的内部创建的类,内部类分为三种:成员内部类、局部类、静态内部类
1、成员内部类(全局内部类)
- 在外部类的内部声明的类
- 注意:普通类可以使用final修饰,被final修饰的类为最终类,不能被其他类所继承,但他可以继承其他类
- 语法:访问限定符 修饰符 类型 名字{ }(直接在外部类中声明)
- 如何使用:
**第一种方法:**在外部类的方法中,直接调用内部类
**第二种方法:**在其他类中实例化外部类的内部类,来调用内部类的方法
外部类.内部类 名字 = new 外部类(). new 内部类();
总结:全局内部类,可以使用任意限定符、修饰符、类型
可以创建类中类,内部类的内部类
2、局部内部类
局部内部类就是在方法中创建类,
总结
- 局部内部类,只有在方法中有效
- 局部内部类的属性默认是使用final修饰的,属性是定义在方法中的局部变量
- 对于局部内部类而言,定义在外部方法中的局部变量默认是使用final修饰的,所以在局部内部类中可以使用但是不能对其进行修改
- 在局部内部类中,类不可以使用static修饰
3、静态内部类
全局内部类使用static修饰
实例化:外部类.内部类 名字 = new 外部类.内部类 ();
六、final关键字
- final是修饰符,可以用来修饰变量、方法
- final修饰的类,称为最终类,最终类不能被其他类所继承
- 被final修饰的属性,称为常量,名字要全大写。其值在运行期间是不能被改变的,在运行期间类型也不会进行自动转换。final修饰的变量必须赋予初始值(声明并赋值);
- final修饰的方法称为最终方法,不能被子类所继承和重写
七、Lombok插件
1、定义
Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅仅只用五个字符(@Data)就可以替换数百行代码从而产生干净、简洁且易于维护的java类。
Lombok是一个快速创建pojo对象的插件,是一个三方jar包
2、分类
-
EJB:有属性有方法,方法是实际操作的方法
-
Pojo:只有属性描述以及封装方法
-
JavaBean实体类:主要作用是用来与数据库的表进行对应的,无参数构造方法、属性必须私有、封装方法、toString方法
3、Lombok的常用注解 -
@Setter:注解在类或者字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法,生成的set方法的权限是protected,而不是默认的public
-
@Getter:使用方法同上,区别在于生成的是getter方法,
-
@Data:注解在类,生成setter/getter、equals、canEquals、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法
4、Lombok插件的使用
1、给eclipse加上lombok功能
将lombok.jar复制到eclipse的解压文件中,双击,如果双击失败,使用dos命令进入eclipse的解压位置,使用命令(java -jar lombok.jar)
然后选择本地文件,如下图所示
然后如果出现如下图所示的页面则说明环境安装成功
如果双击eclipse无法正常启动,修改eclipse文件,如下图所示
2、在项目中使用lombok插件
3、在类中使用注解@Data、@Getter、@Setter