《码出高效:Java开发手册》笔记之二-面向对象

news2025/2/21 22:21:00

前言

第二章主要是讲面向对象,也就是oop,这个概念其实很多人已经听腻了,都是非常基础的知识,本章就是讲一些java以及很多编程语言的基础设计思想

正文

oop理念

面向对象是在早期滥用面向过程编程后出现的,面向过程的代码,互相耦合严重,无法复用,于是出现了先搭框架和条件的面向对象编程
面向对象传统具有三大特性:封装、继承、多态,或者说四大,加一个抽象特性
抽象:就是提取事物基本属性的能力
封装:就是降低模块的耦合,增加内聚力
继承:就是通过父子类来使得模块更有复用性
多态:就是在复用性基础上添加了扩展性
object类:
任何类的默认父类,概括了一个事物需要的方法,从社会科学来说:
我是谁?getClass ()说明身份,toString()展示信息
我是谁?Object()方法生产对象,clone()复制对象
我到哪里去?finalize()方法销毁对象
clone()方法还分为浅拷贝,一般深拷贝,彻底深拷贝
· 一般浅拷贝就是只复制基本数据类型及其引用变量,内存空间指向相同;深拷贝就是复制了指向的内存空间,而彻底深拷贝,需要覆写 clone () 方法实现引用对象的深度遍历式拷贝。

hashCode 和 equals用于比较和别人是否一样的方法
wait和notify用于通信协作的方法

初识Java

  • 类的定义:
    访问级别:public和无访问控制符
    类型:class,interface,enum
  • 类的组成:成员、方法,getter,setter方法
  • 接口与抽象类:为对实体类进一步抽象,只保留公共行为和特征
    两者异同是一个经常考察的知识点,如下图
    在这里插入图片描述
  • 抽象类是一种is-a的关系,比如老鹰是鸟,那么鸟是抽象类,老鹰继承它
    接口是一种can-do,比如老鹰和鸟都能飞,那么飞是接口
  • 抽象类定义了一些共通的东西,一份宽松模板,实现它后还可以分出自己的独有东西
    接口是一种严格的契约,实现它必须严格遵守接口里的东西
    抽象类实现接口
  • 当难以决定是否用接口或者抽象类时,优先用接口,之后再用抽象类实现接口,组合接口的特性,如上图

内部类

  • 定义类名通常只能与类文件同名,在类内部再定义类就是内部类,类别:静态,成员,局部,匿名

  • 编译产生的类文件,数字编号是同名内部类

  • 在这里插入图片描述

  • 定义内部类的好处是定义域不会扩散到类外,可以通过外部类.内部类访问,内部类可以访问外部类属性和方法,在jdk源码里内部类比较常见

访问权限控制

  • 此处较简单,一个表就可以覆盖
    在这里插入图片描述
    ( I )如果不允许外部直接通过 new 创建对象 , 构造方法必须是 privale
    ( 2 )工具类不允许有 public 或 default 构造方法
    ( 3 )类非 static 成员变量并且与子类共享 必须是 protected
    ( 4 )类非 static 成员变量并且仅在本类使用 ,必须是 private
    ( 5 )类 static 成员变量如果仅本类使用 ,必须是 private
    ( 6 )若是 static 成员变量 ,必须考虑是否为 final
    ( 7 )类成员方法只供类内部调用 ,必须是 private
    ( 8 )类成员方法只对继承类公开 ,那么限制为 protected

this和super

对象初始化时,需要到达object类,利用的就是this和super
在这里插入图片描述
如图为this和super的一些特性异同

类关系

类之间的关系主要有五种:
[ 继承 ] extends (is-a )
·[ 实现 ] implements (can - do )
·[ 组合 ] 类是成员变量 ( contai n s - a )
·{ 聚合 } 类是成员变量( has - a )
·[ 依赖 ] import 类 ( use-a )
五种关系类图

