JAVA基础:抽象类,接口,instanceof,类关系,克隆

1 JDK中的包

  • JDK = JRE + 开发工具集(javac.exe)

  • JRE = JVM + java类库

  • JVM = java 虚拟机

  • jdk中自带了许多的包(类) , 常用的有

    • java.lang 该包中的类,不需要引用,可以直接使用。 例如:Object , System , String

    • java.util

    • java.sql

    • java.net

    • java.io

    • java.text

2 抽象方法与抽象类

2.1 抽象方法

  • 抽象方法,就是不具体的方法。

  • 语法而言:哪里不具体? 没有方法体,具体的执行操作不知道

    由abstract关键字修饰,没有方法体的方法,称为抽象方法

public void test1(){}public abstract void test1();
  • 逻辑而言:哪里不具体呢? 只清楚基本规则规范,但不确定具体的实现。

  • 抽象方法怎么用?

    • 抽象不能直接调用

    • 抽象方法必须被子类重写,实际使用的是子类重写的方法。(抽象方法可以作为规则)

      抽象方法不能被private修饰 ,不能被final修饰, 不能被static修饰

  • 抽象方法必须写在抽象类或接口中

2.2 抽象类

  • 由abstract关键字修饰的类,称为抽象类

public class A{}
public abstract class B{}
  • 抽象类也是类,可以有构造方法,普通属性,普通方法 和 抽象方法

  • 抽象类不能创建对象

  • 抽象类的主要作用就是定义抽象方法。

  • 抽象类必须被子类继承使用,并且子类要重写抽象类中的所有抽象方法,否则子类也是一个抽象类

  • 抽象类中可以不包含抽象方法,但意义不大。

3 接口

  • 接口是一个特殊的抽象类

  • 接口中只能有抽象方法和静态的公共常量,没有普通方法 ,也没有构造方法,不能创建对象

  • 接口使用interface关键字定义

class A{}
abstract class B{}
interface C{}

接口也必须被子类继承使用,子类继承接口称为 实现接口, 使用implements关键字完成类与接口的实现关系,子类被称为实现类

interface A{}
class B implements A{}
  • 子类实现接口后,需要重写接口中的所有抽象方法,否则子类也是抽象类

  • 子类可以实现多个接口

interface A{}
interface B{}
class C implements A , B{}

  接口之间也可以继承,并支持多继承

interface A{}
interface B{}
interface C extends A , B{}

扩展

  • 接口中的所有方法都是公共的抽象方法, 可以省略 public abstract

  • 接口中的所有属性都是公共的静态常量属性,可以省略public static final

interface A{void t1();   //public abstract void t1();int i = 10 ; //public static final int i = 10 ;
}

 

扩展

  • jdk1.8之后,接口中可以提供非抽象方法

interface A{default void t1(){}
}

 

随之而来的就是二义性问题

  • 如果子类只实现了一个接口,其中的default方法可以不用重写 (因为是一个非抽象方法)

  • 如果子类是实现了多个接口,其中有相同的default方法,要求必须重写default方法,表示哪一个父接口的方法都不继承。

    逻辑上可以使用接口.super.method()语法,表示要继承哪一个父接口中的default方法

interface A{default void t1(){System.out.println("------------------");}
}interface B{default void t1(){System.out.println("==================");}
}class C implements A , B{//理论上来说, C中拥有A的t1方法 和 B的t1方法 , 此时就存在二义性问题//要求子类重写t1方法,表示谁也不继承public void t1(){B.super.t1(); //逻辑上表示继承B的t1方法}
}

 

4 抽象类和接口选择问题

  • 语法角度: 优先选择接口 (类单继承,接口多实现)

  • 逻辑角度:

    • 抽象类也是类,类是对象的模板,更倾向于对象不具体的设计场景

      例如 : 门, 防盗门,卷帘门,电动门

    • 接口中只有方法,没有属性,无法代表对象,代表的是行为能力

      一般接口的命名多为 xxxxable , Runnable , Throwable , Clonable

5 类对象之间的关系

  • 类是对象的模板, 对象可以简单的理解成生活中的人或物,人和人,人和物, 物和物存在着一定的关系

  • 所以类,接口之间也存在的一定的关系

  • 这些关系有强 ,有弱。 我们称之为耦合程度

    我们希望编写耦合程度弱的程序。

  • 类对象之间的关系有以下几种

5.1 继承关系

称为泛化关系 , 类和类继承, 接口和接口的继承都属于继承关系

class A{}
class B extends A{}interface A{}
interface B extends A{}

继承是多态的基础 , 继承关系属于一种 is-a关系

