详解Java抽象类和接口

抽象类

使用了关键字abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。特征:

1、抽象类是不完整的(可以理解为类中的方法并没有完全实现),并且它只能用作基类。

2、抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误。

3、在继承抽象类时,必须覆盖该类中的每一个抽象方法

示例:设计一个门类,因为是普通门和指纹门开门的方式是不同的:普通门用钥匙;指纹门可以输入指纹、可以按密码或者用钥匙。但是,二者关门的方式都一样(把门一堆就可以关上了)。这里就符合抽象类的设计思路,把开门设计成抽象方法,具体方法内容交给子类去实现;而把关门设计成普通方法,子类复用该方法就好。

普通门和指纹门

代码实现如下:

public abstract class Door{

public abstract void open();

public void close(){

System.out.println("关门!");

}

}

public class CommonDoor extends Door {

@Override

public void open() {

System.out.println("普通门用钥匙开门。");

}

}

public class FingerprintDoor extends Door {

@Override

public void open() {

System.out.println("指纹门用钥匙、指纹、密码都可以开门。");

}

}

接口

Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口通过关键字interface来定义,类使用接口通过关键字implements来实现。例如:

public class A implements B

特征:

1、 一个类可以实现多个接口,接口弥补了类的不能多继承缺点。

2、 Java接口本身没有任何实现,只描述行为,所以Java接口比Java抽象类更抽象化。

3、 接口不是类,不能使用new 来实例化一个接口。

4、 接口中的方法可以有参数列表和返回类型,但不能有任何方法体。

5、 接口中可以包含字段,但是会被隐式的声明为static和final。

6、 接口中的字段只是被存储在该接口的静态存储区域内,而不属于该接口。

7、 接口中的方法可以被声明为public或不声明,但结果都会按照public类型处理。

8、 实现一个接口时,需要将被定义的方法声明为public类型,否则为默认访问类型,Java编译器不允许这种情况。

9、 如果没有实现接口中所有方法,那么创建的仍然是一个接口。

10、 扩展一个接口来生成新的接口应使用关键字extends,实现一个接口使用implements。

示例:

还是门这个类,除了普通门和指纹门,还有警报门,它除了具有开门关门的方法外,还可以实现告警功能,而告警功能并不具备门的普遍性,因此合理的做法是把告警设计成一个接口,当有些门具备告警功能时就去实现告警接口。

警报门

代码实现如下:

public interface Alarm{

public void alarm();

}

public class AlarmDoor extends Door implements Alarm {

@Override

public void alarm() {

// TODO Auto-generated method stub

System.out.println("警报门有告警功能。");

}

@Override

public void open() {

System.out.println("警报门用钥匙、指纹、密码都可以开门。");

}

}

面向接口编程的理解

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。“面向接口编程”中的“接口”可以说是一种从软件架构的角度、从一个更抽象的层面上指那种用于隐藏具体底层类和实现多态性的结构部件。这里的接口是一种思想层面的用于实现多态性、提高软件灵活性和可维护性的架构部件,而具体语言中的“接口”是将这种思想中的部件具体实施到代码里的手段。接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。接口的本身反映了系统设计人员对系统的抽象理解。

接口和抽象类的区别

1.接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。

2.实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

3.接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承。

4.接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。

选择接口还是抽象类

1. 如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。

2. 如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试开发Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值