抽象类

用途

借助抽象类可以实现代码的重用。

特点

  • 抽象类无法实例化。但抽象类有构造方法,在子类创建对象时用。
  • 抽象类中可以定义抽象方法,不能有函数体。也只有抽象类中可以定义抽象方法。

为什么抽象类不能实例化却可以有构造方法

  • super用法

      super是指向父类的引用,如果构造方法没有显示地调用父类的构造方法,那么编译器会自动为它加上一个默认的super()方法调用。如果父类由没有默认的无参构造方法,编译器就会报错,super()语句必须是构造方法的第一个子句。

      定义子类的一个对象时,会先调用子类的构造函数,然后在调用父类的构造函数,如果父类函数足够多的话,会一直调用到最终的父类构造函数,函数调用时会使用栈空间,所以按照入栈的顺序,最先进入的是子类的构造函数,然后才是邻近的父类构造函数,最后再栈顶的是最终的父类构造函数,构造函数执行是则按照从栈顶到栈底的顺序依次执行.

    所以父类构造方法可以写一些所有子类共有的方法,使得在子类初始化时不用每个都写同样的方法

接口

用途

  • 接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
  • 使项目分层,所有层都面向接口开发。(类实现接口、类调用接口)
  • 使代码间的耦合度降低。

特点

接口也是一种引用类型,可以等同看作类。

不同的,

  • 接口没有构造方法。
  • 接口中只能出现常量和抽象方法。接口中常量的public static final 可省略 ,抽象方法的public abstract 可省略。
  • 接口和接口之间可以多继承(extends)。一个类可以实现(implements)多个接口。
  • 一个非抽象的类实现接口,必须将接口中的所有方法实现(即覆盖)。

为什么接口中方法和常量默认是public的,为什么接口中没有变量只有常量

  1. 接口是一种约束和规范,是一种更加更高级的抽象类,抽象类的方法必须是公开的,因为要给别的类去实现。此外由于子类的访问级别不能低于父类,所以子类在实现接口重写方法时的修饰符必须是public。
  2. 接口中没有变量的原因;既然是约束和规范,怎么能够定义一个大家都可以改的东呢。

接口与抽象类对比

  • 语法的区别:

    • 关于一些有的没的

      1. 抽象类可以有构造方法,接口中不能有构造方法。
      2. 抽象类中可以有普通成员变量,接口中没有普通成员变量
      3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
      4. 抽象类中可以包含静态方法,接口中不能包含静态方法
    • 关于访问域

      5. 抽象类中的抽象方法的访问类型可以是public,protected,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

      6. 抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
    • 关于继承

      7. 一个类可以实现多个接口,但只能继承一个抽象类。
  • 用途上的区别
    • 借助抽象类可以实现代码的重用,接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。

参考链接

https://blog.csdn.net/qq_41933748/article/details/82670072

https://www.cnblogs.com/yyy6/p/8976584.html

[Java学习]面向对象-抽象类;接口的更多相关文章

  1. java学习面向对象之接口

    上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...

  2. Java学习笔记 抽象类 接口 多态

    instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...

  3. 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装

    抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...

  4. Java 学习笔记(7)——接口与多态

    上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...

  5. python面向对象 : 抽象类(接口类),多态,封装(私有制封装)

    一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...

  6. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  7. Java学习 面向对象(下)——Java疯狂讲义th4

    面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...

  8. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  9. java学习——JDK1.8接口和实现类

    Java 8 新特性:接口的静态方法和默认方法 https://blog.csdn.net/sun_promise/article/details/51220518 接口的默认方法和静态方法 http ...

随机推荐

  1. MVC模式的原理

    说说MVC模式的原理,Android SDK 中有哪些组件使用到了MVC模式,其基本原理是什么?[国内某著名软件外包公司 2010 年面试题] 答案:MVC 的基本原理就是通过Controller 连 ...

  2. Zookeeper 基本应用及盲点

    主要应用 From: https://segmentfault.com/a/1190000012185452 http://blog.fens.me/zookeeper-queue/ 原理: 应用zo ...

  3. Oracle问题小结

    1.win8.1安装Oracle11g后,重启电脑,出现黑屏. 解决办法:安全模式下,找到以oracle开头的全部服务,所有“自动”或者“自动(延迟启动)”的都设置为“手动”,只需要开启OracleO ...

  4. redis集群报错:(error) MOVED 11469 192.168.163.249:7002

    应该是你没有启动集群模式(即缺少了那个"-c"): redis-cli -c -h yourhost -p yourpost

  5. mysql分库分区分表

    分表: 分表分为水平分表和垂直分表. 水平分表原理: 分表策略通常是用户ID取模,如果不是整数,可以首先将其进行hash获取到整. 水平分表遇到的问题: 1. 跨表直接连接查询无法进行 2. 我们需要 ...

  6. k8s的内置DNS增加父系DNS方法

    我们都知道K8S有内置DNS,是在搭建K8S时候以容器方式起来的,那么有时候我们需要解析内部DNS地址该怎么办呢,我们可以搭建个内部DNS 但是怎么让K8S通过内部DNS解析呢? 可以尝试如下方法 在 ...

  7. LeetCode OJ 77. Combinations

    题目 Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exa ...

  8. pytest 单元测试

    pytest简介 pytest 是python的一种单元测试框架,它非常的简洁.清晰. pytest 安装 pip install -U pytest 查看pytest版本 pytest --vers ...

  9. python 获取命令行参数

    https://www.cnblogs.com/captain_jack/archive/2011/01/11/1933366.html zzz.py import sys from optparse ...

  10. 函数传参传的是啥的思考【java Python】

    今天看<java 核心 卷1>的时候,作者提到了函数传参的问题,他提到,java传参,传的是值,而不是引用,然后,函数将要传的实参的值(如果实参是基本数据类型,那么就是值.如果实参是对象, ...