抽象类和接口的区别

思维导图锁定核心

接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。

参数抽象类接口
默认的方法实现它可以有默认的方法实现接口完全是抽象的,根本不存在方法的实现
实现子类使用extends关键字继承抽象类.如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法实现.子类使用关键字implements实现接口.它需要提供接口中所有声明的方法实现
构造器抽象类可以有构造器接口不能有构造器
与正常JAVA类的区别除了不能实例化抽象类之外,它和普通JAVA类没有任何区别接口是完全不同的类型
访问修饰符抽象方法可以有public、protecteddefault这些修饰符接口方法默认修饰符是public,不可以是使用其他的修饰符
main方法抽象方法可以有main方法,可以运行它接口没有main方法,不能运行它
多继承抽象方法可以继承一个类和实现多个接口接口只可以继承一个或多个其他接口
速度它比接口速度快接口是稍微有点慢,需要时间去寻找在类中实现的方法
添加新方法在抽象类中添加新的方法,可以给它提供默认的实现,不需要改变你现在的代码在接口中添加方法,必须改变实现该接口的类

01x0 抽象类

 描述"水果"这个抽象.它有体积,质量一些共性,但是又缺乏特性(苹果,香蕉都是水果,它们有自己的特性).
 但是我们拿不出唯一一种能代表水果的东西(因为苹果和香蕉都不能代表水果),但是可以用抽象类来描述它,所以抽象类是不能够实例化的.
 当我们用某个类来具体描述"苹果"时,这个类就可以继承描述"水果"的抽象类,我们都知道"苹果"是一种"水果"
也就是说抽象类是个总类

01x1 抽象方法

抽象方法是一种特殊的方法,它只有声明.具体的实现要由继承抽象类的类对其进行重写.

抽象方法必须用abstract关键字进行修饰.这种方法只声明返回的数据类型

Talk is cheap,show my code

定义一个动物抽象类,动物都可以cry()

public abstract class Animal {
    public abstract void cry();
}

public class Cat(){
    @Override
    public void cry(){
        System.out.println("我是猫,喵喵喵");  
}
}

public class Dog(){
    @Override
    public void cry(){
    System.out.println("我是狗,汪汪汪");
}
}

Test

public class Test(){
    public static void main(String arg[]){
        Animal a1 = new Cat();
        Animal a1 = new Dog();
        a1.cry();
        a2.cry();
    }
}

这里写图片描述

02x0 接口

接口是一种协议

接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。

Talk is cheap,show my code

 /*
 定义一个Shape接口
 */
 public interface Shape
 {
    double PI=3.141596;//接口默认变量为static final 全局变量
    double getArea(); //接口默认方法权限为public
    double getGirth();
 }
 /*
    定义一个梯形类来实现Shape接口
     继承接口关键字 implements
 */
 public class Trapezium implements Shape{
    public double downSide;
    public double height;
    public double upSide;
    public Trapezium(){
         upSide=1.0;
         downSide=1.0;
         height=1.0;
    } 
    public Trapeizum(double upSide,double downSide,double height)
    {
        this.upSide=upSide;
        this.downSide=downSide;
        this.height=height;
    }
    //接口方法的实现
    public double getArea()   
    {
        return 0.5*(upSide+downSide)*height;
    }
    //接口方法的实现
    public double getGirth(){
        //尽管我们不计算梯形的周长,但也必须实现该方法.
        return 0.0;
    }
}

03X0 抽象类以及接口的特点

抽象类
  1. 抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可
  2. 抽象方法必须由子类来进行重写.
  3. 只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含其他方法
  4. 抽象类中可以包含具体的方法,当然也可以不包含抽象方法
  5. 子类中的抽象方法不能与父类的抽象方法同名
  6. abstract不能与final并列修饰同一个类
  7. abstract不能与private,static,final或native并列修饰同一个方法
接口
  1. 接口的实现就是在实现接口的类中重写接口中给处的所有方法,书写方法体代码,完成方法所规定的功能.
  2. 接口的访问限定只有public和缺省的
  3. interfact是声明接口的关键字
  4. 接口的命名必须符号标识符的规定,并且接口名必须与文件名相同.
  5. 允许接口的多重继承
  6. 常量默认为static final 修饰的.
  7. 声明的方法,默认为”abstract”的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值