继承关系是一种耦合度较强的关系

在UML建模时, 使用实线空心箭头表示

5.2 实现关系

指的就是类实现接口 , 特点与继承关系相同,也属于泛化关系,也是一种is-a关系

interface A{}
class B implements A{}

在UML建模时, 使用虚线空心箭头表示

5.3 包含关系

在一个类中,定义了另一个类型的属性 , 称之为 has-a关系

class A{}
class B{A a ;		//B中包含了一个AA[] as ;    //B中包含了一堆A
}

耦合程度要弱于继承关系

包含关系中随着包含程度的强弱,又分为3种包含情况

 

  • 关联 : A 和 B两个类是同级别的, 没有所属关系 教师和学生

    UML图中使用实线箭头

  • 聚合 : A 和 B两个类有组成关系,但又可以独立存在 车和轮

    UML图中使用空心菱形实线箭头

  • 合成 : A 和 B两个类是组合关系,不能分开 人和四肢

    UML图中使用实心菱形实线箭头

  • 无论是哪种关系,代码实现都是相同的,这三种关系属于逻辑上的分析与设计。

 包含关系根据包含内容的数量分为3种包含情况

1.一对一

class A{}
class B{A a ; 
}

2. 一对多/多对一

class A{B b;
}
class B{A[] as ;
}

3.多对多

class A{B[] bs ;
}
class B{A[] as
}

5.4 依赖关系

在一个类的方法执行时,使用到另一个类对象 , 称之为use-a关系

相比于继承关系和包含关系, 依赖关系的耦合程度最弱

class A{}
class B{public void t1(A a){... use a ...}
}

6 instanceof关键字

  • 在多态应用种,判断某一个父类型变量中存储的对象是否属于某一种子类型

class A{}
class B extends A{}  //B is-a A
class C extends B{}  //C is-a B . C is-a AA a = new B();
//c代表的是C对象
(a instanceof A)  		// true
(a instanceof B)		// true
(a instanceof C)		// false
(a instanceof Object)   // true
(a instanceof String)   // 报错

 

7 对象克隆

  • 所谓的克隆,就是根据一个对象,创建另一个内容相同的新对象

  • 需要对象备份的时候可以使用克隆

  • Object类中有一个clone方法,底层可以实现对当前对象的备份。

  • clone方法是一个protected方法,只能在子类中完成克隆,不能被外部对象强行克隆

  • 需要子类重写clone方法,完成clone操作

  • 同时还需要子类实现Cloneable接口

  • 总结如何实现一个类对象的克隆?

    1. 子类实现Cloneable接口

    2. 子类重写clone方法

    3. 子类修改重写的clone方法的访问权限,改为public (是否支持外部克隆)

public class Goods implements Cloneable{@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}

 

扩展 浅克隆与深克隆

存在一种包含关系

class A{}
class B{A a ;
}
  • 浅克隆 : 在克隆B的时候,,新的B对象中,a属性的地址与原来B对象中a属性的地址相同

  • 深克隆:在克隆B的时候,新的B对象中,a属性 地址是一个新的A对象的地址

    也就是说,不仅仅将B对象做了克隆,还将B对象包含的A对象也做了克隆

    深克隆需要手动实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/422303.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis面试题整理

Redis 1、Redis主从集群 1.1、搭建主从集群 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离 1.2、主从同步原理 当主从第一次同步连接或断开重连时,从节点都会发送psync请求&…

即插即用篇 | YOLOv8 引入组装式Transformer模块AssembleFormer | arXiv 2024

本改进已同步到YOLO-Magic框架! 摘要—早期检测和准确诊断可以预测恶性疾病转化的风险,从而增加有效治疗的可能性。轻微的症状和小范围的感染区域是一种不祥的警告,是疾病早期诊断的重中之重。深度学习算法,如卷积神经网络(CNNs),已被用于分割自然或医学对象,显示出有希…

mp3转文字要怎么处理?使用这4个工具就对了

MP3是音频当中比较常用的格式,如果像将其转换成文字内容,一般的语音转文字工具都是可以完成的。但是音频转换成文字的过程中,它的准确率是会受到像口音,语言,环境音等因素的影响的。所以大家如果想将自己的mp3语音转成…

INIC6081量产工具下载,initio6081开卡软件分享

国内固态硬盘常用,且有量产工具流传出来的主控厂商包括慧荣、群联、点序、英韧、得一微、瑞昱、联芸、迈威、国科、华澜微等等。 每个主控需要用各自对应的量产工具,不同的量产工具支持的闪存颗粒也有差异,因此要根据固态硬盘实际的主控型号…

