Java中那些我不太明白的小知识(四)


接(三)

  • 接口的定义:

接口的定义跟类定义的方式类似,但是使用到了interface关键字,但是接口不是一个类,而是一个引用数据类型
定义格式:

public interface 接口名{
	//成员变量,有final修饰,所以必须初始化
	//成员方法,有abstract修饰,所以不能有方法体
	//默认方法,default,拥有方法体,当该接口被实现是,该默认方法非强制实现,可选择完成
}
  • 接口的实现:使用implements关键字,下图中B类实现了A接口,可以说B类是A的子类,可以说B类是接口A的实现类,格式与继承类似。
     
class B implements A{
	//必须重写接口A重的抽象方法
	//默认方法的重写可以选择完成
}
  • 如果一个非抽象子类实现了接口,那么该子类必须:

1.子类必须重写接口中的所有抽象方法
2.接口中的默认方法可以选择完成

3.如果是一个抽象类实现了接口,那么不用重写接口中的抽象方法

  • 那么为什么要定义接口呢?

官方解释:降低耦合度
我的理解:方便操作

下面举个例子,代码摘自:https://blog.csdn.net/qq_24886697/article/details/78580509

//创建人接口
public interface People {
	//人都会吃饭和睡觉
	void eat();
	void sleep();
}

创建两个个类继承该接口

package two;

class student implements People{
	//student实现了接口People 由于student不是抽象类,所以必须重写父类中的抽象方法
	@Override
	public void eat() {
		System.out.println("学生去食堂吃饭");
	}
	@Override
	public void sleep() {
		System.out.println("学生去宿舍睡觉");
	}
}
class teacher implements People{
	//teacher实现了接口People 由于teacher不是抽象类,所以必须重写父类中的抽象方法
	@Override
	public void eat() {
		System.out.println("老师回家吃饭");
	}

	@Override
	public void sleep() {
		System.out.println("老师回家睡觉");
	}
}
public class School {
	public static void main(String[] args) {
		People a = new student(); //创建一个接口类对象a,可以调用student中的方法
		
		People b = new teacher();//创建一个接口类对象a,可以调用teacher中的方法
		
		School sc = new School();
		sc.startEat(a); //执行的结果,学生回宿舍吃饭
		sc.startEat(b); //执行的结果,老师回家吃饭
	}
	public void startEat(People people) {
		people.eat();
	}
	public void schooleIsOver(People people) {
		people.sleep();
	}
}
  • 根据以上代码来回答,为什么要定义接口:

我在开饭的时候完全可以直接调用"studens.eat();"、"teacher.eat();"啊。 接着看。 有一天,学校里来了第三种人,家长。 家长既不是去寝室睡觉也不是回家睡觉,而是旅馆睡觉,既不是去食堂吃饭也不是回家吃饭,而是去下馆子。 这个时候学校这个系统该怎么处理呢? 如果原来没有定义"人"这个接口那就麻烦啦,所有用到人的地方代码都要改。 现在不一样了,我可以直接定义一个类:家长,这个类实现人这个接口就可以了。
————————————————
好,看代码: 

lass parent implements People{
	public void eat() {
		System.out.println("下馆子");
	}
	public void sleep() {
		System.out.println("住旅馆");
	}
}
People e = new parent();
sc.startEat(e);

 在调用的时候不需要修改任何代码,还和原来一样:     人 c=new 家长();        学校.开饭(c);        学校.放学(c); 轻松搞定家长的食宿问题! 这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性! 不知道初学者看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办! 先声明一下,这个案例可不是我想出来的~~ 然后我们就很好理解了,为什么用别人的东西要实现接口呢?很直接的一个原因是这样一来,编程的复杂度就可能会大大降低了。

发布了6 篇原创文章 · 获赞 9 · 访问量 498

猜你喜欢

转载自blog.csdn.net/weixin_42597414/article/details/104524642