JAVA抽象类接口学习笔记

抽象类

什么是抽象类

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. 接口与实现他的类不构成类的继承体系,即接口不是类体系的一部分,因此不相关的类也可以实现相同的接口。而抽象类是属于一个类的继承体系,并且一般位于类体系的顶层。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值