接口是一个额外的功能,实现接口就具备该功能,不实现就不具备
接口:是引用数据类型的一种,是功能的集合(接口中一般定义的都是方法)
接口中不能定义变量,只能定义常量(很少使用)
定义接口使用也是.java文件;编译生成.class文件
定义接口使用关键字 interface
定义格式:
修饰符 interface 接口名{
抽象方法;(JDK7) 重点
默认方法;(JDK8)
静态方法;(JDK8)
常量(很少使用)
}
定义使用含有抽象方法的接口
抽象方法的定义格式:
修饰符 abstract 返回值类型 方法名(参数列表);
注意:
[接口中]的抽象方法的修饰符固定就是public abstract,可以省略不写,也可以写一部分
建议全部写出,提高阅读性
public abstract 返回值类型 方法名(参数列表);
public 返回值类型 方法名(参数列表);
abstract 返回值类型 方法名(参数列表);
返回值类型 方法名(参数列表);
接口的使用:
1.接口和抽象类一样,也无法创建对象使用
2.可以定义一个实现类,实现接口,重写接口中所有的抽象方法,创建实现类对象使用
实现类:类似于继承(类实现接口之后,也会继承接口中所有的方法)
实现使用关键字:implements
格式:
public class 实现类名 implements 接口{
重写接口中所有的抽象方法;
}
工作中实现类名书写规范:
接口名Impl==>见名知意
定义使用含有默认方法的接口
/*
默认方法定义格式:
修饰符 default 返回值类型 方法名(形式参数列表){
方法体;
}
注意:
默认方法的关键字default不能省略的
*/
/*
实现类实现接口:可以选择性的重写默认方法
实现类没有重写默认方法,使用继承自接口的默认方法
实现类重写了默认方法,使用重写后的方法
注意:
实现类重写默认方法,去掉default关键字
重写方法的快捷键:ctrl+o
*/
定义使用含有静态方法的接口
/*
定义使用含有静态方法的接口
静态方法定义格式:
修饰符 static 返回值类型 方法名(形式参数列表){
方法体;
}
注意:
静态方法的关键字static不能省略的
*/
/*
含有静态方法的接口,静态方法属于接口本身,可以通过接口名,直接使用
实现类即不能继承静态方法,也不能重写静态方法(废物类)
*/
//通过接口名,直接使用静态方法
注意:
接口中的静态方法不能继承使用,也不能重写
类中的静态方法可以继承使用,不能重写
类继承类的同时实现多个接口
/*
类继承类的同时实现多个接口(重点)
一个人只能有一个亲爹(父类),但是可以有多个干爹(接口)
格式:
public class 子类 extends 父类 implements 接口1,接口2,...{
重写父类和接口中所有的抽象方法
选择性的重写父类的普通方法|接口中的默认方法
}
注意:
父类的普通方法和接口的默认方法相同,子类使用父类的方法
*/
接口的多继承
接口与接口之间:继承关系
package com.itheima.demo13interface;
public interface A {
public abstract void a();
public abstract void show();
public default void show01(){
System.out.println("A接口的默认show01方法");
}
public default void show02(){
System.out.println("A接口的默认show02方法");
}
}
package com.itheima.demo13interface;
public interface B {
public abstract void b();
public abstract void show();
public default void show02(){
System.out.println("B接口的默认show02方法");
}
}
package com.itheima.demo13interface;
/*
1.类与类之间:继承关系(单继承)
public class 子类 extends 父类{ }
2.类与接口之间:实现关系(多实现)
public class 实现类 implements 接口1,接口2,接口3...{}
3.接口与接口之间:继承关系(多继承)
public interface 子接口 extends 父接口1,父接口2...{}
注意:
多个父接口中有相同的默认方法,子接口必须重写默认方法,使用子接口自己重写后的
不重写相同的默认方法,有不确定性,不确定使用哪个父接口的
*/
public interface C extends A,B{
@Override
public default void show02() {
System.out.println("C接口重写A接口和B接口重复的show02方法!");
}
}
package com.itheima.demo13interface;
/*
使用实现类实现了C接口,相当于同时实现了ABC三个接口
需要重写三个接口中所有的抽象方法
*/
public class ABCImpl implements C{
@Override
public void a() {
System.out.println("实现类重写了A接口中的a方法");
}
@Override
public void b() {
System.out.println("实现类重写了B接口中的b方法");
}
@Override
public void show() {
System.out.println("实现类重写了A接口和B接口中的show方法");
}
}
package com.itheima.demo13interface;
public class Demo01 {
public static void main(String[] args) {
ABCImpl abc = new ABCImpl();
abc.a();//实现类重写了A接口中的a方法
abc.b();//实现类重写了B接口中的b方法
abc.show();//实现类重写了A接口和B接口中的show方法
abc.show01();//A接口的默认show01方法
abc.show02();//C接口重写A接口和B接口重复的show02方法!
}
}
接口中其他成员的特点
1.接口中,无法定义成员变量,但是可以定义常量,其值不可以改变, 接口中常量默认使用public static final修饰
接口中的常量修饰符可以省略不写.不写默认也是public static final
常量的命名规则:所有的单词都要大写,多个单词之间可以使用下划线连接 AAA_BBB_CCC 定义一些常用的常量:
公司的名称:"江苏省传智播客股份有限公司北京分公司"
公司的网址: "www.itcast.cn" "www.itheima.com"
公司的地址: 北京市顺义区京顺路99号黑马程序员
2.接口中,没有构造方法,不能创建对象。
3.接口中,没有静态代码块
package com.itheima.demo14interface;
/*
接口中其他成员的特点(使用)
定义一些常用的常量:
公司的名称:"江苏省传智播客股份有限公司北京分公司"
公司的网址: "www.itcast.cn" "www.itheima.com"
公司的地址: 北京市昌平区金燕龙办公楼黑马程序员
*/
public interface MyInter {
public static final String NAME = "江苏省传智播客股份有限公司北京分公司";
public static final String WEB = "www.itheima.com";
String ADDRESS = "北京市昌平区金燕龙办公楼黑马程序员";
}
package com.itheima.demo14interface;
public class Demo01 {
public static void main(String[] args) {
//接口中的常量,通过接口名可以直接使用
System.out.println(MyInter.NAME);
System.out.println(MyInter.WEB);
System.out.println(MyInter.ADDRESS);
//Cannot assign a value to final variable 'WEB' 常量的值不能改变
//MyInter.WEB = "www.itcast.cn";
System.out.println(Math.PI);
}
}