抽象类接口

Posted ldd525

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象类接口相关的知识,希望对你有一定的参考价值。

抽象类+接口

一、抽象类

1.1 什么是抽象类?

一个类中没有足够的信息来描绘一个具体的对象的类就是抽象类。

1.2 抽象类的特点?

  1. 抽象类中的可以存在抽象方法和非抽象方法。
  2. 抽象类不能被实例化。

1.3 抽象方法

  1. 抽象方法没有方法体。
  2. 抽象方法只能中存在抽象类

1.4 抽象类与抽象方法定义:

抽象类的定义格式

abstract class 类名字 { 

}

抽象方法定义格式:

修饰符 abstract 返回值类型 方法名 (参数列表);

代码示例:

public abstract class A(){//抽象类
    public abstract void show(); //抽象方法
}

1.5 注意事项:

关于抽象类的使用,以下为语法上要注意的细节,虽然条目较多,但若理解了抽象的本质,无需死记硬背。

抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。

理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。

抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。

理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。

抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。

理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。

面试题

一个类可以继承几个父类?(一个,java是单继承语言,但可以多层继承。)


二、接口

2.1 概述

接口是java中的一种引用数据类型,是方法的集合。 果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9)。

2.2 接口的定义

接口的定义类似于类的定义,使用的关键字是interface,也会被编译成.class文件,但需要明确它不是类,而是另外一种数据类型。

引用数据类型:数组、类、接口 接口不能创建对象,但可以被实现,(implements关键字),一个实现接口的类,需要实现接口中的所有的抽象方法,创建实现类的对象,就可以调用这些方法。

2.3 接口的定义

public interface 接口名称{
    //抽象方法
    //默认方法
    //静态方法
    //私有方法
}

抽象方法:使用abstract关键字修饰,可以省略,没有方法体。该方法供子类实现。

默认方法:使用default修饰,不可省略,供子类调用或重写。

静态方法:使用abstract关键字修饰,不可省略,供接口直接调用。

私有方法:使用private关键字修饰,供接口中默认方法或静态方法使用。

示例:

public interface InterfaceName{
    public abstract void method();//抽象方法
    public default void method() {//默认方法
        // 执行语句
    }
    public static void method2() {//静态方法
        // 执行语句
    }
    private void method() {//私有方法
        // 执行语句
    }

}

2.3 接口的实现

接口与类为实现关系,接口的实现与类的继承相似,使用implements关键字。 非抽象子类实现接口:必须重写接口中所有抽象方法。

格式:

class 类名 implements 接口名 {
    // 重写接口中抽象方法【必须】
    // 重写接口中默认方法【可选】
} 

示例: 接口的定义:

    public interface LiveAble {
    // 定义抽象方法
    public abstract void eat();
    public abstract void sleep();
    }

定义实现类:

    public class Animal implements LiveAble {
    @Override
    public void eat() {
        System.out.println("吃东西");
    }
?
    @Override
    public void sleep() {
        System.out.println("晚上睡");
    }
}

测试类:

public class InterfaceDemo {
public static void main(String[] args) {
// 创建子类对象  
Animal a = new Animal();
// 调用实现后的方法
a.eat();
a.sleep();
}
}

2.4 接口的多实现

一个类可以实现多个接口并且,一个类能继承一个父类,同时实现多个接口。

在继承体系中,一个类只能继承一个父类。

格式:

class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
    // 重写接口中抽象方法【必须】
}

[extends 父类名 ]: 表示可选操作。如果有继承,必须放在实现的前边。

2.5 接口的多继承

一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。接口的继承使用 extends 关键字,子接口继承父接口的方法。代码如下:

定义父接口:

interface A extends B{
    public void method();
}
?
interface B {
    public  void method1();
}

定义子接口:

interface D extends A{
@Override
public void method() {
    System.out.println("DDDDDDDDDDDDDD");
}

    @Override
    public void method1() {
        System.out.println("EEEEEEEEEEEEEEE");
    }
}

2.6 抽象类和接口的区别 :

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

  • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法。

  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

----------------------------------------今天总结到此结束--如有不错误之处望指正--------------------------------------------、

 

以上是关于抽象类接口的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin接口和抽象类 ( 接口属性和方法定义 | 接口默认方法实现 | 抽象类 )

设计模式学习笔记 接口vs抽象类的区别?是否要为每个类定义接口?

接口和抽象类的相同与区别

接口和抽象类的相同与区别

抽象类和接口的异同

代码学习PHP面向对象之抽象类与接口