【Java零基础入门篇】第 ⑤ 期 - 抽象类和接口(一)

news/2024/11/27 8:49:30/

博主:命运之光
专栏:JAVA入门

 

学习目标

1.了解什么是抽象类,什么是接口;

2.掌握抽象类和接口的定义方法;

3.理解接口和抽象类的使用场景;

4.掌握多态的含义和用法;

5.掌握内部类的定义方法和使用方法;

目录

抽象类

抽象类的由来

抽象类的定义格式

抽象类的使用

使用抽象类的目的

注意事项

对象的多态性——向上转型

向下转型

接 口

接口概述

接口的定义

接口的实现

抽象类与接口的对比


抽象类

抽象类的由来

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征

  • 将一个父类设计得非常抽象,以至于它没有具体的实例(对象),这样的类叫做抽象类
  • 即定义一个方法,却不明确方法具体如何实现时,可以将方法定义为抽象方法含有抽象方法的类就定义成抽象类

抽象类的定义格式

[修饰符] abstract class 类名 {

【修饰符】 abstract 返回值类型 方法名(【参数列表】); //抽象方法 ………..

}

  • 抽象方法指的是没有方法体的方法;
  • 抽象方法必须使用abstract关键字进行定义;
  • 拥有抽象方法的类一定属于抽象类;
  • 抽象类要使用abstract声明。

🍓🍓抽象类的定义举例

abstract class A { 		// 定义一个抽象类,使用abstract声明public void fun() { 		// 普通方法System.out.println(“存在有方法体的普通方法!");}// 此方法并没有方法体的声明,并且存在有abstract关键字,表示抽象方法public abstract void print();
}

抽象类的使用

抽象类定义好,但是如果要想使用抽象类则必须遵守如下原则:

抽象类必须有子类,即:每一个抽象类一定要被子类所继承(使用extends关键字),但是在Java中每一个子类只能够继承一个抽象类,所以具备有单继承局限;

