JAVA抽象类接口学习笔记

来源:互联网 发布:淘宝店代理的发货流程 编辑:程序博客网 时间:2024/05/18 02:46

抽象类

什么是抽象类

JAVA允许在类中只声明方法而不提供方法的实现。
这种只有声明而没有方法体的方法称为抽象方法,而包含一个或多个抽象方法的类称为抽象类。

抽象(abstract)类:
抽象类是以abstract关键字为开头的类。
抽象方法在声明中也要加上 abstract 。

abstract class Employee{        //抽象类:以abstract关键字为开头的类    abstract void raiseSalary();    //抽象方法:只有声明而没有方法体的方法}

注意:
1. 抽象类在使用上有特殊的限制,即不能创建抽象类实例。
2. 如果抽象类的子类实现了抽象方法,即可以创建该子类的实例对象,否则该子类也是抽象类(对,没有看错),也不能创建实例。
3. So,一般将抽象类构造方法的访问权限声明为protected而不是public,从而保证这个构造方法能由其子类调用,而不被其他无关的类调用。
关于注意点1和2的代码:

abstract class Employee{        //抽象类:以abstract关键字为开头的类    abstract void raiseSalary(int i);   //抽象方法:只有声明而没有方法体的方法}class Manager extends Employee{ //抽象类的子类    void raiseSalaty(int i){    //实现抽象方法        System.out.println("hello");    }}public static void main(String[] args) {        Employee e = new Manager();     //创建Employee 子类 Manager的对象        Employee e = new Employee();    //错误!Employee为抽象类    }

抽象类的作用

Eg. 现在有 4 个类,
Shape()—形状类
Circle()—圆形类
Square()—正方形类
Triangle()—三角形类
类关系
*Color( ) 属性定义在父类里
show( ) 方法可以定义成抽象方法

Shape 类是顶层类。实际上Shape类的对象是没有实际意义的。
定义Shape类的目的并不是为了在程序中创建并操作它的对象,而是为了定义几何形状类体系的通用接口,这些接口在Shape类中并不需要给出具体实现,而由它的各个子类提供自己的实现。

还有如果设计者如果想禁止创建某个类的实例对象,只需要在类的声明加abstract关键字。

抽象类的总结

抽象类:专门设计让子类继承的类
特点:
包括一个或多个抽象方法(只有方法说明,没有方法体);
如果子类不是抽象类,必须实现其父类的抽象方法;
抽象类不能被实例化(即不能直接创建对象);
抽象类不一定要包含抽象方法,若类中包含了抽象方法,则该类必须被定义为抽象类。

接口(interface)

Java的接口使抽象类的概念的更深一层。接口是一种“纯”抽象类。
接口中声明了方法,但不定义方法体。
为什么要使用接口?
类继承对于重用父类中的代码很有用,而Java只支持单继承,在遇到需要多继承的情况,可以通过接口来帮助实现

接口的定义:

“正规”的接口的定义写法:

interface  接口名称{       final  static 数据类型  成员变量=值;//常量       public abstract 返回类型  方法名称(参数…);//抽象方法}

注意事项:
1. 成员变量必须为常量
2. 方法必须为抽象方法

萌新 前面特意强调“正规”,让我们来看这么一段代码:

interface  iShape2D{     double pi=3.14;        //成员变量必须初始化     void area();                //抽象方法,没有方法体}

为什么这段代码里的接口中定义的常量没有加final,而且声明的方法也没有加abstract
因为:
1. 在接口中定义的常量默认具有public,final,static的属性。(常量名通常大写)。
2. 在接口中声明的方法默认具有public和abstract属性。
另外:如果在子接口中定义了父接口同名的常量方法,则父接口中的常量被隐藏,方法被重写。

接口的实现与使用

接口类:类的声明中用imlements 子句来表示一个类实现了某个接口,在类中可以使用接口的常量,而且必须实现接口中定义的所有方法。

interface  iShape2D{     double pi=3.14;             //成员变量必须初始化     area();                         //抽象方法,没有方法体}Class CCircle implements iShape2D {//实现接口类    public CCircle (double r) {      //构造器    Radius=r;     }       public void area() {                 //定义area()的处理方法            System.out.print(“area=“+pi*radius*radius);    }}

一个类可以实现多个接口,在implements子句中用逗号分隔。
接口可以像类一样作为数据类型来用,并且可以支持多态,此时任何实现该接口的类都可认为是该接口的“子类”。

多重继承

Java中规定一个类只能继承一个父类,但是可以实现多个接口,Java是利用接口实现多重继承的。
一个类可以从一个父类继承,并且可以同时继承其他接口(多个)。

public class Bird extends Animal implements Flyer{}

注意:在子类声明中,extends 子句必须放在 implements 之前。

通过继承扩展接口

接口定义后,可能在某种情况下需要对接口进行扩展,如增加新的方法。
但这样会带来问题:所有实现【这个被增加方法的接口】的【类】都将因为这个而不能工作。
因为类实现接口必须要实现接口中的所有方法。

那么,为了既能扩展接口,又保证不影响实现接口中的类。
一种可行的方法:创建接口的子接口来增加新的方法。

interface ShapeArea extends Shape{    double area();}

这样的话,原来的那些使用Shape接口的依旧使用,要使用新的方法的类,则实现ShapeArea接口。
也可以通过接口继承将几个接口合并为一个接口,在子接口声明中的extends关键字后引用多个基础接口,这些接口通过‘,’分隔。

接口和抽象类的区别

  1. 接口中所有方法都是抽象的,抽象类中可以定义带有方法体的接口。
  2. 一个类可以实现多个接口,但是只能继承一个抽象父类。
  3. 接口与实现他的类不构成类的继承体系,即接口不是类体系的一部分,因此不相关的类也可以实现相同的接口。而抽象类是属于一个类的继承体系,并且一般位于类体系的顶层。

使用的接口的主要优势:一个类可以通过实现多个接口从而实现多重继承。
所以你要用 接口 还是 要用抽象类呢?
只有必须使用方法定义或成员变量时,才应该考虑抽象类。

1 0