ESXI8.0 vsphere vcenter 多网卡多网段配置

一般来说服务器至少两块网卡,安装esxi后一种方案是利用闲置网卡建立多上传链路,聚合,另一种是配置多网段进行虚拟机隔离,网上也没找到讲的很清楚的,经过多种尝试终于学会,记录分享一下 首先物理交换机的随…

【idea-安装】

JetBrains官⽹ : https://www.jetbrains.com/ 1.下载idea安装包,下载旧一些的版本,避免新版本的不稳定。 下载下来的安装包是exe格式的,直接点击运行。 点击Next 2.选择要下载的位置,点击下一步。 3.选择⽣成快捷⽅式和建⽴⽂件…

Nginx怎么重新编译添加模块

转自 https://www.php.cn/faq/547300.html

linux_终端输入_几个提高效率的超有用配置

ubuntu为例: 1. 按上下键,补全历史指令 只输入一条历史命令的前几个字母,再按PageUp和PageDown键,就可以在以此字母为前缀的历史命令中上下切换。这个功能非常实用,而且比CTRLR使用起来更友善、更方便。遗憾的是&…

fastadmin 文件上传腾讯云

1-安装腾讯云SDK composer require qcloud/cos-sdk-v5 2-腾讯云配置 <?phpnamespace app\common\controller;use Qcloud\Cos\Client; use think\Controller; use think\Db;class Tencent extends Controller {/*** 上传文件* param $config* param $key* return array*/p…

《卷积神经网络 CNN 原理探秘》

CNN基本原理详解 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;&#xff0c;是一种前馈神经网络&#xff0c;人工神经元可以响应周围单元&#xff0c;可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受…

Visual Studio 设置文件默认编码格式、行尾符等

文章目录 1.命令方式2.EditorConfig配置 1.命令方式 2.EditorConfig配置 微软官方文档 使用EditorConfig方式配置&#xff0c;无需Visual Studio软件自带对EditorConfig的支持&#xff0c;无需插件 将下面.editorconfig文件放在项目根目录下 root true # 所在目录是根目录…

外包干了三年,快要废了。。。

先简单说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了3年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

Ubuntu上安装libdc1394-22-dev出现无法定位安装包的解决办法

一、libdc1394-22-dev介绍 libdc1394-22-dev 是一个开发库&#xff0c;用于与IEEE 1394 (FireWire)摄像头进行交互。具体来说&#xff0c;它是 libdc1394 的开发版本&#xff0c;提供了开发者头文件和链接库&#xff0c;方便在应用程序中集成对基于 IEEE 1394 标准的数码相机的…

Java11环境安装(Windows)

目录 1 Java11安装2 配置2.1 JavaHome配置2.2 CLASSPATH配置PATH路径配置 3 验证 1 Java11安装 从官网下载Java11安装包&#xff1a;jdk-11_windows-x64_bin.exe,安装时选择安装到D:\Java目录。 安装完目录结构如下&#xff1a; 2 配置 2.1 JavaHome配置 如下图所示配置JAV…

【c++实现】统计上升四元组

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 1. 题目描述2. 解释3. DP前缀和枚举 1. 题目描…

鸿蒙交互事件开发04——手势事件

1 概 述 手势事件是移动应用开发中最常见的事件之一&#xff0c;鸿蒙提供了一些方法来绑定手势事件。通过给各个组件绑定不同的手势事件&#xff0c;并设计事件的响应方式&#xff0c;当手势识别成功时&#xff0c;ArkUI框架将通过事件回调通知组件手势识别的结果。 …

ARM32开发——DMA内存到内存

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求数据交互流程开发流程依赖引入DMA初始DMA传输请求完整代码 关心的内容DMA初始化DMA初始化DMA数据传输请求完整代码 DMA中断开启…

Ruoyi Cloud 本地启动

参考 http://doc.ruoyi.vip/ https://gitee.com/y_project/RuoYi-Cloud https://blog.csdn.net/cs_dnzk/article/details/135289966 https://doc.ruoyi.vip/ruoyi-cloud/cloud/seata.html#%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D 拉取代码本地跑通 用 git 从 ruoyi 微服务版仓…

sqli-labs靶场自动化利用工具——第6关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

已成功入职华为,总结精选50个大模型高频面试题(附答案)

觉得中大厂面试太难的&#xff0c;完全就是自己没准备充分&#xff0c;技术不到位&#xff0c;没准备的面试完全是浪费时间&#xff0c;更是对自己的不负责! . 今天我给大家分享一下我整理的**《精选50个大模型高频面试题》** 大模型面试专题和答案&#xff0c;其中大部分都是面…