抽象类与接口

我发现无论是在教学,还是在学习的过程中,由问题导入,然后引出概念、性质、结论的路线往往要比一开始就直接介绍概念要好的多。学习者容易理解,也更容易记住。本文采用问题导入:

上一篇文章介绍“多态”,代码如下

public class Test12 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Animal1 a= new Cat1();
		a.speak();
		a =new Dog1();
		a.speak();
	}
}
class Animal1{
	String name;
	int age;
	
	public void speak(){
		System.out.println("我是动物,不知道怎么叫!!");		
	}
}
class Cat1 extends Animal1{
	//Overriding
	public void speak(){
		System.out.println("我是小猫,喵喵喵!");
	}
}
class Dog1 extends Animal1{
	//Overriding
	public void speak(){
		System.out.println("我是小狗,汪汪汪!");
	}
}

可以看到的是,父类animal的方法speak() 在写完以后,根本就没有用到,而且子类重写了该方法。因此该方法中的类容几乎就是没有用的,不需要写的。而且,有时候父类在定义该方法时没有想好要写什么类容。那么有什么方法可以解决这两个问题吗?

由此,引入“抽象方法”,code如下:

public class Test13 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Animal2 a= new Cat2();
		a.speak();
		
	}
}
abstract class Animal2{
	String name;
	int age;
	
	abstract public void speak() ;
}
class Cat2 extends Animal2{
	//Overriding
	public void speak(){
		System.out.println("我是小猫,喵喵喵!");
	}
}


上面代码中speak()方法没有了“主体”,但是在前面加入了abstract进行修饰,而且值得注意的是在 animal类前面也加了abstract进行修饰。

概念:

1、使用abstract关键字类修饰的方法,叫做“抽象方法”。   

2、使用abstract关键字来修饰的类,叫做“抽象方法”。

在使用的时候,有以下3点需要注意:

1、“抽象方法”不能有主体(当然如果你写了主体,在编译的时候也会报错)

2、抽象类中不一定有抽象方法,但是含有抽象方法的类一定是抽象类

3、当一个类继承抽象类,则该子类需要实现抽象类的所有抽象方法。


下面看“接口”,上code

public class Test15 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Phone p=new Phone();
		Camara c=new Camara();
		Computer cp=new Computer();
		
		cp.start(p);
		cp.stop(p);
		
		cp.start(c);
		cp.stop(c);

	}

}

//定义一个 USB接口
interface  Usb{
	
	public void start();
	public void stop();
}

//定义一个手机 ,实现了USB接口
class Phone implements Usb{

	@Override
	public void start() {
		// TODO Auto-generated method stub
		System.out.println("我是手机,开始工作了!");
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub
		System.out.println("我是手机,停止工作了!");
	}
	
}
//定义一个照相机,实现USB接口
class Camara implements Usb{
	@Override
	public void start() {
		// TODO Auto-generated method stub
		System.out.println("我是相机,开始工作了!");
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub
		System.out.println("我是相机,停止工作了!");
	}
}
//定义 电脑类
class Computer {
	public void start(Usb usb){
		usb.start();
	}
	public void stop(Usb usb){
		usb.stop();
	}
}

从以上代码可以看出,接口中的方法全部是抽象方法,没有一个不是。

接口的概念在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。

注意事项:

1、接口不能被实例化。

2、接口中可以有变量。但是变量不能用private 或者protected 修饰。

  a.接口中的变量,本质上是static 的,final的。不管是否加了static 、final修饰符。

  b.在开发过程中,经常将全局变量 放在接口中,方便调用。调用方法:接口名.变量名。

3、一个接口不能继承其他类,但是可以“继承”其他接口。

4、接口中的所有方法都是抽象方法,都要被实现。


写完了抽象类和接口,那么他们之间有什么区别与联系呢?

1、抽象类(abstract class)和接口(interface)之间最大的区别就是,抽象类中的方法有抽象方法也有已实现的方法,而接口中全部都是抽象方法。(这是abstract class 相对于interface一个很大的优点,因为如果一个类继承了该abstract class,当abstract class中加入新的实现的方法时子类就会直接得到这个方法,而interface 中如果增加一个抽象方法,则实现interface的所有类都会报错。

2、使用抽象类,那么继承这个抽象类的子类类型就比较单一,因为子类只能单继承抽象类;而子类能够同时实现多个接口,因为类型就比较多。接口和抽象类都可以定义对象,但是只能用他们的具体实现类来进行实例化。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值