Java学习笔记(四)抽象类、 接口

    科技2022-07-10  166

    抽象类、 接口


    一、抽象

    1.abstract

    abstract修饰类,则为抽象类,修饰方法则为抽象方法;包含抽象方法的类有点为抽象方法;由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。抽象中抽象构造方法,类方法(用static修饰的方法)不能声明为抽象方法。抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。 public abstract class Employee { private String name; private String address; private int number; public abstract double computePay();//抽象方法 //其余代码 }

    二、 接口

    1. interface

    implement

    接口就是规范,定义的是一组规则,体现接口是特殊的抽象类;接口中的抽象方法必须是两个固定的关键词(public abstract)可以选择省略不写;从java8开始,接口中可以定义默认方法;public default返回类型 方法名(参数列表){方法体}接口中的默认方法用于解决接口升级问题;默认方法会被实现类继承下去;接口的默认方法可以通过接口的实现对象直接调用;接口的默认方法也可以被接口尘实现类覆盖重写;

    2. 接口与类的区别:

    接口不能用于实例化对象。 但是可以定义变量;接口变量可以引用静态实现类的实例;接口只能被实现;一个具体类实现接口,必须实现接口 的所有抽象类;接口没有构造方法。接口中的属性默认是常量 public static final接口中所有的方法必须是抽象方法。接口不能包含成员变量,除了 static 和 final 变量。接口不是被类继承了,而是要被类实现。接口支持多继承。

    3. 接口特性

    接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是public,用 private修饰会报编译错误)。接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。不能通过实现类的对象来调用接口中的静态方法;(可以通过接口名称.静态方法名称)java 9+以后可以在接口中使用私有方法;(private 返回值类型 方法名称(参数列表){方法体})

    4. 抽象类和接口的区别

    抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。接口没有构造方法。抽象类中有构造方法;接口不能包含初始化快。抽象类中能包含初始化快;抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。接口中不能含有静态代码块,从java8以后就可以在接口中使用静态方法(用static修饰的方法,格式:public static 返回值类型 方法名称(参数列表){方法体}),而抽象类是可以有静态代码块和静态方法。一个类只能继承一个抽象类,而一个类却可以实现多个接口。

    Interface关键字用来声明一个接口。下面是接口声明的一个简单例子。:

    import java.lang.*; //引入包 public interface NameOfInterface { //任何类型 final, static 字段 //抽象方法 }

    5. 接口的实现

    ...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ... /* 文件名 : Animal.java */ interface Animal { public void eat(); public void travel(); } /* 文件名 : MammalInt.java */ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }

    以上实例编译运行结果如下:

    Mammal eats Mammal travels
    Processed: 0.077, SQL: 8