Java_接口_4
概述
什么是接口?
接口是更加彻底的抽象,接口中全部是抽象方法和常量,没有其他成分。(JDK 1.8之前)接口有啥用?
接口体现的是规范思想,实现接口的类必须重写完接口中全部的抽象方法。
规范 == 约束。
接口称为被实现,实现接口的类称为实现类。定义接口的格式:
修饰符 interface 接口名称{}
interface:定义接口的关键字。
- 接口中的成分研究(JDK 1.8之前):
- 抽象方法
a.接口中的抽象方法默认会加上public abstract修饰,所以可以省略不写。- 常量
常量:是指有public static final修饰的成员变量,有且仅能被赋值一次,值不能改变。
常量的名称规范上要求全部大写,多个单词下划线连接。
常量修饰的public static final 可以省略不写,默认会加上。- 小结:
定义接口使用的关键字:interface
接口中的成分在JDK 1.8之前只能有:常量和抽象方法。
在接口中常量的修饰符:public static final 可以省略不写,默认会加上。
在接口中抽象方法的修饰符:public abstract 可以省略不写,默认会加上。
接口定义形式(JDK1.8之前接口只有抽象方法和常量)
public interface demo_1 { //接口
//抽象方法
public abstract void run(); //可以省略public abstract
//常量 一般修饰符public static final 缺一不可
String SCHOOL_NAME = "iii"; //可省略 public static final
}
常量定义规定
- 一般修饰符public static final 缺一不可
- 名称全部大写,可用下划线连接
- 变量值只有一个!!!
接口的基本实现
接口是用来被类实现的。
引入:
类与类是继承关系:一个类只能直接继承一个父类。
类与接口是实现关系:一个类可以实现多个接口。
实现接口的类称为“实现类”。子类 继承 父类
实现类 实现 接口实现类实现接口的格式:
修饰符 class 实现类名称 implements 接口1,接口2,接口3,…{}
implements:实现的含义。
接口是可以被多实现的:一个类可以实现多个接口。小结:
接口是用类被实现的,实现接口的类称为实现类。
实现接口的关键字是:implements。
接口是可以被类多实现的。
注意:一个类实现接口必须重写完接口中全部抽象方法,否则这个类必须定义成抽象类!!
实现具体代码
public class demo_1 {
public static void main(String[] args){
BasketMan xiaoming = BasketMan.createBasketMan();
xiaoming.run();
xiaoming.competition();
}
}
//实现类
class BasketMan implements SportMan{
private String name;
public BasketMan(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name + "篮球运动员要跑步~~");
}
@Override
public void competition() {
System.out.println(name + "篮球运动员要参加比赛~~");
}
public static BasketMan createBasketMan(){
return new BasketMan("xiaoming");
}
}
//运动员接口 接口内的抽象方法必须实现
interface SportMan{
void run();
void competition();
}
接口和抽象类的区别
-
相同点
- 都不能被实例化
- 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
-
不同点
-
接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
-
实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
-
接口强调特定功能的实现,而抽象类强调所属关系。
-
接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
-
接口的多实现
也就是多个接口同时约定一个类实现所有抽象方法。
实现类实现接口的格式:
修饰符 class 实现类名称 implements 接口1,接口2,接口3,…{ }类与类是单继承。
类与接口是多实现。小结:
一个类可以实现多个接口。
一个类如果实现了多个接口,必须重写完全部接口中的全部抽象方法
否则这个类必须定义抽象类。
如代码实现:
class BasketMan implements SportMan,SportWoman{
private String name;
public BasketMan(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name + "篮球运动员要跑步~~");
}
@Override
public void competition() {
System.out.println(name + "篮球运动员要参加比赛~~");
}
public static BasketMan createBasketMan(){
return new BasketMan("xiaoming");
}
}
//运动员接口
interface SportMan{
void run();
}
interface SportWoman{
void competition();
}
接口与接口的多继承
类与类是单继承关系:一个类只能继承一个直接父类。
类与接口是多实现关系:一个类可以实现多个接口。
接口与接口是多继承关系:一个接口可以继承多个接口。
将多个接口合并成一个接口!!!
interface SportMan extends SportWoman{
void run();
}
interface SportWoman{
void competition();
}
JDK1.8以后新增方法
引入:
JDK 1.8之前接口中只能是抽象方法,常量。
JDK 1.8开始之后接口不再纯洁了。
JDK 1.8开始之后接口新增了如下三种方法。a.默认方法(就是之前写的普通实例方法)
– 必须用default修饰,默认会public修饰
– 必须用接口的实现类的对象来调用。b.静态方法
– 默认会public修饰
– 注意:接口的静态方法必须用接口的类名本身来调用。c.私有方法(就是私有的实例方法): JDK 1.9才开始有的。
– 只能在本类中被其他的默认方法或者私有方法访问。
使用的注意事项
如果实现了多个接口,多个接口中存在同名的静态方法并不会冲突,
原因是只能通过各自接口名访问静态方法。当一个类,既继承一个父类,又实现若干个接口时,(重点)
父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。当一个类实现多个接口时,多个接口中存在同名的默认方法。
实现类必须重写这个方法。接口中,没有构造器,不能创建对象。(重点)
接口是更彻底的抽象,连构造器都没有,自然不能创建对象!!