对接口的一些理解

萌新第一次写博客。。。
初学面向对象时,对接口和抽象方法有点搞不清楚,所以就总结一波~~

一:接口的一些基本知识
接口是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口不可以被实例化但是可以被继承。在我的理解中,接口就是规定了被继承类必须实现的方法,是对类所能实现的方法的扩展。(这句话好像有点不好理解,待会有例子说明)。
在接口中,所有的变量都默认为public static final(而且只能这样),所有的方法默认都是public abstract(只能这样)。
下面解释为什么变量要这么声明。首先接口是支持多继承的,用static就可以区分不同接口的同名变量。因为用了static,所以这个变量能所有实现这个接口类的类改变,这明显不合理。(ps:这只是我的个人理解)
二:接口与抽象类的区别:
抽象类是“父类子类是或不是的关系”,是对一个事物的抽象。接口是对行为的抽象,是有或没有的关系。干说没意思,上一个老师给我们说过的例子:
假设有一款游戏,每种装备都都有它的名称,价格。同时假设每种装备都有他的被动技能,但是有的装备具有攻击力加成特性,攻速加成特性等等。有的装备具有护甲特性,血量加成等等。
在游戏中。只要是装备的类,都可以继承一个父类:

public abstract class equip {
	String name;
	int prince;
	public abstract void skill();
	
}

有的装备能攻击,有的装备能防守,所以我们要对行为进行抽象,就可以用接口来实现。

interface interfaceAck {
	 void atk();
}
interface interfacePro{
	 void protect();
}

现在用有一件装备是法杖吧,他只能攻击而不能防守。所以他要继承装备这个父类以及“拥有”攻击这个接口。

class wand  extends equip implements  interfaceAck{//注意:继承父类要写在前面,实现接口要写在后面
	//首先实现父类的方法,抽象的方法是一定要实现的,非抽象的可以不用实现
	public void skill() {
		System.out.println("我拥有一项被动技能");
	}
	//然后实现接口的方法,这个是一定要实现的,而且继承的接口中有几个抽象方法,就要实现几个方法
	public void atk() {
		System.out.println("我是法杖,我能攻击");
	}	
}

另外有一件装备盔甲,它只能保护而不能攻击:

class armor extends equip implements interfacePro{
	public void skill() {
		System.out.println("我拥有一项被动技能");
	}
	public void protect() {
		System.out.println("我是盔甲,我能保护");
	};

三:接口与接口之间的继承,接口与抽象类之间的继承:
直接上代码:

interface A{
	void funA();
}
interface B{
 void funB();
}
interface C extends A,B{
	void funC();
}
class D implements C{
	public void funA() {}
    public void funB() {}
    public void funC() {}
}
abstract class E implements C{
	//抽象类继承接口不需要实现接口的方法,但是继承了E这个类的子类需要实现接口中没有被父类实现的的方法
	
}

四:接口的作用:
方便维护,管理。还起到约束的作用。
举例:(这是一个不怎么好的例子)

class dog{
	void call() {
		System.out.println("旺旺");
	}	
}
class cat{
	void call() {
		System.out.println("喵喵");
	}
}
//现在test类要模拟动物的叫声
class test{
	public void fun(String animal) {
	if(animal=="dog") {
		dog dog=new dog();
		dog.call();
	}
	if(animal=="cat"){
		cat cat=new cat();
		cat.call();
	}
	}
}

这样的代码在我初学的时候觉得很好,但现在就不是这样想了。现在开始改善代码,首先想到的是用多态来减少代码的冗余。

class animal{
	 void call() {}
	
}
class dog extends animal{
	void call() {
		System.out.println("旺旺");
	}	
}
class cat extends animal{
	void call() {
		System.out.println("喵喵");
	}
}
//现在test类要模拟动物的叫声
class test{
	animal animal;
	public void fun(String a) {
	switch(a) {
	case "dog":
		animal=new dog();break;
	case "cat":
		animal=new cat();break;
	}
	animal.call();
	
	}
}

现在代码给了别人,别人想在此基础上加一个狮子类并加一个叫的方法,于是写成了这样

class lion extends animal{
	void roar() {//吼叫
		System.out.println("吼吼");
	}
}

这样的话我的多态就用不了了。
再改进:在父类使用abstract修饰方法,这样子类就必须实现这个call()方法,这样就可以用多态了。但是现在我们要新加一个类叫鱼,鱼不会叫但我们又必须实现让他叫的方法,而且知道它不会叫也不会调用这个方法。我觉得还是有点怪。
其实可以用接口来解决这个问题。代码如下:

abstract class animal{
	int name;
}
interface animalcall{
	void call();
}
class dog extends animal implements animalcall{
	public void call() {
		System.out.println("旺旺");
	}	
}
class cat extends animal implements animalcall{
	public void call() {
		System.out.println("喵喵");
	}
}
class lion extends animal implements animalcall{
	public void call() {//吼叫
		System.out.println("吼吼");
	}
}
//现在test类要模拟动物的叫声
public class interfaceTest{
	animalcall animal;
	public void fun(String a) {
	switch(a) {
	case "dog":
		animal=new dog();break;
	case "cat":
		animal=new cat();break;
	case "lion":
		animal=new lion();break;
	}
	animal.call();
	
	}
}

其实我我对它的作用理解的也不是很深~~

猜你喜欢

转载自blog.csdn.net/qq_42902163/article/details/88636290
今日推荐