2020-7-24
接口
接口是一种引用数据类型
格式 public interface 接口名称{ 内容}
接口内容:
- 常量
- 抽象方法
- 默认方法
- 静态方法
- 私有方法
接口抽象方法 --abstract(抽象)
public interface 接口名称{ 抽象方法}
//接口抽象方法
public interface Abs {
public abstract void abs();
}
接口抽象方法 的实现
public class 实现类名 implements 接口类{}
public class AbsImpl implements Abs{
@Override
public void abs() {
// TODO Auto-generated method stub
System.out.println("方法实现");
}
}
接口默认方法–default(默认)
public default 返回值类型 方法名称 (参数列表){方法体}
接口的默认用于接口的升级,使得接口添加新方法后已经实现的接口类不会一一修改
接口类
public interface Abs {
//接口抽象方法
public abstract void abs();
//接口默认方法
public default void abs1() {
System.out.println("这是一个默认方法!");
}
}
接口实现
public class AbsImpl implements Abs{
@Override
public void abs() {
// TODO Auto-generated method stub
System.out.println("方法实现");
}
}
主类
public class Main0 {
public static void main(String[] args) {
AbsImpl impl=new AbsImpl();
impl.abs();
AbsImpl impl2=new AbsImpl();
impl2.abs1();
}
}
实现结果
方法实现
这是一个默认方法!
接口的默认方法可以重写
接口实现类重写方法
public class AbsImpl implements Abs{
@Override
public void abs() {
// TODO Auto-generated method stub
System.out.println("方法实现");
}
@Override
public void abs1() {
System.out.println("重写默认方法!");
}
}
运行结果
方法实现
重写默认方法!
接口的静态方法–static(静态)
注:静态方法和对象无关,和类有关
- 不能通过接口实现类的对象来调用接口当中的静态方法
- 调用:直接通过接口名称.静态方法调用
接口类
//接口静态方法
//接口静态方法
public interface Abs {
public static void abs2() {
System.out.println("接口静态方法!!");
}
}
接口静态类调用–主方法
public class Main0 {
public static void main(String[] args) {
//静态方法调用
Abs.abs2();
}
}
运行结果
接口静态方法!!
接口私有方法
解决本类中方法部分内容重复,重复部分另写一个方法用来调用,但不能被接口的实现类调用,使其私有化
- 普通默认私有:
private 返回值类型 方法名(参数列表){方法体}
- 静态私有:
private static 返回值类型 方法名 (参数列表){方法体}
接口成员变量
接口中也可以定义成员变量,但必须由 public static final修饰 ,相当于常量
格式:public static final 数据类型 数据名 = 数值;
使用:接口名称.变量名
注意事项:
- 接口中的值可以忽略不写public static final ,但是默认写了
- 接口中的变量必须赋值
- 接口中常量的名称,使用完全的大写字母,用下划线分隔 例:NUM_MY_CLASS
接口和继承
注
-
接口是没有静态代码块和构造方法的
-
一个类的父类只有一个(单继承),但一个类可以同时实现多个接口
public class Abs implements Abs1,Abs2(覆盖所有的抽象方法)
-
如果实现的多个接口中有相同的抽象方法(abstract),那么只需要覆盖一次即可
-
如果实现类没有覆盖接口中的所有抽象方法(abstract),那么这个实现类也是抽象的
-
如果实现类所实现的接口中有重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写
-
一个实现类继承的父类方法和接口中的默认方法相同,优先使用父类的方法,不用覆盖重写。
区别
- 类和类之间继承关系为单继承,只有一个父类
- 类与接口之间多实现,一个类可以实现多个接口
- 接口与接口之间多继承
public interface Abs extends Abs1,Abs2{}
- 继承的多个接口中的抽象方法重复,只需要写一个就可以
- 继承的多个接口中的默认方法重复,需要覆盖重写
多态
代码中体现多态性:父类引用指向子类对象
格式:父类名称 对象名 = new 子类名称();
或 接口名称 对象名=new 实现类名称();
理解为:把猫看作动物
成员变量使用
编译看左边,运行还看左边
直接通过对象访问成员变量:看等号左边是谁,就是多少
间接通过方法访问成员变量:看方法属于谁,优先用谁,没有向上找
成员变量使用
编译看左边,运行看右边
注:先看左边有方法没,有则书写正确。运行看右边有方法没,没有向上找,有则用自己的。
看new的是谁,就优先用谁,没有则向上找
转型
向上转型 相当于多态
父类名称 对象名=new 子类名称();
例:把猫看作动物
向下转型 相当于强制类型转换
子类名称 对象名=(子类名称)父类对象名;
例:可以把猫强制类型转换(还原),由动物变为猫
判断原来是什么子类 --instanceof关键字
父类对象名 instanceof 子类名
会得到一个布尔值,来判断前面的原来是不是后面的