JAVA——抽象类和接口

目录:

一.抽象类

抽象类实例

二.接口

接口实例:

三.抽象类与接口的异同

四.总结


一.抽象类

  • 概念

抽象类(abstract)是用来捕捉子类的通用性的,它不能被实例化,只能用作子类的超类,抽象类是被用来创建继承层级里子类的模板。

  •  理解

抽象的概念是由具体概念依其“共性”而产生的,把具体概念的诸多个性排出,集中描述其共性,就会产生一个抽象性的概念。比如:草莓有红颜草莓 奶油草莓 丹东草莓等品种,但排除其个性以后,它们统称为草莓。

  • 特点

1.抽象类不能有对象,(不能用new此关键字来创建抽象类的对象)
2.有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法;可以有0到n个抽象方法,以及0到n具体方法
3.抽象类中的抽象方法必须在子类中被重写。抽象方法生来就是要被重写的,而且是必须重写
4.抽象类和普通类一样,各种形式的成员变量都可以声明,也需要构造方法

抽象类实例

public abstract class Language {
//抽象方法
    public abstract void speak();
}
//语言-中文
class Chinese extends Language{
//说中文方法
    @Override
    public void speak() {
        System.out.println("说中文");
    }
}
//语言-英文
class English extends Language{
// 说英文方法
    @Override
    public void speak() {
        System.out.println("Speak English");
    }
}
class Test{
    public static void main(String[] args) {

//        s1变量指向父类型,指向子类实例,发生多态
        Language s1 = new Chinese();
        s1.speak();
//        s2变量指向父类型,指向子类实例,发生多态
        Language s2 = new English();
        s2.speak();

    }
}

二.接口

  • 概念

接口(interface)是抽象方法的集合,也可以理解为是抽象类的一种特例,接口中的所有方法都必须是抽象的。

  • 理解

抽象类表示的是,这个对象是什么;接口表示的是,这个对象能做什么。比如,红茶和绿茶,他们的抽象类是茶类,而红酒和白酒的抽象类是酒类。茶类可以喝,酒类也可以喝,但是两者不能混为一谈,因为有本质的区别。所以,我们可以把“喝”这个动作定义成一个接口,然后让两个类去实现它的方法。

  • 特点

  1.在接口中成员变量都静态成员变量,即省略了public static final修 饰符
  2.接口中的所有方法默认为抽象方法,即省略了public关键字
  3.声明接口使用interface关键字,interface前面的修饰符是public或省略
  4.某个类实现接口时,要在声明时使用implements关键字,当实现多个接口之间用逗号(,)分隔
  5.实现接口时要实现接口中声明的所有原有的抽象方法

接口实例:

//声明一个接口
interface Say {
    public void sayMessage();
}

//两个实现类
class SayChinese implements Say {
    public void sayMessage() {
        System.out.println("你好");
    }
}

class SayEnglish implements Say {
    public void sayMessage() {
        System.out.println("Hello");
    }
}

public class TestSay {
    public static void main(String[] args) {
    //同样都是用Say这个接口类型实例,却可以输出两个结果
        Say say1 = new SayChinese();
        say1.sayMessage();
        Say say2 = new SayEnglish();
        say2.sayMessage();
    }
}

三.抽象类与接口的异同

参数抽象类接口
默认的方法实现可以有默认的方法实现完全抽象,根本不存在方法的实现
实现方式

子类用extends关键字来继承抽象类,如果子类

不是抽象类的话,它需要实现父级抽象类中所有抽

象方法,父类中非抽象方法可重写也可不重写

子类用implements去实现接口,需要实现接口中所有方法
构造器抽象类可以有构造器(构造器不能用abstract修饰)接口不能有构造器
与正常Java类的区别正常Java类可被实例化,抽象类不能被实例化,其他区别见上下文接口和正常java类是不同的类型
访问修饰符 抽象方法可以用public、protected、default修饰接口默认是public、不能用别的修饰符去修饰
main方法抽象类中可以有main方法,可以运行它接口中不能有main方法,因此不能运行它
多继承抽象类可继承一个类和实现多个接口接口只能继承一个或者多个接口
速度抽象类比接口速度快接口稍微慢点,因为它需要去寻找类中实现的它的方法
添加新方法如果在抽象类中添加新非abstract的方法,可以直接添加,因为非abstract方法无需在子类中实现,如果是abstact方法,则需要改变子类的代码,也要实现这个方法只要在接口中添加方法,实现它的类就要改变,去实现这个新添加的方法

接口和抽象类的应用场景

  • 如果原本拥有一些方法,并想让他们中的一些有默认的具体实现,就使用抽象类
  • 如果想实现多重继承,可以使用接口,因为java不支持子类继承多个类,但允许一个类可以实现多个接口,因此可以使用接口来解决
  • 如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类

 摘自:简单总结java抽象类与接口的区别 - 只会写error - 博客园

四.总结

抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值