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

栏目: Java · 发布时间: 8年前

内容简介:Java基础知识:抽象类和接口

之所以将抽象类和接口放在一起做笔记,是因为他们之间很难区分又各自独立。在学习完 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基础知识:抽象类和接口

二、接口

对于面向对象编程来说,抽象是它的一大特征。在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


以上所述就是小编给大家介绍的《Java基础知识:抽象类和接口》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Linear Optimization

Introduction to Linear Optimization

Dimitris Bertsimas、John N. Tsitsiklis / Athena Scientific / 1997-02-01 / USD 89.00

"The true merit of this book, however, lies in its pedagogical qualities which are so impressive..." "Throughout the book, the authors make serious efforts to give geometric and intuitive explanations......一起来看看 《Introduction to Linear Optimization》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具