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整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程