Java基础知识:抽象类和接口

综合技术 2017-06-17

之所以将抽象类和接口放在一起做笔记,是因为他们之间很难区分又各自独立。在学习完Java程序设计的三大特点(封装、继承、多态)之后,我最大的收获是,慢慢理解了Java语言这种面向对象程序设计的优越性,它既能保持自身独立性又在不断进化、发展的。如果说封装和继承是实现Java多态性的基础,那我个人觉得抽象类和接口更是为多态提供了非常好的支持。

一、抽象类

从形式上来说,用abstract修饰的类就是抽象类。抽象类是不完整的,只能做基类,且不能够实例化(不能new)。

通俗来讲,抽象类它本身不做任何事情,它是去要求别人来实现它的规范的。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式有派生类来实现。抽象类的实现要用到继承,不然你造出来它就没有意义。

使用抽象类必须注意以下几点:

1.抽象类只是一个引用而已,不能被实例化,实例化的工作要交给它的子类;

2.抽象方法必须由子类来进行重写;

3.在一个类中,只要有一个方法被定义为抽象方法(被abstract修饰了),那么这个类就必须被定义为抽象类(类名也要被abstract修饰);

4.抽象类中可以包含具体方法,也可以不包含;

public abstract class ChouX {

public abstract void method1();

public void method2() {

}

}

5.子类中的抽象方法不能与父类的抽象方法同名;

6.abstract不能与private、static、fanal或native并列修饰同一个方法。

代码实例:

//抽象类
public abstract class Animal {
    public abstract void shout();
}
1 //猫子类
2 public class Cat extends Animal {
3     public void shout() {
4         System.out.println("喵~~");
5     }
6 }
//Dog子类
public class Dog extends Animal {
    public void shout() {
        System.out.println("汪汪汪。。。");
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        Animal a1 = new Dog();
        Animal a2 = new Cat();
        a1.shout();
        a2.shout();
    }
}

Output:

二、接口

对于面向对象编程来说,抽象是它的一大特征。在java中,可以通过两种形式来体现OOP的抽象:抽象类和接口。

接口(interface),在软件工程中,接口泛指供别人调用的方法或者函数。

格式:

[public] interface InterfaceName{

}
//例子
interface Door{
public abstract void open();
public abstract void close();
}

要让一个类遵循某组特定地接口需要使用implements关键字。

格式:

class ClassName implements Interface1,Interface2,Interface3....{}(允许一个类遵循多个特定的接口)

三、抽象类和接口的区别

1.语法层面的区别

首先,抽象类可以提供成员方法实现的细节,而接口中只能存在public abstract 方法;

其次,抽象类中的成员变量可以是各种类型的,而接口中的成员只能是public static final类型的;

再者,接口中不能含有静态代码块和静态方法,而抽象类可以;

最后,一个类只能继承一个抽象类,而可以继承多个接口。

2.设计层面上的区别

首先,抽象类是对一种事物的抽象,即对类的抽象,而接口是对行为的抽象。

再者,抽象类作为很多子类的父类,它是一种模板式的设计。而接口是一种行为规范。

最后,在一个抽象类中,如果你想更改一个方法,可以直接在抽象类中实现,子类可以不进行更改。而这种事情发生在接口上,那么所有链接这个接口的类都需要更改。

总结:说了这么多,其实原理只要想通了还是蛮简单的。对于抽象类,就比如说,你定义一个抽象类,来做父类。你有可能对一个类的描述就没写全,或者它几年以后升级换代了。那也总有保留的吧。这时候你不必大动干戈把整个父类统统推翻,你只需要在子类中填上具体的更改的方式就可以了。想改什么不改什么,什么时候改都由你自己决定。这样灵活性、重用性是不是就高了。而抽象类与接口的区别,就像鱼和船都能在水里游吧,那他们也不是同一个类啊。你也就别想着把鱼和船划到一个类当中,但是这个“游”的动作是它们都有的,我们就把这个“游”的动作设置成一个接口,鱼能用,船能用,将来你想描述任何会“游”的事物的时候都可以用上它。

网上有个很有取的案例:

可以好好思考一下,方便形象理解抽象类和接口的区别。

1 //接口
2 interface Alram{
3   void alarm();
4 }
1 //抽象类
2 abstract class Door{
3   void open();
4   void close();
5 }
1 //报警门最后的设置
2 class AlarmDoor extends Door implements Alarm{
3   void open(){
4   }
5   void close(){
6   }
7   void alarm(){
8   }
9 }

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-06/144871.htm

您可能感兴趣的

My Experience with Voxxed Days Singapore event Brief history about the event This year was the first time Voxxed Days event was happening in Singapore held on 2nd June 2017. Launched in 2015,...
安卓应用启动流程(从点击Launcher图标开始)... 阅读这篇文章,需要对Binder有一定了解。我们通过从桌面启动一个应用讲解启动一个安卓应用的流程。 远程调用 这里要先明确一个概念,就是所谓的远程调用即跨进程调用,安卓通过Binder来实现,其实现的大致原理,每个支持Binder的进程都有一个Binder线程池,当我们通过Binder远程调...
Java 泛型一览笔录 1、什么是泛型? 泛型(Generics )是把类型参数化,运用于类、接口、方法中,可以通过执行泛型类型调用 分配一个类型,将用分配的具体类型替换泛型类型。然后,所分配的类型将用于限制容器内使用的值,这样就无需进行类型转换,还可以在编译时提供更强的类型检查。 2、泛型有什么用...
GAE: Python and Java services together u... I have some Python services and I have defined handler locations for them in app.yaml I also have Java services and I have configured web.xml. I w...
java基础知识 ---恢复内容开始--- 重复复习了一遍java,总结一下java的基础知识。 1.java源文件中最多只能有一个public类。 2.标识符由字母、数字、_(下划线)和$符号组成,数字不能开头。 3.包名:所有字母都小写。 类名和接口名:所有单词首字母大写。 变量名和函数名...