Java—抽象类和接口
抽象类与接口
- 抽象类
- 定义和语法
- 理解抽象类
- 作用
- 抽象类总结:
- 接口
- 概念
- 接口特性
- 注意事项:
- 实现多个接口
- 接口使用实例
- 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("画一个❀");} }
作用
抽象类存在最大的意义:就是为了被继承
抽象类本身不能被实例化,要想使用,必须创建该抽象类的子类,然后让子类重写抽象类中的抽象方法
抽象类总结:
- 抽象类不可以被实例化,即 不能:Shape2 shape = new Shape();
- 类内的数据成员和普通类没有区别,即:抽象类内部可以包含普通方法和属性,甚至构造方法
唯一的就是其成员不能被实例化 - 抽象类生来就是被继承的
- 若一个类继承了抽象类,那么该类必须重写抽象类当中的抽象方法
- 抽象类 / 抽象方法一定不能被 final 修饰
- 一个方法是抽象方法,那么存放它的类一定要声明成 抽象类
抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类 - 当抽象类A 继承抽象类B,A可以不重写B的方法,但一旦A再被继承,那么一定还要重写抽象方法
- 抽象方法一定不能被 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—抽象类和接口相关推荐
- java定义一个door的类_再探Java抽象类与接口的设计理念差异
原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...
- 没有体现JAVA接口功能_深入浅出分析Java抽象类和接口【功能,定义,用法,区别】...
本文实例讲述了Java抽象类和接口.分享给大家供大家参考,具体如下: 对于OOP编程来说,抽象是它一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:抽象类和接口. 这两者有相似之处也有很 ...
- JAVA抽象类和接口的深入探讨
Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...
- java 抽象类和接口2--什么时候用接口什么时候用抽象类
java 抽象类和接口1–基本概念 https://blog.csdn.net/qq_26296197/article/details/81315685 从生活的角度看 把编程映射会日常生活进行对照, ...
- JAVA学习经验--总结JAVA抽象类和接口
* --总结JAVA抽象类和接口 * 1.抽象类: * 1>抽象类可以修饰方法,修饰类,但不能修饰属性,不能被实例化 * 2>抽象类可 ...
- java接口vm和dto的区别_第十八节:详解Java抽象类和接口的区别
前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...
- JAVA抽象类和接口类的区别
JAVA抽象类和接口类的区别 1.声明方式不同.抽象类为abstract class,接口类为interface. 2.继承抽象类关键字为extends,实现接口关键字为implements. 3.继 ...
- 再探Java抽象类与接口的设计理念差异
Java抽象类与接口都可以实现功能与实现的分离,都对多态提供了很好的支持,那么我们什么时候应该使用抽象类或接口呢?在以前的一篇文章初探Java抽象类与接口中谈到了他们语法的区别,在博客通过模板方法模式 ...
- jdk1.8中,java 抽象类和接口的区别
抽象类 特点: 1.抽象类中可以构造方法 2.抽象类中可以存在普通属性,方法,静态属性和方法. 3.抽象类中可以存在抽象方法. 4.如果一个类中有一个抽象方法,那么当前类一定是抽象类:抽象类中不一定有 ...
- JAVA抽象类和接口的区别【附经典分析用例Door】
这篇文章对抽象类和接口说的很详细,希望对大家有所帮助. abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大 ...
最新文章
- 6个2教你认识递归的力量!
- 【工具篇】抓包中的王牌工具—Fiddler (1-环境搭建)
- Arthas 用户文档
- Docker资源汇总
- 网易:层次遍历二叉树
- 图片的等比缩放和Logo水印
- 安装配置管理 之 安装和配置 JPackage Java
- Atitit 解析m4a文件的元数据标签音乐名,歌手 专辑 年代等信息 java版本 目录 1.1. 自己解析mp4 m4a结构	1 1.2. 格式返回	1 1.3. /bookmarksHtmlE
- 二叉树前序遍历、中序遍历、后序遍历 递归和非递归方式实现
- mybatis-plus 自定义UpdateWrapper(二)实现列的case set
- React Suspense lazy
- 信息学奥赛一本通C++语言——1139:整理药名
- python读文件的方法
- 搭建FTP服务器(二):虚拟目录的设置
- 数据库-cmd下安装mysql服务
- Log4j2发送邮件通知
- C++中复制构造函数与重载赋值操作符
- linux 内存free少问题
- win10系统右键一直转圈问题解决方案
- ubuntu搭建esp-idf开发环境 解决github下载慢
热门文章
- PHP工程师零基础入门到就业班
- jetty了解与使用
- java 计算器api_Java制作简易计算器day23-软件客栈
- luogu P4921 [MtOI2018]情侣?给我烧了! 加强版
- Excel将单表复制追加到另一个未打开的工作簿
- 项目 : 预测波士顿房价_团结波士顿更新:早鸟票销售将于明天结束。 部分时间表到了!
- 【i.MX6ULL】驱动开发2——新字符设备开发模板
- 解决lombok.extern.slf4j.Slf4j等lombok包错误
- 图像的频率域高斯低通滤波
- maskrcnn-benchmark 代码详解之 resnet.py