java抽象类和接口

关于java抽象类,以前我一直不明白这个抽象类到底有什么作用,现在回想起来,抽象类应该生来就是用来被继承的,没有继承者的抽象类都没有意义,因为它不能new一个实例。

想象一个场景:猫,狗,猴子等都是动物,在做对象设计的时候,可以定义一个他们的共性Animal类,将这个类定义为抽象的。

Animal:

public abstract class Animal{
    public String behavior;
    public abstract void eat();
    public abstract void drink();
    public void showBehavior(){
         System.out.println("我的行为:"+behavior)
    }
}
然后我们再定义一个代表猫的类,让他继承Animal,实现它的eat()和drink()方法。

Cat:

/**
	猫类
*/
public class Cat extends Animal{
	
	/*-------实现animal抽象方法---------*/
	public void eat(){
		behavior = "我吃了鱼";
	}
	public void drink(){
		behavior = "我喝了鱼汤";
	}
	
}
然后我们再定义一个代表狗的类,也让他继承Animal

/**
	狗类
*/
public class Dog extends Animal{
	
	/*-------实现animal抽象方法---------*/
	public void eat(){
		behavior = "我吃了骨头";
	}
	public void drink(){
		behavior = "我喝了骨头汤";
	}
	
}

我们写个Practise类测试一下;

public class Practise{
	
	public static void main(String [] args){
		Animal animal = new Animal();
	}
	
}
这里我先new一个Animal的实例,然后编译,毋庸置疑,它是不会编译通过的,这也说明了我前面讲的,没有继承者的抽象类毫无单独存在的意义。

我在来写一个正常的

public class Practise{
	
	public static void main(String [] args){
		Cat cat = new Cat();
		cat.eat();
		cat.showBehavior();
		cat.drink();
		cat.showBehavior();
		Dog dog = new Dog();
		dog.eat();
		dog.showBehavior();
		dog.drink();
		dog.showBehavior();
		
	}
	
}

编译运行上面的代码,会得到这样的结果:

我的行为:我吃了鱼;

我的行为:我喝了鱼汤;

我的行为:我吃了骨头;

我的行为:我喝了骨头汤;

从以上的列子可以看出,抽象类的作用,首先,它可以定义抽象方法来定义其子类的行为,而且还可以定义子类的公用方法;我个人认为抽象类比接口的功能要多;

关于接口呢?接口只能定义其实现类的公用行为,而不能定义方法;

在平时的工作中,我们经常这样定义项目的目录结构

--src

----controller

----dao

------impl

----service

------impl

dao中先是定义一个接口,然后再impl中定义一个dao接口的实现类。

service也是一个道理。

在controller中实例化service接口

这种结构的特点是什么呢?

IUserService userService = new UserServiceImpl();

userService.showUserBasicInfo();

在接口中有showUserBasicInfo()这个方法,实现类必须重写这个方法,你就能够调用这个方法,而在实现类里面的方法就不能调用到了。我觉得面向接口开发的好处就是,只会向调用者提供我接口中的方法,至于实现类里面的方法你就不能调用到了,就相当于实现类自己的方法私有化



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值