序列化

  • 序列化主要是为了传输时二进制化,反序列化就是将二进制流恢复为对象数据,使用场景主要在RPC框架的数据传输上
  • 常见序列化方式:java原生序列化,实现Serializable接口,不可跨语言,性能一般
    Hessian序列化:可跨语言,新嗯呢该较好
    JSON序列化:转换为JSON字符串,可读性较好,安全性较差

方法

  • 方法签名:主要是方法名称和参数列表,用来标识方法,调用时寻找方法
  • 参数:分形参和实参,比如一个方程xy+z=10,x=1,那么x是形参,1就是实参
  • 参数的处理:通常不保证传入参数和规定一致,就需要进行参数预处理,这里有两种方法:入参保护,就是控制参数数量规格,不合就返回错误信息,参数校验:检查参数会耗费性能,需要合理规定场景
  • 在这里插入图片描述
    在这里插入图片描述

构造方法

  • 构造方法时新建对象时会调用的方法,要求如下:
    方法名与类名相同
    没有返回类型
    不能被继承,重写;不能被直接调用
    类默认提供无参构造
    构造方法可私有
  • 父子类静态代码块和构造方法执行顺序,注意如果再次对象实例化,静态代码块不会重复执行,只会执行一遍构造方法
  • 在这里插入图片描述

类内方法

方法分三类:实例方法,静态方法,静态代码块

  • 实例方法:实例方法可以互相调用,可以调用静态变量和方法
  • 静态方法:不能调用实例成员和方法,不能使用super和this关键字,工具类为了线程安全通常会用静态方法
  • 静态代码块:类加载时先于构造方法执行,可访问静态变量和方法

getter和setter

  • 为成员变量提供读取和修改,好处是利于封装和统一控制,在POJO类中常见
  • 有一些易错点:
    在getter和setter里添加业务逻辑,比如修改值,不利于排查
    同时定义isXxx()和getXxx ()
    不同类里有同样的属性名,引起歧义

同步与异步

同步操作是阻塞式的,异步是非阻塞的,一些耗时长的操作使用反向通知,需要别的系统进行耦合,轮询则耗费性能,就可以用一个缓存队列,把同步变成异步操作

覆写

override,叫做覆写是利于与重构分别,子类覆写了父类方法,调用时就会指向子类方法,也叫做向上转型

  • 覆写需要满足四个条件:
  • 访问权限不能变小,否则子类无法执行父类方法
  • 访问类型能向上转型为父类类型
  • 异常可以向上转型为父类异常
  • 方法名,参数类型和个数必须一致,这里和重载有区别,重载是名相同,参数列表可以不同

重载

重载就是同一个类中,多个方法同名不同参

  • 需要注意的是对于一些优先级高的方法,例如可变参数,无参方法,JVM调用的顺序如下:
    在这里插入图片描述

泛型

泛型就是类型参数化,有时不确定对象类型,就可变部分来复用代码
在这里插入图片描述
如图使用对象类型的参数,传入对象,这样容易产生类型转换错误,使用泛型后
在这里插入图片描述
这样避免的object输入输出类型转换错误,还可有如下好处
在这里插入图片描述

数据类型

数据类型分基本和引用数据类型,基本就是八大,boolean,byte,char,short ,int,long,float,double,此书中认为refvar也是一种基本数据类型,如下表为各种类型的参数

在这里插入图片描述

  • 包装类型
    八种基本类型都有包装类型,体现了java一切皆对象的设计理念,包装类型可以解决一些hashcode获取哈希值之类的问题,比如getclass获取类
  • 包装类比较,推荐使用equals,因为在-128到127之间可以用==,但之外都在堆上产生
  • 除float和double外,其他包装类赋值,底层调用valueof方法
  • 在这里插入图片描述
    这里就是在缓存区间内就直接返回,否则new一个对象
    以下是各类型的缓存区间

在这里插入图片描述
在这里插入图片描述
在选择包装类和基本数据类型时,选择方式如下
在这里插入图片描述

