抽象类与接口

  • 抽象类
    • 定义和语法
    • 理解抽象类
    • 作用
    • 抽象类总结:
  • 接口
    • 概念
    • 接口特性
    • 注意事项:
    • 实现多个接口
    • 接口使用实例
    • Clonable 接口和深拷贝
  • 抽象类和接口的区别?

抽象类

定义和语法

包含抽象方法的类,叫做抽象类 需要用abstract修饰这个类

在Java中,一个类如果被 abstract 修饰类称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法可以没有具体的实现

抽象类中可以包含其他非抽象方法,也可以包含字段,非抽象方法和普通方法的规则是一样的,可以被重写,也可以被子类直接调用

//抽象类
abstract class Shape2{// 抽象方法public abstract void draw();//抽象类可以增加属性public int a;// 抽象类可以增加方法public void func(){}
}

理解抽象类

1.不能实例化对象

/*
abstract class Shape2{public abstract void draw();
}
*/Shape2 shape = new Shape();
编译出错
error:shape 是抽象的,无法实例化

2.抽象方法不能为 private的

抽象方法没有加访问限定符时,默认是public

abstract class Shape2{private abstract void draw();
}
编译出错
error:非法的修饰限定符组合:private + abstract

3.抽象方法不能被 fina l和 static 修饰

因为抽象方法要被子类重写

abstract class Shape {abstract final void methodA();abstract public static void methodB();
}编译出错
error:非法的修饰限定符组合:final + abstract非法的修饰限定符组合:static + abstract

4.抽象类必须被继承

且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,就要使用 abstract修饰

abstract class Shape2{//如果一个方法没有具体实现,那么这个方法可以是一个抽象方法public abstract void draw();//一个方法是抽象方法,那么存放它的类一定要声明成 抽象类
}
class Cycle extends Shape2{@Overridepublic void draw() {System.out.println("画一个⚪");}
}
//如果一个类继承了抽象类,那么该类一定要实现抽象类里的方法
class Triangle extends Shape2{@Overridepublic void draw() {System.out.println("画一个▲");}
}
class Flower extends Shape2{@Overridepublic void draw() {System.out.println("画一个❀");}
}

作用

抽象类存在最大的意义:就是为了被继承
抽象类本身不能被实例化,要想使用,必须创建该抽象类的子类,然后让子类重写抽象类中的抽象方法

抽象类总结:

  1. 抽象类不可以被实例化,即 不能:Shape2 shape = new Shape();
  2. 类内的数据成员和普通类没有区别,即:抽象类内部可以包含普通方法和属性,甚至构造方法
    唯一的就是其成员不能被实例化
  3. 抽象类生来就是被继承的
  4. 若一个类继承了抽象类,那么该类必须重写抽象类当中的抽象方法
  5. 抽象类 / 抽象方法一定不能被 final 修饰
  6. 一个方法是抽象方法,那么存放它的类一定要声明成 抽象类
    抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
  7. 当抽象类A 继承抽象类B,A可以不重写B的方法,但一旦A再被继承,那么一定还要重写抽象方法
  8. 抽象方法一定不能被 final 和 static 修饰

接口

概念

在现实生活中,接口的例子很多,比如电脑的USB接口,电源插座…

电脑的USB口上,可以插:U盘、鼠标、键盘…所有符合USB协议的设备
电源插座插孔上,可以插:电脑、电视机、电饭煲…所有符合规范的设备

通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

接口是抽象类的更进一步,抽象类中还可以包含非抽象方法,和字段,而接口中包含的方法都是抽象方法,字段只能包含静态常量

接口特性

1.接口当中的方法,都是抽象方法
2.接口中可以有具体实现的方法,需要用default修饰,JDK1.8 加入的

.

3.接口中定义的成员变量,默认是常量

.

4.接口是不可以用来实例化的

.

5.接口和类的关系:implements

一旦一个类实现了接口,那么一定要重写接口当中的方法
.

6.可解决Java单继承问题

.

7.可发生向上转型

.

前提是:把一个对象赋值给接口类型之前,一定要保证这个类实现了这个接口
例如下边代码:Cycle实现了Shape,故可以发生向上转型
.
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
.

注意事项:

  • 使用 interface 定义一个接口
  • 接口中的方法一定是抽象方法,故 abstract 可以省略
    接口中的方法一定格式 public,故 public 可以省略
  • 类使用 implements 继承接口,此处的含义是"实现"
  • 接口不能被实例化
  • 只要这个类实现了该接口,那么就可发生向上转型
  • 一旦一个类实现了接口,那么一定要重写接口当中的方法
    接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

实现多个接口

有时,我们需要一个类同时继承多个父类,在有些编程语言中可通过多继承方式来实现,但Java中,只支持"单继承",一个类只能 extends 一个父类,但可同时实现多个接口,也能达到类似多继承的效果

Java 面向对象编程中最常见的用法:一个类继承一个父类,同时实现多种接口

代码理解:

