接口
1.基本性质
- 接口使用interface来定义
interface Usb {
void start();
void stop();
}
- java中,接口和类是并举的两个结构
2.接口成员的的定义
-
JDK7以前:只能定义全局常量和抽象方法
- 全局常量:public static final的,但是书写时,可以省略不写
- 抽象方法:public abstract的 也可以省略
-
JDK8:还可以定义静态方法,默认方法
-
接口中定义的静态方法,只能通过接口来调用,不能直接调方法。
格式:接口名.方法名
public class 接口练习3 { public static void main(String[] args) { Filial.money(); } } interface Filial {// 孝顺的 public static void money() { System.out.println("挣钱给妈妈花"); }; }
-
通过实现类的对象,可以调用接口中的默认方法
如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写的方法。
public default void drink(){
System.out.println(“给妈妈喝水”);
}Teenager te = new Teenager(); te.drink();
-
如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父中的同名同参数方法。———>类优先原则
-
如果实现类实现了多个接口,而这多个接口定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错——>接口冲突。
这时我们必须在实现类中重写此方法。
-
如何在子类()的方法中调用父类,接口中被重写的方法。
drink();//被重写的方法
super.drink();//调父类中被重写的方法
Filial.super.drink();//调接口中的被重写的方法
-
3.接口不能定义构造器!意味着接口不可以实例化
4.java开发中,接口通过让类(implements)的方式来使用
class Flash implements USB{
@Override
public void start() {
System.out.println("U盘开启工作");
}
@Override
public void stop() {
System.out.println("U盘结束工作");
}
}
如9.果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
如果实现类没有覆盖接口中的所有抽象方法,则此实现类仍为一个抽象类
5.java类可以实现多个接口–>弥补了java单继承的局限性。
格式:class AA extends BB implements CC,DD,EE;
6.接口与接口之间可以继承,而且可以多继承
7.接口的具体使用,体现多态性。
8.接口,实际可以看做一种规范。
就像我们的电脑驱动,电脑里预留了接口,如果驱动无法以一种规范的格式来重写方法,则电脑就无法使用。
9.在类中可以定义接口但不对其实例化
如在工厂模式的代理人代码中,对于接口的使用。可以通过构造器从外部传入一个使用同一接口的类,这样就可以调用传入类中的重写的方法。
10.接口的匿名使用
- 可以定义一个接口,但后面要new一个使用它借口的类,不能new接口
Usb f1 = new Flash();
具体代码
package 接口;
public class UsbTest {
public static void main(String[] args) {
Computer com = new Computer();
//1.创建了接口的非匿名实现类的非匿名对象
Usb f1 = new Flash();
com.transferData(f1);
//2. 创建了接口的非匿名实现类的匿名对象
com.transferData(new Printer());
//3. 创建了接口的匿名实现类的非匿名对象
Usb mp3 = new Usb(){
@Override
public void start() {
System.out.println("mp3开始工作");
}
@Override
public void stop() {
System.out.println("mp3结束工作");
}
};
com.transferData(mp3);
//4. 创建了接口的匿名实现类的匿名对象
com.transferData(new Flash(){
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机结束工作");
}
});
}
}
class Computer {
public void transferData(Usb usb) {
usb.start();
usb.stop();
}
}
interface Usb {
void start();
void stop();
}
class Flash implements Usb {
public void start() {
System.out.println("u盘开始工作");
}
@Override
public void stop() {
System.out.println("u盘结束工作");
}
}
class Printer implements Usb {
@Override
public void start() {
System.out.println("打印机开始工作");
}
@Override
public void stop() {
System.out.println("打印机结束工作");
}
}
11.如果子类中接口和父类属性重名和方法重名
-
对于属性,没有优先原则。
如果调父类属性,则用super.变量名
如果调接口的属性,则用接口名.变量名
package com.atguigu.java1;
interface A {
int x = 0;
}
class B {
int x = 1;
}
class C extends B implements A {
public void pX() {
//编译不通过。因为x是不明确的
// System.out.println(x);
System.out.println(super.x);//1
System.out.println(A.x);//0
}
public static void main(String[] args) {
new C().pX();
}
}
-
对于方法
则优先父类。
类优先原则。
12.工厂模式
-
分为代理人和被代理人。
通过代理人调用被代理人,可以控制访问,提高安全性。
package 借口练习2;
public class 工厂模式 {
public static void main(String[] args) {
Agent a = new Agent(new RealStar());
a.singer();
a.confer();
}
}
//接口
interface Star{
void singer();
void confer();
}
//被代理人
class RealStar implements Star{
@Override
public void singer() {
// TODO Auto-generated method stub
System.out.println("明星自己唱");
}
@Override
public void confer() {
// TODO Auto-generated method stub
}
}
//代理人
class Agent implements Star{
private Star real; //定义接口但不实例化
public Agent() {
}
public Agent(Star real) {
this.real = real;
}
@Override
public void singer() {
real.singer();
}
@Override
public void confer() {
System.out.println("代理人去谈");
}
}