字符串

  • 字符串主要有三种:String 、StringBuilder、StringBuffer
  • String对象赋值后,会放到常量池中,下次申请创建对象时,会从池中取并返回
  • StringBuffer可在源对象上修改,线程安全
  • StringBuilder是非线程安全的,需要进行手动加锁,操作效率比StringBuffer高
  • 在循环内,拼接字符串推荐使用StringBuilder的append方法,如下图会new一个StringBuilder对象,append后再返回toString,降低性能
    在这里插入图片描述

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

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

相关文章

CSS清除浮动的五种方法(超详细)

1.为什么要清除浮动? 浮动的原理是让图片脱离文档流,直接浮在桌面上。我们一般布局的时候都是只设置宽度不设置高度,让内容来自动填充高度。但使用浮动后会让原本填充的高度消失,父元素高度为0,后续添加内容布局会产生混乱,造成…

C语言tips-数组指针和指针数组

最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路 数组指针 概念:顾名思义就是一个指针,…

英特尔oneAPI-用于异构计算的英特尔oneAPI

文章目录前景解决方案CUDA替代方案OpenMPOpenACCC 库Python 和 JavaSYCL 和 oneAPI结论如今,异构性广泛存在于高性能计算和消费电子产品中。这些系统在传统 CPU 的基础上增加了大量协处理器或加速器,例如 GPU、TPU 和 FPGA。然而,没有一种简单…

梯度下降——机器学习

一、实验内容 掌握基于密度的聚类方法的基本思想;掌握单变量函数的梯度下降的原理、算法及python实现;掌握双变量函数的梯度下降的原理、算法及python实现,并测试分析;理解学习率η的选择并测试分析。 二、实验过程 1、算法思想 在…

状态估计|基于 MMSE 的分析估计器的不确定电力系统分析(Matlab代码实现)

一、概述 在分布式电网系统中部署可再生资源带来了一系列新挑战,主要是由于它们的可变性和对气候参数的依赖性,这可能对测量潮流和状态估计所需的系统参数产生重大影响。第一个旨在根据某些参数的先验知识(或预测)计算整个系统参…

从头开始进行CUDA编程:流和事件

前两篇文章我们介绍了如何使用GPU编程执行简单的任务,比如令人难以理解的并行任务、使用共享内存归并(reduce)和设备函数。为了提高我们的并行处理能力,本文介绍CUDA事件和如何使用它们。但是在深入研究之前,我们将首先…

C++【智能指针】

文章目录一、什么是智能指针RAII思想std::auto_ptr二、智能指针的拷贝问题&#xff08;C98&#xff09;1.unique_ptr2.shared_ptrshared_ptr的问题循环引用的问题3.weak_ptr内存泄漏的危害一、什么是智能指针 #include<iostream>using namespace std; int div() {int a,…

哈希散列表hlist_head - linux内核经典实例

hlist_head和hlist_node用于散列表&#xff0c;分别表示列表头&#xff08;数组中的一项&#xff09;和列表头所在双向链表中的某项&#xff0c;两者结构如下: include/linux/types.h(line 190) struct hlist_head {struct hlist_node *first; };struct hlist_node {struct h…

护眼灯真的可以保护眼睛吗?2022双十二选哪款护眼灯对孩子眼睛好

传统的台灯只是单一色光&#xff0c;无法调节台灯的照度和色温&#xff0c;长时间使用不但不可以护眼&#xff0c;而且还会导致近视、散光等各种问题的发生。现在的护眼台灯大多都是使用led灯珠作为发光源&#xff0c;不但本身比较高效节能&#xff0c;而且光线可调控&#xff…

react--redux

此篇文章非学习使用&#xff0c;学习勿入 redux 文档&#xff1a; http://www.redux.org.cn 用于做状态管理的js库 集中管理react中多个组件共享的状态 安装&#xff1a; cnpm i redux 给形参赋值&#xff0c;表示形参的默认值 错误&#xff1a; 对象不能作为一个dom元素…

NPDP认证|制造业产品经理日常工作必备技能,快来学习提升吧!

