接口和抽象类详解(接口继承、实现接口、抽象类继承)

先说接口:接口有 接口继承接口接口的实现
单个接口的实现很好理解:如“大雁”类实现了“飞翔”接口
定义“大雁”类的时候直接重写“飞翔”接口中的方法就行了
另一种是接口继承接口
我们假设篮球运动员需要发球,女孩子需要生孩子,那么女子篮球运动员又会发球又能生孩子
我们定义了一个发球的接口和一个生孩子的接口
发球

public interface ServeBall {
	public void ServeBalls();
}

生孩子

public interface GiveBirth {
	public void HaveBaby();
}

注意这里针对女子篮球运动员有两种写法个人感觉工作中是根据工作要求的不同选择不同的写法
像我们前面说的女子篮球运动员又会发球又能生孩子
我们可以选择同时实现这两个接口

public class WomenBasketballPlayer implements ServeBall,GiveBirth {

	@Override
	public void HaveBaby() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void ServeBalls() {
		// TODO Auto-generated method stub
		
	}
	
}

同样我们也可以说生孩子是女运动员的专属权利,让“生孩子”接口去继承“发球”接口

public interface GiveBirth extends ServeBall{
	public void HaveBaby();
}

然后我们去实现生孩子接口就行了

public class WomenBasketballPlayer implements GiveBirth {

	@Override
	public void HaveBaby() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void ServeBalls() {
		// TODO Auto-generated method stub
		
	}
	
}

综上我们可以看出来,如果只是针对女篮球运动员,这两种写法就没什么问题,可要是女游泳运动员呐?不会发球,这么写就有问题了,只能去实现单个的接口。所以这个具体怎么写还要大家仔细慢慢的去分析。再次强调一下,java不支持类的多继承,但是支持类实现多个接口。

Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以(就是interface中只能定义方法,而不能有方法的实现,而在abstract class中则可以既有方法的具体实现,又有没有具体实现的抽象方法),这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。
如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个 新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。
我们继续定义上面类似的方法
我们首先定义了一个抽象的发球类,然后尝试像接口那样定一个方法,但是当我们定义方法的时候,我们遇到了如下的错误提示,这里是和接口不一样的放:1.如果不是抽象方法,需要添加方法体,也就是大括号。2.直接定义一个抽象方法,抽象方法由继承该类的子类实现
在这里插入图片描述
好吧!那我们就定义两个方法,发球的时候需要眼神沟通,那么我就定义一个“眼神沟通”的抽象方法和一个发球的具体方法。

public abstract class AbsServeBall {
	
	public void AServeBall(){
		System.out.println("周琦一样的发球你接不到");
	}
	public abstract void EyeCommunicate();
}

顺便还定义一个生孩子的接口和喂奶的抽象类吧
生孩子

public interface GiveBirth {
	public void HaveBaby();
}

喂奶


public abstract class FeedMilk {
	public void display(){
		System.out.println("FeedMilk");
	}
}

然后我们定义一个超级女子篮球运动员的类看看怎么去实现我们之前定义的方法
这里我们可以看到抽象类也好还是一般的类也好,类里面的已经定义好的具体方法都不需要我们再去实现了,用的时候直接调用就好了,这里只需要实现EyeCommunicate()就行了

public class SuperWomenBasketballPlayer extends AbsServeBall{

	@Override
	public void EyeCommunicate() {
		// TODO Auto-generated method stub
		System.out.println("Go there and get ball!");
	}

}

我们想到我们继承的类中还有一个“周琦一样的发球”,这个方法就是不同的方法,定义一个类的实例然后调用这个方法

public class SuperWomenBasketballPlayer extends AbsServeBall{

	@Override
	public void EyeCommunicate() {
		// TODO Auto-generated method stub
		System.out.println("Go there and get ball!");
	}

	public static void main(String[] args) {
		SuperWomenBasketballPlayer superWomenBasketballPlayer = new SuperWomenBasketballPlayer();
		superWomenBasketballPlayer.AServeBall();
	}
}
得到的结果是:周琦发球你接不到

我们发现这样发球不行,想好好发球,但是这个选项是周琦的,里面只有一个眼神交流还可以,但是发球实在不敢恭维,所以我需要实现一个好的发球方法,这个时候我们就显示那个发球的接口,根据自己的水平去实现一个对应的发球方法
在这里插入图片描述
好了现在我们是一个优秀的女子篮球运动员了,但是我们现在我们需要结婚生孩子了,生孩子的接口刚刚继承了打篮球的接口了,所以我们把接口改一下,算了不改了,重新定义一个打篮球的接口也是一样的,不跟上面重复了
继承了周琦发球的类,只用了里面眼神交流的方法,不想用他的发球方式,然后实现了发球的接口,然后到了年纪需要结婚,然后实现了生孩子的接口,那么现在我们这个类实例就能有这几种方法了
在这里插入图片描述
接下来我们需要给孩子喂奶,但是我们突然发现我们给孩子喂奶的方法是一个抽象类中的抽象方法,这里我们当然可以给喂奶定义成一个接口去实现,但是我偏不,来看看这样怎么写。但是我们这个类已经继承了一个抽象类了,java又不支持多继承,所以直接继承这个喂奶的抽象类的路被堵死了,那我们就看看我们继承的这个类在上一层能不能继承喂奶类,答案是可以的
一样的,抽象类中定义了具体方法,所以跟其他类的方法是一样的,使用的时候调用就好了
在这里插入图片描述
这样就可以调用喂奶的方法了
在这里插入图片描述
综上,上面我们需要实现的功能都已经实现了,但是程序如何写的优雅整洁,这就不是一句话两句话能够说的清楚的了,在对设计模式仔细研究的同时还需要自己的日积月累。
如果觉得对你有帮忙,欢迎打赏

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值