接口:
接口就是公共的规范标准Interface protocol(协议)
定义格式:
public interface Demo{
接口内容 ;
}
接口内容:
java7:
1.常量
格式:
[public][static][final] 数据类型 变量名 = 数据值;
注意点:
1.[public][static][final]都是可以选择性省略 要求只要是在接口里面声明的变量 必须得用这三个关键字进行修饰
2.必须对接口中定义的变量进程赋值操作(即初始化操作)
3.软性要求 代码规范 接口里面定义的变量(常量)变量名字要求全部大写 每个单词之间使用下划线连接
2.抽象方法
public abstract 返回值类型 方法名(参数列表);
注意:[public] [abstract]可以全部省略 也可以选择性的省略任意一个
java8:
3.默认方法
主要功能 就是用来解决接口升级的一个问题
格式:
[public] default 返回值类型 方法名(参数列表){
方法体;
}
默认方法 只能在接口中定义 别的地方不能定义
默认方法 调用的时候和成员方法的调用方式一致
4.静态方法
定义格式:
public static void show(){
方法体;
}
静态方法是不能被重写的
使用方式:
不能使用实现类创建的对象调用
直接使用接口名.静态方法(参数列表)
java9:
5.私有方法
定义的格式:
跟普通的方法相比的话唯一不一样的地方就是修饰符是private 其他的内容都一样
普通的私有方法:
private 返回值类型 方法名(参数列表){
方法体;
}
普通静态的私有方法
private static 返回值类型 方法名(参数列表){
方法体;
}
功能:
private修饰的方法只能在本类中使用
可以对本类中重复的内容进行抽取
接口的基本使用:
1.接口不能直接用来创建对象使用
2.需要创建一个实现类 实现 implements 接口名 重写里面的抽象方法
3.使用实现类创建对象 使用对象调用方法
注意:实现类必须得覆盖重写接口中的所以的抽象方法 除非该类也是抽象类
/*
在Java 9+版本中,接口的内容可以有:
1. 成员变量其实是常量,格式:
[public] [static] [final] 数据类型 常量名称 = 数据值;
注意:
常量必须进行赋值,而且一旦赋值不能改变。
常量名称完全大写,用下划线进行分隔。
2. 接口中最重要的就是抽象方法,格式:
[public] [abstract] 返回值类型 方法名称(参数列表);
注意:实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类。
3. 从Java 8开始,接口里允许定义默认方法,格式:
[public] default 返回值类型 方法名称(参数列表) { 方法体 }
注意:默认方法也可以被覆盖重写
4. 从Java 8开始,接口里允许定义静态方法,格式:
[public] static 返回值类型 方法名称(参数列表) { 方法体 }
注意:应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法
5. 从Java 9开始,接口里允许定义私有方法,格式:
普通私有方法:private 返回值类型 方法名称(参数列表) { 方法体 }
静态私有方法:private static 返回值类型 方法名称(参数列表) { 方法体 }
注意:private的方法只有接口自己才能调用,不能被实现类或别人使用。
*/
使用接口的时候,需要注意:
1.接口是没有静态代码块或者构造方法的。
2.一个类的直接父类是唯一的,但是一个类可以同时实现多个接口
3.如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可
4.如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可
5.如果实现类锁实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
6.一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。
接口的继承关系:
接口的多实现 一个类可以实现多个接口
格式: public class impl implements InterA,interB,interC...{}
接口的多继承 子接口可以同时继承多个接口
格式: public interface Inter extends InterA ,interB,InterC{}
注意点:
如果是继承或者是实现的多个接口中有重复的抽象方法 只需要覆盖重写一个即可
如果是接口的继承 继承多个接口 接口里面有重复的默认方法 需要在子接口重写默认方法 带关键字 default
多态:
对象有不同的形态 小明 既是个人又是个学生
格式:
多态的条件:
1.必须得有继承关系
2.父类的引用指定子类的对象
父类 对象名 = new 子类();
接口 接口名 = new 实现类();
多态里面
访问成员变量的特点:
编译看左边 运行也看左边
访问成员方法的口诀:
编译看左边 运行看右边 (父类对象绝对不会向下查找)
向上转型 有类型范围小的数据(子类) 转换成 类型范围大的数据(父类)
父类 对象名 = new 子类();
子类 对象名 = new 子类();
向上转型 类似于基本数据类型的 自动类型转换(数据范围小的数据类型 转换成数据范围大的数据类型 int --> long )
向上转型 数据永远是安全的
向上转型
父类 父类对象名 = new 子类();
转换格式: 子类 子类对象名 = (子类)父类对象名;
向下转型和基本数据类型中的强制类型转换格式是一样的
向下转型的时候存在一些隐患
数据类型的转换异常 ClassCastException 类型转换异常 |
|