java接口、接口回调、和抽象类的区别

为什么java使用接口:

        有时候必须从几个类中派生出一个子类,继承他们所有的方法,但java不支持多继承而接口可以,为什么类不能实现多继承:因为如果多个父类有同样一个方法,而这个方法有不同的定义那这个子类就不知道实现谁的方法了,但接口的方法即使一样它们也不会产生像类那样的情况,因为它们的方法是没有方法体的

接口的特征:

1.接口用interface修饰

2.接口中所有的成员变量都是public static final修饰的

3.接口中所有的方法默认是public abstract修饰的,所以接口需要被类实现

4.接口中没有构造方法,构造方法用于创建对象(接口没办法new对象)

5.实现接口的类中必须实现接口的所有方法,如果不实现所有的方法那么这个类是抽象类

6.接口和接口可以相互继承,同时可以实现多继承

7.与继承关系类似,接口与实现类之间存在多态性

下面用代码来实现接口的多态:

定义一个Eat接口

public interface Eat {
    public void eat();
}

定义一个Run接口

public interface Run {
    public void run();

定义一个Animal抽象类

public abstract class Animal {
    public abstract void drunk();
    public abstract void sport();

由Cat类来继承animal类和多继承实现eat和run接口

public class Cat extends Animal implements Eat,Run{

	@Override
	public void run() {//实现run方法
		// TODO Auto-generated method stub
		System.out.println("猫在跑");
	}

	@Override
	public void eat() {//实现eat方法
		// TODO Auto-generated method stub
		System.out.println("猫在吃鱼");
	}

	@Override
	public void drunk() {//实现drunk方法
		// TODO Auto-generated method stub
		System.out.println("猫在喝水");
	}

	@Override
	public void sport() {//实现sport方法
		// TODO Auto-generated method stub
		System.out.println("猫在抓老鼠");
	}
	public static void main(String[] args) {
		Cat cat=new Cat();//cat可以使用继承的全部方法
		cat.drunk();
		cat.eat();
		cat.run();
		cat.sport();
		
		Eat eat=new Cat();//多态,Eat接口多态只能使用eat方法它自己的方法
		eat.eat();
		
	}
}

 运行结果如图:

 我们可以看到Cat类实现了多继承,接口也可以产生多态。

接口回调:意思就是先调用后实现,看如下代码:

定义一个Usb接口:

public interface Usb {
    void service();
}

定义一个Computer类 :

public class Computer {
    Usb usb1;//Usb类型的usb1
    Usb usb2;//Usb类型的usb2
    Usb usb3;//Usb类型的usb3
    public void run() {//定义run方法
        System.out.println("电脑开始工作");
        if(usb1!=null) {
            usb1.service();//调用接口中的方法
        }

         if(usb2!=null) {
            usb2.service();//调用接口中的方法
        }

         if(usb3!=null) {
            usb3.service();//调用接口中的方法
        }
    }
}

定义三个类实现USB接口,代码如下:

public class Shubiao implements Usb{

	@Override
	public void service() {
		// TODO Auto-generated method stub
		System.out.println("鼠标开始工作");
	}

}
public class Jianpan implements Usb{

	@Override
	public void service() {
		// TODO Auto-generated method stub
		System.out.println("键盘开始工作");
	}

}
public class Upan implements Usb{

	@Override
	public void service() {
		// TODO Auto-generated method stub
		System.out.println("U盘开始工作");
	}

}

 要想让它们在usb1、usb2、usb3插入什么就让那个工作起来,我们需要用多态的方式实现,如下

public class Test {
	public static void main(String[] args) {
		Computer computer=new Computer();
//usb1是Usb类型的,通过computer调用usb1来定义对象名,而Upan继承了Usb类,
//所以产生了多态,在run方法里调用时,通过面向对象多态的方式实现了调用service方法
		computer.usb1=new Upan();
		computer.usb2=new Jianpan();
		computer.usb3=new Shubiao();
		computer.run();
	}
}

 结果如下:

在computer类的run方法了先调用了Usb接口里的service方法,而不是先实现Usb接口里的方法,我们通过别的类来实现Usb接口中的service方法,再通过多态的方式让usb1、usb2、usb3来实现各自的方法,这种方式就是接口回调。 

接口和抽象类的区别:

1、接口所有的方法默认是public abstract修饰,所有的方法都是抽象方法,而抽象类里可以有普通方法。(java8之后接口方法可以使用default修饰,默认是public)

2.接口中成员实例都是由final修饰的常量,而抽象类不一定

3.接口可以实现多继承,而抽象类不可以

4.一个类实现接口需要实现它所有的方法,而抽象类里有普通方法的时候不用

5.接口不能用new实例化,但可以声明,声明时必须引用一个实现该接口的对象,也就是以上接口回调中的多态。

抽象类是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为规范。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sshm_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值