抽象类和接口中的细节

来源:互联网 发布:nginx 禁止某域名访问 编辑:程序博客网 时间:2024/05/17 23:25

概念

首先一句很简单的话区分出抽象类与接口:


抽象类

在java中,被关键字abstract声明的类成为抽象类(同时也有抽象方法--被abstract声明的方法)


接口

在java中,被关键字interface声明的类成为接口


抽象类与接口的相似之处

1、在抽象类中,可以有一个或多个抽象方法,也可以没有抽象方法,但是,如果一个类只要存在着一个抽象方法,这个类就必须被声明为abstract,如:

/** * 抽象类里可以没有抽象方法 * /abstract class Person1{    public void run(){}    public void eat(){}} /** * 如果类里存在一个抽象方法,就必须将该类声明为abstract * /abstract class Person2{abstract void run();public void eat(){}}/** * 这样就是错的 * /class Person3{abstract void run();public void eat(){}}
2、接口和抽象类都不能够实例化对象
3、接口可以通过继承来扩展接口


抽象类与接口的区别
1、抽象类只能被单继承,而接口可以多继承
2、抽象类中可以没有抽象方法,也可以抽象方法和非抽象方法共存,但是接口是一个完全抽象类,即接口中的方法必须全部是abstract声明的方法。

3、继承抽象类的子类用extends关键字,实现接口的类用implements。


extends与implements同时使用的细节问题

如果一个类不仅继承于一个类,而且同时也实现某个接口或者多个接口,那么extends必须写在前面,否则会编译出错,如:(下例同时说明一下需要注意大问题)

interface CanFight{    //接口的方法默认为public,也必须为publicvoid fight();}interface CanSwim{void swim();}interface CanFly{void fly();}class ActionCharacter{//类的方法默认为protected,但是如果需要被继承,就得显式定义为publicpublic void fight(){};}/** *1、extends 与 implements同时使用的话,必须把extends放前面,否则回编译出错; *2、另外,Hero类继承了三个接口,却只实现了其中两个接口的方法,是因为它也继 *承了ActionCharacter,在ActionCharacter里定义了该方法,也就意味着它的子类 *Hero也拥有该方法,不再需要定义;假如ActionCharacter没有定义fight()方法,在 *Hero里就得显示定义fight()了; *3、这里只是为了说明一些注意的地方,但是实际开发中,有关接口的尽量避免方法同名 */class Hero extends ActionCharacter implements CanFight,CanSwim,CanFly {public void swim(){};public void fly(){}//这里已经隐含了 public void fight(){};从父类ActionCharacter获得}

接口中的域自动并隐式是public、static、final,证明如下:

public class Test3{public static void main(String[] args) {Person xian = new Xian();Person jia = new Jia();//无法赋值,错误为“The final field Person.age cannot be assigned”,//证明接口中的域隐式为final//xian.age = 22;//可以直接用类名引用变量,证明接口中的域隐式为staticSystem.out.println(Xian.name == Jia.name);}}class Xian implements Person{}class Jia implements Person{}interface Person{int age = 10;String name = "person";}


接口与抽象类的选择

如果一个类的作用使用类被继承的,不做任何具体实现,那么优先选择接口,而且抽象类和接口的产生,就是用来被继承或者实现,如果在抽象类里写一下具体实现方法,意义既不是很大(当然也有特殊情况,比如说在设计模式中,抽象类与接口看需求来使用),因为抽象类和接口的设计很多都是用来解耦和减少代码重复的。


那么到底有哪些接口的好处?(本处引用一位大牛的回答)

1、重要性:

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。

2、简单、规范性:

    如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。

3、维护、拓展性:

    比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。 可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。 如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。

4、安全、严密性:

    接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。



0 0