Java 回顾 ( Revisiting Java )

2024-02-19 15:10
文章标签 java 回顾 revisiting

本文主要是介绍Java 回顾 ( Revisiting Java ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在看一些工程代码,于是看了看设计模式,看设计模式之前发现Java是先修知识,又重新补了一遍Java,温故知新,获得一些新的体会。

Java应该是目前用的最多的编程语言,以前觉得Java老要点点点(调用方法),变量名也很长,C++/Python很少代码写完的东西Java可能要写很多行……

拿变量类型来说,Java只有两种变量类型,primitive主数据类型和引用数据类型。

Java中最关键的概念是面向对象,面向对象最关键的东西就是类和对象,所有的Java程序都定义在类中,你不能像python那样,打开.py文件就开始写东西,就可以执行了,也不像C++,定义一个main函数即可运行。在Java中即使main函数也要包括在类中。

为什么面向对象是核心内容?它的好处在哪呢?可以说,OO(面向对象)无处不在,OO使得我们很方便的扩展功能,而不需要重复写很多代码!另外,OO的设计思想其实是抽象思维的一种体现,它改变了我们设计程序的方式,我们不再是根据程序需要什么功能就开始从头到尾实现什么功能,我们更多考虑的是类和对象,程序包含几种类型的实体?有什么共同点?可以进行怎样的抽象?用继承还是接口?……

说说类和对象,类是对象的模板,类定义好“像我这样的人应该有什么状态,特征,能够做到那些事”,而对象具体化了类,真正获得了具体的状态,具体的特征,以及做某些事的方法。

我们说到,Java只有两种变量,primitive主数据类型和引用数据类型。主数据类型包括我们所指的int,double,float等等,这些不是对象。而引用变量是一个到对象的引用,相当于一个遥控器,指向堆上的某个对象,通过此引用可以获得对象,重新赋值此引用并不改变对象,只是引用指到了另一个对象上而已。没有对象变量,只有指向对象的引用变量。

话题回到面向对象,提到面向对象,不得不提其三大特性,这也是面试中经常会问到的,即封装,继承和多态。

  • 封装(encapsulation),即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;

  • 多态(polymorphism),一句话,“接口的多种不同的实现方式即为多态”,但是这个不太好理解,甚至我觉得它不够准确,因为光说接口是不是有点不够?换一种说法,多态即允许将子类对象的引用赋值给父类对象的引用,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。因为:编译器根据引用类型来判断可以调用哪些方法,而不是根据确实的类型。

  • 继承(inheritance) 是指一个对象直接使用另一对象的属性和方法,很简单,父类是球,子类是足球,那么足球可以直接使用“滚动”这个方法,如果需要特殊的“滚”,那子类自己实现就好了。

之所以继承放在最后讲,是因为我们关于继承有更多要说的。

【继承方法调用时的最近原则】调用对象引用的方法时,会调用到与该对象类型最接近的方法,就是说如果子类实现了某继承的方法,那就调用子类的,如果没有实现,那就往上找最近的实现的类的方法。

继承的IS-A测试,即“足球”IS-A“球”,总得满足这样的关系才好说继承,就像你不太好意思继承隔壁王叔叔财产。

继承的意义何在?这是显然的,首先避免了大量重复的程序代码,其次可以定义出一组共同的协议,所有继承者都需要满足这个协议,你知道,在很多时候大家遵守一些共同的规则是很重要的。

继承的一些使用建议:

如果最高的父类不能抽象出一些对所有族类都使用的方法,或者不太好初始化,比如你不好新建一个“球”对象,它是啥球呢?地球还是足球?这样一些情况我们可以定义抽象类,它不能被初始化,只能被继承。。抽象类中可以定义抽象方法,抽象方法只存在于抽象类中,一个类只要有一个抽象方法,那他必是抽象类。

有时候,你会想要继承多个父类,以便使用更多的已有代码,但是不幸的是Java并不支持多重继承,要多重继承请关闭本文,搜索”C++”关键词谢谢。

为啥不支持多重继承呢?因为存在多重继承(继承多个类)的“致命方块”问题,即如果两个父类继承自同一个祖父类,都实现了某个方法,那么子类(如果没有实现该方法)该调用那个版本?

解决“致命方块”问题?接口!

接口是100%纯抽象类,每个方法都是抽象的,必须被实现。

如果想要定义出类可以扮演的角色,使用接口。

接下来从生物学的角度谈谈对象?什么是生物学角度??即生老病死~

对象生存在堆上(可以理解为垃圾堆,随时可能有人来回收…),引用变量或局部变量生存在栈上。

一旦一个对象,它的引用没有了或者离弃了它,那么他就可以等待被回收了。Java有一套垃圾回收机制(GC)保证对象的回收来腾出堆空间,有时候,GC又常常被人诟病,在大数据应用中常常面临这大量的shuffle,大量的对象,有时候需要花费大量的时间来做GC,体验不佳。

总的来说,对象的出生靠调用构造函数,生存在堆上,一旦没了引用,就向生命的终点走去,直到GC(黑白无常)带走了它。。

新建对象时,父类的构造函数先于子类被调用,以此类推,Object的构造函数先被执行,然后往下推,直到目标对象类型

谈谈实例变量,实例变量即对象的成员变量。

JAVA的实例变量具有如下特点:

你可能想问,如果Java中只有对象和primitive主数据类型,那么我想定义全局变量或者常量怎么办?比如PI=3.141592653589..(后面忘了)

Java常量 = final static 的变量

插一句字符串的格式化:

谈谈异常吧,谁能保证自己的程序不出问题呢?与其系统运行的时候报一大堆乱七八糟的错误trace,早早地预见并处理一下,以自己的方式处理或者打印它,总要漂亮些吧?甚至可以在抓到异常后,给出“没关系,一个小错误,已经报告给开发者~”这样温和的语句,是不是显得b格很高?……

序列化对象:有时候需要保存一下对象,以便于恢复,被调用,而不用重新生成,因为生成过程可能很麻烦。

序列化对象:

0?wx_fmt=png

或者不序列化,而是将信息写入文本文件:

0?wx_fmt=png

可以把File想象成文件的路径,代表磁盘上的某个文件,但并不是文件内容

0?wx_fmt=png

这句代码形成如下链接:

0?wx_fmt=png

对象序列化以后,类继续演进,这时会出现无法还原的情况。通过将serialVersionUID放在class中,让类在演化过程中维持同样的ID,可以保证还原的时候能够识别,从而正确还原出对象。但要注意有些修改会损害解序列化。

好吧,先说到这,其实还有一些内容,网络,集合与泛型,以及许多高级特性,反射,虚拟机的深入理解等等,后面再说吧。

Reference

推荐一个不错的微信公众号有兴趣的可以多学学:

0?wx_fmt=jpeg

这篇关于Java 回顾 ( Revisiting Java )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/725058

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