②抽象类的子类(子类不是抽象类必须覆写抽象类之中的全部抽象方法(强制子类覆写);

③可以通过抽象类的子类完成抽象类的实例化对象操作。

使用抽象类的目的

  • 可以把子类共有部分抽取出来,并且实现所能实现的部分,从而为子类提供继承
  • 不必实现所有的方法,对于那些只需知道行为是什么,不用知道具体怎么做的方法,可以只给出说明,即定义成抽象的,而把具体的实现交给子类去做。

把那些共有的、但不能具体实现的行为抽出来,定义成抽象的方法,作用有两点:

  • 一、为子类规定了统一的规范;
  • 二、实现了多态性。

注意事项

①抽象类可以包含抽象方法,也可以不包含抽象方法。但是包含抽象方法的类必须定义抽象类

②抽象类不能被实例化,抽象类可以被继承,所以不允许定义成final类

③抽象类中一定有构造器,便于子类实例化时调用。

④抽象方法只有方法的声明没有方法体

继承抽象类的类必须实现抽象类的所有抽象方法,否则,也必须定义成抽象类

⑥若子类重写了父类中的所有抽象方法后,此子类才可以实例化

对象的多态性——向上转型

向上转型: 是指把一个子类的对象转成一个父类的对象。

语法格式:父类名称 对象名 = new 子类名称()

右侧创建一个子类对象,把它当作父类来看待使用。

注意:向上转型一定是安全的,没有问题的,但是也存在弊端。一旦向上转型为父类,那么就无法调用子类原本的独有方法。

向下转型

向下转型是把一个父类对象转到一个子类对象(还原)。

语法格式:子类型名称 对象名 =(子类名称父类对象;

将父类对象,(还原)成为本来的子类对象

注意:向下转型需要强制烈性转换,不一定安全,不推荐使用,除非明确知道被转换对象的实际类型是什么,能够确保转换正确才行。

接 口

接口概述

日常生活中,两个实体之间进行连接的部分称为接口。如电脑和U盘连接的标准USB接口。接口可以确保不同实体之间的顺利连接。如不同厂家和U盘厂家只要按照相同的USB接口进行生产,那么所有的电脑和U盘就可以顺利的连接起来。

  • 有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有继承的关系,仅仅是具有相同的行为特征而已。例如:鼠标、键盘、打印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机、移动硬盘等都支持USB连接
  • 接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。一个接口就是描述一种能力,作用就是告诉类,要实现这种接口代表的功能,就必须实现某些方法,才能确定类拥有该接口代表的某种能力。
  • 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承有了接口,就可以得到多重继承的效果

接口的定义

🍓🍓所谓的接口严格来讲就属于一个特殊的类,而且这个类里面只有抽象方法与静态常量(JDK1.8之前版本的定义

接口的定义格式为:

[public] interface 接口名 {

static final 类型名 常量名; //常量列表

public abstract 类型名 方法名(【参数列表】); //抽象方法列表

}

接口的定义跟类相似,只能定义成public权限或者默认权限。接口里的变量和方法都是公有的,即只能是public权限,但public可以省略。

接口的实现

接口使用规则

由于接口中存在抽象方法,所有接口对象不可能直接使用关键字new进行实例化操作。

  • 接口必须要有子类(实现类,此时一个实现类可以使用implements关键字实现多个接口,避免了单继承局限
  • 接口的子类(如果不是抽象类),必须要覆写接口中的全部抽象方法
  • 创建实现类的对象,进行使用。

格式如下:

[ 类修饰符] class 类名 [ extends 父类名 ] [ implements 接口名列表 ] {

成员变量定义;

成员方法定义;

}

🍓🍓例1:类实现多个接口。

interface A { 	// 定义接口public static final String MSG = "MDIT"; 	// 全局常量public abstract void print(); // 抽象方法
}
interface B {		// 定义接口public abstract void get();// 抽象方法
}
class X implements A, B { 	// X类实现了A和B两个接口public void print() {	// 覆写A接口的抽象方法System.out.println("A接口的抽象方法!");}public void get() {	// 覆写B接口的抽象方法System.out.println("B接口的抽象方法!");	}
}
public class text1 {public static void main(String args[]) {// 此时X类是A和B两个接口的子类X x = new X(); // 实例化子类对象x.print();// 调用被覆写过的方法x.get();// 调用被覆写过的方法System.out.println(A.MSG);// 直接访问全局常量}
}

🍓🍓例2:子类继承抽象类同时实现接口。

interface A { 			// 定义接口public abstract void print(); // 抽象方法
}
interface B {		// 定义接口public abstract void get();	// 定义抽象方法
}
abstract class C {	// 定义抽象类public abstract void change();	// 定义抽象方法
}
class X extends C implements A, B { 	// X类继承了抽象类C,实现了A和B两个接口public void print() {		// 覆写接口A中的方法System.out.println("A接口的抽象方法!");}public void get() {	// 覆写接口B中的方法System.out.println("B接口的抽象方法!");}public void change() {	// 覆写抽象类C的方法System.out.println("C类的抽象方法!");}
}
public class text1 {public static void main(String args[]) {// 此时X类是A和B两个接口的子类X x = new X(); // 实例化子类对象x.print();// 调用被覆写过的方法x.get();// 调用被覆写过的方法}
}

🍓🍓接口的多继承。

一个类只能继承另外一个类,但一个接口可以同时继承多个接口,多个接口之间用英文逗号分隔开。

interface A {				// 定义父接口public void funA();
}
interface B {				// 定义父接口public void funB();
}
interface C extends A, B {	// 利用extends,实现接口多继承public void funC();
}
class X implements C {		// 实现C接口子类要覆写全部抽象方法public void funA() {System.out.println("funa");}		// A接口定义的方法public void funB() {System.out.println("funb");}		// B接口定义的方法public void funC() {System.out.println("func");}		// C接口定义的方法
}
public class text1 {public static void main(String args[]) {// 此时X类是A和B两个接口的子类X x = new X(); // 实例化子类对象x.funA();// 调用被覆写过的方法x.funB();// 调用被覆写过的方法x.funC();// 调用被覆写过的方法}
}

接口使用时需要注意:

  • 接口是系统中最高层次的抽象类型;
  • 接口本身必须十分稳定,接口一旦定制,就不允许随意修改,否则对接口实现类以及接口访问都会造成影响。

抽象类与接口的对比


http://www.ppmy.cn/news/66530.html

相关文章

Java基本数据类型详解及应用示例

Java作为一门强类型语言,基本数据类型是非常重要的概念。Java中基本数据类型分为四种类别:整数类型、浮点数类型、字符类型和布尔类型。其中,每一种数据类型都有着不同的占用字节数和表示范围,合理使用选择不同的数据类型可以提高…

多线程相关高频面试题

一、线程的基础知识 1、线程和进程的区别? 进程是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务。不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间。线程更轻量,线程上下文切换…

小牟Andorid下面MD5具体实现的思路总结

Android的开发往往需要一定数目demo 从今起MD5一些加密算法提取物 看看是如何实现的 首先,我们必须明确为什么加密? 1 数据安全处理 2 防止数据窃取 3 有效的避免恶意攻击 4 保证文件完整性 5 优化搜索 作为文件(数据)索引…

VMware vSphere Replication 8.7 (for vSphere 8.0U1) - 虚拟机复制和数据保护

请访问原文链接:https://sysin.org/blog/vmware-vsphere-replication-8/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 新增功能 vSphere Replication 8.7 | 2023 年 4 月 18 日 | 内部版本 21591677 vSphere Re…

4 IK分词器

4 IK分词器 4.1测试分词器 在添加文档时会进行分词,索引中存放的就是一个一个的词(term),当你去搜索时就是拿关键字去匹配词,最终 找到词关联的文档。 测试当前索引库使用的分词器: post 发送&#xff…

【2023华为OD笔试必会20题--C语言版】《17 猜字谜》——字符串

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的20道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…

数据结构-查找-线性结构(顺序、折半、分块)查找

目录 一、顺序查找 *查找效率分析 二、折半查找 *查找效率分析 三、分块查找 *查找效率分析 一、顺序查找 有称线性查找, 算法思想:从头到尾挨个查找(反过来也行) typedef struct{int *elem; //数据int TableLen; …

Git 常用命令(优化版本)

Git常用命令 仓库 初始化一个Git代码库:git init克隆一个项目和它的整个代码历史:git clone [url]配置 显示当前的Git配置:git config --list编辑Git配置文件:git config -e [--global]设置提交代码时的用户信息:gi…