Java面向对象—抽象类和接口

一、抽象类

抽象的定义:
我们在日常生活中,经常通过总结一些事物的共性来对事物进行分类,这种共性可能是一些相同的属性,也可能是一些相同的动作。通过总结,我们能够清晰的划分事物的分类。同样,在程序设计中,我们将拥有相同行为,但是不同表现形式的行为进行抽象,描绘出的方法,就称之为抽象方法,那么包含抽象方法的类,就是抽象类。

  • 抽象方法:所谓的抽象方法,是指具有相同行为,但是不同分类的行为又有不同表现形式的方法,那么我们声明了方法,但又不需要具体实现方法内容的方法,称之为抽象方法。从语法结构上讲,就是通过abstract关键字来修饰的方法。
public abstract void jiao();
  • 抽象类:在《java编程思想》中,是这么描述抽象类的,“包含抽象方法的类是抽象类”,我们可以理解为,这个类如果包含抽象方法,那么这个类就一定是个抽象类,但是,抽象类中的方法,不一定全都是抽象方法。
public abstract class Dog {public abstract void jiao();
}
public abstract class Dog {public abstract void jiao();public void pao() {System.out.println("狗可以跑!");}
}

抽象类的使用:
我们可以这样理解,抽象方法在抽象类中,那么当使用抽象类的对象是,是无法直接使用方法的,所以我们只能通过继承的方式具体化一个抽象类的具体形象,就好像我们在欣赏一幅抽象派的画一样,我们需要在脑海中具象化一个具体的内容,来赋予这幅画的真实含义。我们的抽象类也是一样,需要具体化一个内容来描述抽象类。

//抽象类--狗
public abstract class Dog {public abstract void jiao();}
//狗类的继承类---二哈
public class ErHa extends Dog {@Overridepublic void jiao() {System.out.println("二哈边叫边拆家");}}

总结:当我们使用一个类去继承一个抽象类时,那么我们就要赋予这个抽象类中所描述的方法以具体实现效果,也就是我们的子类需要重写父类的抽象方法。但有些时候,我们的子类也不确定这个方法该怎么实现,那么我们就把子类也设计成为抽象类,基于Java中的多层继承,由子类的子类去实现这个方法。子子孙孙无穷匮也!

//抽象类--狗
public abstract class Dog {public abstract void jiao();
}
//狗类的继承类---二哈
public abstract class ErHa extends Dog {public abstract void jiao();
}
//灰色二哈
public class HuiErHa extends ErHa {@Overridepublic void jiao() {System.out.println("灰色二哈边叫边拆家边把自己弄脏");}}

抽象的注意事项:

  1. 抽象类和抽象方法必须使用abstract关键字修饰
  2. 抽象类中不一定有抽象方法,但是有抽象方法的一定在抽象类中
  3. 抽象类不能实例化 (实例 = 对象) [也就是不能创建对象],如果非要实例化,可以通过多态的形式创建,也就是 父类引用指向子类对象
  4. 抽象类的子类必须重写父类(抽象类)中所有的抽象方法或将自己也变成一个抽象类

二、接口

接口的定义:
接口(英文:Interface),在Java中是一个抽象类型,属于引用数据类型,是抽象方法的集合,接口通常以interface来声明。
个人的理解,接口是一个特殊的类,也是一种特殊的数据类型,它比抽象类更加抽象,是一种纯概念的定义。通常使用接口来定义类所需要的行为(方法)。

定义接口:Java中使用interface关键字定义接口,定义方式与类相同

[访问修饰符] interface 接口名{}

//定义狗类接口
public interface IDog {//狗类有叫的行为public void jiao();//狗类有跑的行为public void pao();//狗类有吃的行为public void eat();
}

接口的使用:类与类通过继承关系来实现,类与接口之间使用implements关键字实现,类与接口称之为实现。

[访问修饰符] class 类名 implements 接口名称{}

//金毛作为狗类的一员
public class JinMao implements IDog{@Overridepublic void jiao() {}@Overridepublic void pao() {}@Overridepublic void eat() {}}

接口的特点:
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。所以接口中只能存在抽象方法(JDK1.8前)。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。

接口与类的关系:

  1. 接口与接口之间的关系:接口与接口之间可以通过继承来实现父子接口的关系。接口继承接口使用extends关键字,并且接口可以多继承接口。
//动物接口
public interface IAnimal {}
public interface IDog extends IAnimal{//狗类有叫的行为public void jiao();//狗类有跑的行为public void pao();//狗类有吃的行为public void eat();
}
  1. 接口与类之间的关系:类可以实现接口,并且在实现时要实现接口中的所有抽象方法,如果接口继承了其他接口,实现类也要实现父类接口中的所有抽象方法。实现类可以实现多个接口,从而实现多继承。
