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

news2024/11/26 16:35:51

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中包含了一个A
    A[] 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 A

A 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{
    @Override
    public 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.coloradmin.cn/o/2124616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于axios同步获取数据的问题

axios同步获取数据 Axios介绍问题代码修改 总结 Axios介绍 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 X…

利用Ai短视频原创,撸平台流量轻松月入过万!

今天分享一个利用Ai短视频原创,撸平台流量轻松月入过万!当前短视频领域尤其是原创内容的制作,主要可以通过三种方式实现:首先是自行拍摄,这种方式虽然能够确保内容的原创性,但需要一个团队来协作完成拍摄、脚本编写和后…

Samtec AI应用科普 | 人工智能中的互连

【摘要/前言】 现代生活的方方面面都受到了计算机和半导体的影响,但最能吸引公众想象力的莫过于人工智能(AI)和机器学习(ML)的兴起。 【AI推动创新】 虽然人工智能已经存在了一段时间,但最近的技术进步已…

JavaSSM框架项目 在线投票系统(ppt+详细文档)

​ 在线投票管理系统的设计与实现 1.系统需求分析 随着互联网与信息技术的快速发展,计算机已经在各行各业都得到了十分广泛的应用,人们越来越习惯使用计算机来完成各种日常的工作,"无纸化"办公模式成为当前社会的主流.传统的人工投票方式,往往需要将参与投票的人们…

【中国通信院】大模型落地路线图研究报告2024解读-54页附下载

前言 这份《大模型落地路线图研究报告(2024年)》由中国信息通信研究院人工智能研究所编制,旨在为大模型技术的应用落地提供系统性的指导和参考。以下是对报告内容的解读和分析: 1. 大模型发展概述 技术能力提升:大模…

氯气检测仪:游泳池水质安全的隐形守护者

氯气检测仪:游泳池水质安全的隐形守护者 夏日炎炎,游泳池成为了人们避暑、锻炼的热门去处。然而,随着人流量的激增,游泳池水质的维护与管理成为了一项至关重要的任务。在这个过程中,氯气检测仪以其独特的功能和精准的性…

SpringCloud之Gateway

(学习笔记) 1、概述 官网:Spring Cloud Gateway Gateway是在Spring生态系统之上构建的API网关服务,基于Spring6,Spring Boot 3和Project Reactor等技术。它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式,并为它们…

数据结构——(java版)Map与Set

文章目录 二叉搜索树(1) 二叉搜索树的概念:(2)二叉搜索树的意义:(3)二叉搜索树的实现:实现的方法与属性实现二叉搜索树的查询:实现二叉搜索树的插入&#xff…

C++环境配置

目录 1. 前言 2. 正文 2.1 问题 3. 备注 1. 前言 好久不见,最近有些病痛缠身,最近流感有些频发,小生不慎中招,实在是惭愧。当然这不是虚哈,说虚的先出去看个电影再回来。我猜是因为好久没感冒了,所以可…

“最佳行业标杆应用”!亿达科创亮相国际人工智能展

9月8日,2024第五届深圳国际人工智能展会启幕。展会以“智创未来价值链接”为题,汇聚全球人工智能领域的顶尖企业、专家学者及创新成果,亿达科创受邀参展并发表主题演讲,全面展示人工智能技术的最新进展和广泛应用。会上发布“GAIE…

大模型算法岗位面试攻略:100个常见问题详解,高效备战拿下三个offer!

导读 大模型时代很多企业都在开发自己的大模型,这直接刺激了大模型岗位的需求。本文为大家整理了大模型面试相关的知识点,希望对大家面试求职有所帮助。 今天分享大模型面试相关知识点,持续更新。 1. RAG技术体系的总体思路 数据预处理->…

Mysql链接异常 | [08001] Public Key Retrieval is not allowed

Datagrid报错 [08001] Public Key Retrieval is not allowed 这个错误通常是由于 MySQL 8.0 中的新特性导致的。默认情况下,MySQL 8.0 使用 caching_sha2_password 作为认证插件,而你需要在连接 URL 中明确允许公钥检索或者使用老版本的认证方式 mysql…

小型洗衣机什么牌子好又便宜?五款备受好评机型测评,闭眼入

在日常生活中,内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机,不仅可以减少洗衣负担,还能提供高效的洗涤效果。然而,市场上众多内衣洗衣机品牌琳琅满目,让我们往往难以选择。那么&a…

NXOpenC属性操作

1.属性基本介绍 查看属性,文件->属性 使用VS创建项目,找到do_it(),在do_it()里面进行修改 删除属性,使用UF_ATTR_delete(),第一个参数是部件的TAG,第二个参数是属性的类型,第三个属性名字。 下标是属性类型 类型整型UF_ATTR_integer实数类型UF_ATTR_real时间类型U…

strtok函数讲解使用

目录 1.头文件 2.strtok函数介绍 3.解释strtok函数 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.头文件 strtok函数的使用需要头文件 #include<string.h> 2.strto…

Chrome 本地调试webrtc 获取IP是xxx.local

浏览器输入 chrome://flags/#enable-webrtc-hide-local-ips-with-mdns并将属性改为disabled修改成功后重启浏览器并刷新网页即可

开放式耳机是什么意思?五款高评分产品极力推荐!

开放式耳机是一种耳机设计&#xff0c;其特点是耳机的耳杯或耳罩不是完全封闭的&#xff0c;允许空气在耳机内部和外部环境之间自由流动。这种设计通常用于头戴式耳机&#xff0c;而不是入耳式耳机。开放式耳机的主要特点包括&#xff1a; 1. 声音传播&#xff1a;开放式耳机允…

Nestjs仿小米商城企业级Nodejs RBAC 微服务项目实战视频教程+Docker Swarm K8s云原生分布式部署教程分享

Nest.js是一个渐进的Node.js框架&#xff0c;可以在TypeScript和JavaScript (ES6、ES7、ES8)之上构建高效、可伸缩的企业级服务器端应用程序。它的核心思想是提供了一个层与层直接的耦合度极小、抽象化极高的一个架构体系。Nest.js目前在行业内具有很高的关注度&#xff0c;所以…

SAP自动付款和自动付款常见错误解决方案

应付账款-自动付款 供应商组(ERP)决定业务伙伴角色 分组决定编号范围;分组也与ERP中的供应商组相映射业务伙伴角色选择BP,分组可以选择BP/VN/CU;业务伙伴角色选择VN,分组只能选择VN 首先创建BP 标识可根据币种进行区别,不设置系统自动排序。其中银行账户22位…