class Animal{protected String name;//提供构造方法public Animal(String name){this.name = name;}
}
//定义接口
interface IFlying{void fly();
}
interface IRunning{void run();
}
interface ISwimming{void swim();
}
//猫
// 先 extends 后 implements
class Cat extends Animal implements IRunning {public Cat(String name) {super(name);}@Overridepublic void run() {System.out.println(this.name + "正在用四条腿跑");}
}
//鱼
class Fish extends Animal implements ISwimming {public Fish(String name) {super(name);}@Overridepublic void swim() {System.out.println(this.name + "正在用尾巴游泳");}
}
//青蛙
class Frog extends Animal implements IRunning, ISwimming {public Frog(String name) {super(name);}@Overridepublic void run() {System.out.println(this.name + "正在往前跳");}@Overridepublic void swim() {System.out.println(this.name + "正在蹬腿游泳");}
}
//鸭子
class Duck extends Animal implements IRunning, ISwimming,IFlying{public Duck(String name){super(name);}@Overridepublic void fly() {System.out.println(this.name + "正在飞飞飞");}@Overridepublic void run() {System.out.println(this.name + "正在跑啊跑");}@Overridepublic void swim() {System.out.println(this.name + "正在游啊泳");}
}

Java—抽象类和接口相关推荐

  1. java定义一个door的类_再探Java抽象类与接口的设计理念差异

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...

  2. 没有体现JAVA接口功能_深入浅出分析Java抽象类和接口【功能,定义,用法,区别】...

    本文实例讲述了Java抽象类和接口.分享给大家供大家参考,具体如下: 对于OOP编程来说,抽象是它一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:抽象类和接口. 这两者有相似之处也有很 ...

  3. JAVA抽象类和接口的深入探讨

    Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...

  4. java 抽象类和接口2--什么时候用接口什么时候用抽象类

    java 抽象类和接口1–基本概念 https://blog.csdn.net/qq_26296197/article/details/81315685 从生活的角度看 把编程映射会日常生活进行对照, ...

  5. JAVA学习经验--总结JAVA抽象类和接口

    * --总结JAVA抽象类和接口  * 1.抽象类:  *             1>抽象类可以修饰方法,修饰类,但不能修饰属性,不能被实例化  *             2>抽象类可 ...

  6. java接口vm和dto的区别_第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  7. JAVA抽象类和接口类的区别

    JAVA抽象类和接口类的区别 1.声明方式不同.抽象类为abstract class,接口类为interface. 2.继承抽象类关键字为extends,实现接口关键字为implements. 3.继 ...

  8. 再探Java抽象类与接口的设计理念差异

    Java抽象类与接口都可以实现功能与实现的分离,都对多态提供了很好的支持,那么我们什么时候应该使用抽象类或接口呢?在以前的一篇文章初探Java抽象类与接口中谈到了他们语法的区别,在博客通过模板方法模式 ...

  9. jdk1.8中,java 抽象类和接口的区别

    抽象类 特点: 1.抽象类中可以构造方法 2.抽象类中可以存在普通属性,方法,静态属性和方法. 3.抽象类中可以存在抽象方法. 4.如果一个类中有一个抽象方法,那么当前类一定是抽象类:抽象类中不一定有 ...

  10. JAVA抽象类和接口的区别【附经典分析用例Door】

    这篇文章对抽象类和接口说的很详细,希望对大家有所帮助. abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大 ...

最新文章

  1. 6个2教你认识递归的力量!
  2. 【工具篇】抓包中的王牌工具—Fiddler (1-环境搭建)
  3. Arthas 用户文档
  4. Docker资源汇总
  5. 网易:层次遍历二叉树
  6. 图片的等比缩放和Logo水印
  7. 安装配置管理 之 安装和配置 JPackage Java
  8. Atitit 解析m4a文件的元数据标签音乐名,歌手 专辑 年代等信息 java版本 目录 1.1. 自己解析mp4 m4a结构 1 1.2. 格式返回 1 1.3. /bookmarksHtmlE
  9. 二叉树前序遍历、中序遍历、后序遍历 递归和非递归方式实现
  10. mybatis-plus 自定义UpdateWrapper(二)实现列的case set
  11. React Suspense lazy
  12. 信息学奥赛一本通C++语言——1139:整理药名
  13. python读文件的方法
  14. 搭建FTP服务器(二):虚拟目录的设置
  15. 数据库-cmd下安装mysql服务
  16. Log4j2发送邮件通知
  17. C++中复制构造函数与重载赋值操作符
  18. linux 内存free少问题
  19. win10系统右键一直转圈问题解决方案
  20. ubuntu搭建esp-idf开发环境 解决github下载慢

热门文章

  1. PHP工程师零基础入门到就业班
  2. jetty了解与使用
  3. java 计算器api_Java制作简易计算器day23-软件客栈
  4. luogu P4921 [MtOI2018]情侣?给我烧了! 加强版
  5. Excel将单表复制追加到另一个未打开的工作簿
  6. 项目 : 预测波士顿房价_团结波士顿更新:早鸟票销售将于明天结束。 部分时间表到了!
  7. 【i.MX6ULL】驱动开发2——新字符设备开发模板
  8. 解决lombok.extern.slf4j.Slf4j等lombok包错误
  9. 图像的频率域高斯低通滤波
  10. maskrcnn-benchmark 代码详解之 resnet.py