不同阶段的产品经理对技能的掌握程度要求不同&#xff0c;侧重点也不同&#xff0c;一般包括需求分析、数据分析、竞品分析、商业分析、行业分析、需求收集、产品设计、版本管理、用户调研等。这些技能&#xff0c;是我们必须要掌握的专业技能。 比如&#xff1a;对于刚入行的…

异常检测算法分类总结(含常用开源数据集)

作者&#xff1a;云智慧算法工程师 Chris Hu 异常检测是识别与正常数据不同的数据&#xff0c;与预期行为差异大的数据。本文详细介绍了异常检测的应用领域以及总结梳理了异常检测的算法模型分类。文章最后更是介绍了常用的异常算法数据集。 异常的概念与类型 目前异常检测主…

硝酸根离子深度去除树脂

普通的阴离子交换树脂对阴离子的交换次序是&#xff1a;SO42-&#xff1e;NO3-&#xff1e;HCO3-&#xff0c;对硝酸盐没有选择性&#xff0c;优先交换水中硫酸根&#xff0c;造成树脂再生频繁&#xff0c;产水中氯离子含量增高&#xff0c;出水水质稳定性差&#xff0c;树脂交…

[注塑]各种进胶方式优缺点分析

[注塑]各种进胶方式优缺点分析1.直接进胶2.测胶口3.搭接式浇口4.扇形浇口5.潜胶6.弧线浇口7.针形浇口结构设计的时&#xff0c;分析浇口的进胶方式尤为重要&#xff0c;为了简便我们的设计&#xff0c;常常需要将一些常用的标准形式&#xff0c;以下是我们常见的一些浇口形式。…

死磕sparkSQL源码之TreeNode

InternalRow体系 学习TreeNode之前&#xff0c;我们先了解下InternalRow。 对于我们一般接触到的数据库关系表来说&#xff0c;我们对于数据库中的数据操作都是按照“行”为单位的。在spark sql内部实现中&#xff0c;InternalRow是用来表示这一行行数据的类。看下源码中的解…

Spring Cloud(十二):Spring Cloud Security

主要内容 Spring Security 模块使用设置用户名密码基于内存基于UserDetailsService 接口基于配置类WebSecurityConfigurerAdapter基于DB 用户-角色-权限自定义登录页面登录认证流程自定义成功、自定义失败会话管理&#xff08;Session)会话控制会话超时会话并发控制集群sessio…

【Webpack】webpack的基础使用详细总结 下(建议收藏)

1- 前言 昨天已经介绍了weback的基础使用了&#xff0c;详细总结看这边博客&#xff01;&#xff01;&#xff01; 【Webpack】webpack的基础使用详细总结 上&#xff08;建议收藏&#xff09; 今天来总结一下剩余的常用 &#xff01;&#xff01;&#xff01;&#xff01; …

微信抽奖活动有什么作用_分享微信抽奖小程序开发的好处

在H5游戏中&#xff0c;抽奖是最受消费者喜爱的模式之一。将H5微信抽奖活动结合到营销中&#xff0c;可以带来意想不到的效果&#xff0c;带流量和曝光率&#xff0c;所以许多企业也会在做活动时添加上不同类型的H5微信抽奖活动。 那么&#xff0c;新手怎么搭建微信抽奖活动&am…

01背包、完全背包、多重背包、分组背包总结

文章目录一、01背包问题二、完全背包问题三、多重背包问题四、分组背包一、01背包问题 n个物品&#xff0c;每个物品的重量是wiw_iwi​&#xff0c;价值是viv_ivi​&#xff0c;背包的容量是mmm 若每个物品最多只能装一个&#xff0c;且不能超过背包容量&#xff0c;则背包的最…

【ABAP】SAP发送消息至RabbitMQ

SAP发送消息至RabbitMQ ——以下关于RabbitMQ的内容大致转载于朱忠华老师的《RabbitMQ实战指南》一书 【基础知识】 消息队列中间件(Message Queue Middleware,即MQ)也可以称之为消息队列或者消息中间件,是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数…