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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2