21-03-23接口

1.基本性质

  • 接口使用interface来定义
interface Usb {
	void start();

	void stop();

}
  • java中,接口和类是并举的两个结构

2.接口成员的的定义

  • JDK7以前:只能定义全局常量和抽象方法

    1. 全局常量:public static final的,但是书写时,可以省略不写
    2. 抽象方法:public abstract的 也可以省略
  • JDK8:还可以定义静态方法,默认方法

    1. 接口中定义的静态方法,只能通过接口来调用,不能直接调方法。

      格式:接口名.方法名

      public class 接口练习3 {
      	public static void main(String[] args) {
      		Filial.money();
      	}
      }
      
      interface Filial {// 孝顺的
      	public static void money() {
      		System.out.println("挣钱给妈妈花");
      	};
      }
      
    2. 通过实现类的对象,可以调用接口中的默认方法

      如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写的方法。

      public default void drink(){
      System.out.println(“给妈妈喝水”);
      }

         	Teenager te = new Teenager();
         	te.drink();
      
    3. 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父中的同名同参数方法。———>类优先原则

    4. 如果实现类实现了多个接口,而这多个接口定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错——>接口冲突。

      这时我们必须在实现类中重写此方法。

    5. 如何在子类()的方法中调用父类,接口中被重写的方法。

      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.如果子类中接口和父类属性重名和方法重名

  1. 对于属性,没有优先原则。

    如果调父类属性,则用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();
	}

}
  1. 对于方法

    则优先父类。

    类优先原则。

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("代理人去谈");	
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值