//动物接口
public interface IAnimal {//动物有睡觉的行为public void sleep();
}
//定义狗类接口
public interface IDog extends IAnimal{//狗类有叫的行为public void jiao();//狗类有跑的行为public void pao();//狗类有吃的行为public void eat();
}
//金毛作为狗类的一员
public class JinMao implements IDog{@Overridepublic void jiao() {}@Overridepublic void pao() {}@Overridepublic void eat() {}@Overridepublic void sleep() {}
}
  1. 接口类型的使用:在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。依据多态的特性,我们可以定义接口类型的变量,实例化实现类对象。

接口和抽象类的区别:

  • 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的,所以一般不会在接口中定义成员。
  • 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

Java中的多继承:
Java中不支持像C++那样的多继承,类与类之间的关系也仅仅是多层继承,但是我们在实际项目中会遇到一个类有多种表现形态的时候,我们就会通过接口来实现这种多继承。接口最常见的使用方法是一种策略设计,相同的行为,不同的展现形式,使得接口更加美妙。

面向接口编程:
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。所以面向对象是面向接口的基础。

Java基础学习第十二讲:Java面向对象---抽象类和接口相关推荐

  1. Java基础学习第十八讲:Java异常

    Java异常 Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流.为了能够及时有效地处理程序中的运行错误,Java中引入了异常类的概念. ...

  2. Java基础学习第十三讲:Java面向对象---嵌套类

    Java面向对象-嵌套类.内部类.匿名类 一.static静态 在<Java编程思想>有这样一段话: "static方法就是没有this的方法.在static方法内部不能调用非静 ...

  3. Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出

    JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...

  4. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  5. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  6. java基础学习总结(二)——开篇(转载于孤傲苍狼博主的心得体会)

    由于孤傲苍狼博主16年后,就没有更新博客了.其中有些文章看不了,挺可惜的.为了避免后续文章也会有类似情况,因此,他的博文基本都会转载过来,也会标注转载,做一个备份.不过文章太多,不会每篇文章都有转载于 ...

  7. java基础学习笔记(二)

    1.数组排序之选择法排序和冒泡排序? 选择法排序原理:数组第一位和后续位置数值比较,最大或最小的调换位置后放在第一位:依次比较将第二大或小的值调换位置后放在第二位置:代码如下: for (int j ...

  8. Java基础学习系列--(二)【抽象类,接口、代码块、final、单例、枚举】

    第一章 抽象类 1.1 概述 1.1.1 抽象类引入 父类中的方法,被它的子类们重写,子类各自的实现都不尽相同.那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了(因为子类对 ...

  9. 《第一阶段 java基础 Day02笔记》————————第二讲Java基本语法

    第二讲Java基本语法 课程大纲 课程内容 学习效果 掌握目标 Java基本语法 注释.关键字.标识符 掌握 熟练掌握Java的注释方式 熟练掌握Java中的关键字 熟练掌握标识符概念 数据类型.常量 ...

最新文章

  1. 剑指offer(34-40题)详解
  2. verilog always语法_Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
  3. python3有多少个关键字排序_python3 数据结构和算法-- 通过某个关键字排序一个字典列表...
  4. 【转】ABP源码分析十八:UI Inputs
  5. android过滤数字,android – GPS卫星数量和位置过滤
  6. js 绘制泳道图_软件工程师,如何绘制业务架构图 — 4.流程图
  7. CentOS 7.2 终端安装字体
  8. mysql中外键总结_mysql外键的一些总结
  9. 错误上报_PCIe错误的上报方式
  10. 从零实现深度学习框架——理解正则化(一)
  11. Protel 99 SE 的坑
  12. STM32分类及命名规则——学习笔记(1)
  13. Centos7虚拟机的镜像下载及创建
  14. 个性化推荐算法(推荐系统)概要
  15. 很认真的聊一聊程序员的自我修养
  16. Android源码解析系列
  17. 测试空间大数据软件(Hadoop + HBase + GeoWave + GeoServer)
  18. cdn连接失败是什么意思_CDN经常连接失败的原因有哪些?
  19. 信息摘要技术 - SHA系列
  20. springboot项目在cmd窗口运行后台卡顿问题

热门文章

  1. 滑雪教程-新手必看(上)
  2. 机器学习--岭回归10
  3. 《ThinkPHP 5实战》4个实战开发案例可从代码仓库下载
  4. 让你少奋斗10年的工作经验
  5. 完整的js写的省市级的程序
  6. 网贷逾期可怕吗?如果通知到朋友会怎么样?
  7. 【独立游戏】Sunset——二次元横版动作游戏
  8. angular ts 表格_Angular8 ui-grid替代方案ag-grid入门
  9. 全国等级保护测评机构推荐目录
  10. Netty实现多人在线游戏后台程序