抽象类和接口

一、抽象类

1、什么是抽象类?

类和类之间具有共同的特征,将这些特征提取出来,形成的就是抽象类。 类到对象是实例化,对象到类是抽象。

  • 抽象类和具体类是相对的概念。“抽象”是一种存在思想逻辑中的概念,而“具体”是一种可见可触摸的现实对象。简单说,比如“人”比“男人”抽象一点,“动物”又比“人”更抽象一点,而“生物”又比“动物”更抽象。

  • 抽象的概念是由具体概念依其“共性”而产生的,把具体概念的诸多个性排出,集中描述其共性,就会产生一个抽象性的概念。抽象思维,是人类思维达到高级阶段产生的一种能力,例如,当小孩子思维尚未成熟时,他们只能掌握具体概念,他们在学习代词“你、我、他”时往往遇到困难,因为代词具有较高的抽象性。

  • 总之,抽象概念的外延大,内涵小;具体概念的外延小,内涵大。

1.1 抽象类与普通类

  • (1)普通类可以去实例化调用;抽象类不能被实例化,因为它是存在于一种概念而不非具体。

  • (2)普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写继承的方法,除非自类也是抽象类。

  • (2)实例应用:

 package com.q._abstract;
 ​
 public class Person {
    protected int id;
    protected String name;
 ​
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public void print(){
        System.out.println("这是一个人");
    }
 ​
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
 }
 class Student extends Person{
    private double score;
 ​
    public Student(int id, String name,double score) {
        super(id, name);
        this.score = score;
    }
    @Override
    public void print(){
        System.out.println("这是一个学生");
    }
 ​
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
 }
 class Test{
    public static void main(String[] args) {
        Person person = new Person(1,"person");
        Student student = new Student(1,"student",100);
 ​
        System.out.println(person);
        person.print();
 ​
        System.out.println("---------------");
        System.out.println(student);
        student.print();
    }
 }
 ​

疑问

问:

把父类改成抽象类,方法改成抽象方法,那么public void play(); 子类不变,依然重写父类方法,那这个跟普通父类没区别啊?难道说就一个抽象方法没方法体就完事了??那我普通方法有方法体,我空着不写内容不就得了,不跟抽象方法一个样吗??别跟我说抽象类还不能实例化,哥也不需要去new它!普通类都能搞定的,还弄个抽象类有什么意义?我前面都说了普通类的方法我可以空着不写,达到跟抽象类方法没方法体一样的效果。既然两种方式都能达到同一个输出效果,弄一种方式不就得了,那为什么还要创造出一个抽象类出来?难道是比普通类看着舒服?用着爽?还是更加便捷?还是为了强制让别人用的时候必须强制化实现抽象方法省的你忘了什么的?

答:

就是为了强制不能实例化,以及强制子类必须实现方法这不是你忘不忘的问题,你说你不去new它就行了,这话没错 那你想另一个问题,为什么要有访问控制呢?为什么要有private和public之分呢?我可以全部public,不该访问的,我不访问就行了啊?小程序里,看不出什么区别,反而private成员要写一堆set和get函数,多麻烦,我自己写小程序的时候也会偷懒全部public,但是项目大了,代码多了,这种严谨的结构就很重要了。且不说会有很多人合作一起写一个程序,哪怕还是你一个人写,也保不住有忘记的时候,那时候编译器不报错,茫茫码海上哪找错误去面向对象说到底就是方便你思考,易扩展、易维护管理,硬要说没必要,整个面向对象都没必要了,C语言有什么干不了的呀,运行效率还高。

2、抽象类属于什么类型?

抽象类属于引用数据类型

3、抽象类的定义。

class abstract 类名{}

4、抽象类与接口

4.1概念

接口动作的抽象,抽象类是对本质的抽象。 抽象类需子类继承实现,接口可以实现多个

  • 类表示的是,这个对象是什么。

  • 表示的是,这个对象能做什么。

  • 比如,男人和女人,他们的抽象类是人类,而猫和狗的抽象类是宠物类。人类可以吃东西,宠物类也可以吃东西,但是两者不能混为一谈,因为有本质的区别。

  • 这个“吃东西”是一个动作,你可以把“吃东西”定义成一个接口,然后让两个类去实现它的方法。

,在高级语言上,一个类只能继承一个类或抽象类,正如人不可能同时是动物类又是植物类,但是可以实现多个接口,例如,吃饭接口、呼吸接口等。

4.2使用情况

  • 抽象类 和 接口 都是用来抽象具体对象的,但是接口的抽象级别最高;

  • 抽象类可以有具体的方法和属性, 接口只能有抽象方法和不可变常量(final);

  • 抽象类主要用来抽象类别,接口主要用来抽象功能;

  • 抽象类中不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的;

  • 抽象类实现接口时,接口的方法在抽象类中可以被实现也可以不被实现,而普通实现接口必须实现所有接口方法。

4.3 使用方向

  • 关注一个事物的本质的时候,用抽象类;

  • 关注一个操作的时候,用接口。

小结

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

 

最新文章

  1. Mysql5.7.13主从同步(复制)配置
  2. ASP.NET MVC下的四种验证编程方式[续篇]
  3. Web API应用架构在Winform混合框架中的应用(5)--系统级别字典和公司级别字典并存的处理方式
  4. numtoyminterval函数——数字转换函数
  5. 学习笔记——Maven超级POM
  6. Oracle 11g XE 试用记录
  7. Knight Tournament
  8. angular smart-table组件如何定制化之初步研究
  9. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.19
  10. Linux磁盘分区-rpm-yum
  11. 02_创建Git仓库,克隆仓库,git add,git commit,git push,git pull,同行冲突,不同行冲突的结局方案,git mergetool的使用
  12. 【Spark篇】---Spark中内存管理和Shuffle参数调优
  13. ipv4网络无访问权限
  14. 【转】解决在Android设备播放音频与其他应用重音的问题,并监听耳机的控制按钮
  15. 使用光盘作为yum软件安装源安装X Window
  16. subline 相关
  17. 搭建spark集群
  18. ubuntu16.04安装workbench
  19. IISExpress 开放局域网访问
  20. 第一个struct2程序(2)

热门文章

  1. bootstrap栅格布局-v客学院知识分享
  2. CRUD搬砖两三年了,怎么阅读Spring源码?
  3. [CEOI2002]Bugs Integrated, Inc. 题解
  4. 项目启动报错 The server time zone value '�й���׼ʱ��' is unrecognize...
  5. vulnhub-XXE靶机渗透记录
  6. vulnhub-DC:3靶机渗透记录
  7. Windows Server创建域控制器
  8. vscode配置java+gradle开发环境
  9. PDMan使用
  10. ThinkPHP 2.x 任意代码执行漏洞