叮!您收到一份超值Java基础入门资料!

Java语言有什么特点?如何最大效率的学习?深浅拷贝到底有何区别?阿里巴巴高级开发工程师为大家带来Java系统解读,带你掌握Java技术要领,突破重点难点,入门面向对象编程,以详细示例带领大家Java基础入门!

在学习JAVA编程的同学们,可以加我们的学习交流

QQ群:370161306群内有相关学习资料

邢凯航(花名:弗止),阿里巴巴Java高级开发工程师,香港大学计算机科学硕士,16年加入阿里巴巴,目前就职于研发效能事业部用户声音及代码智能化团队,负责代码中心后端开发。

以下内容根据演讲嘉宾视频分享以及PPT整理而成。

本文将围绕一下几个方面进行介绍:

1.Java语言特点

2.如何学习Java

3.JVM概述

4.面向对象入门

5.示例演示

6.扩展阅读

一. Java语言特点

1.Java是一种面向对象的语言,以对象为颗粒度,对象中包含属性和方法,通过对象间的继承和组合构建程序世界。在学习面向对象语言时,大家不仅仅应该关注过程,还需要对待解决的问题进行抽象和建模,最终生成易于维护和扩展的设计方案。这是一个由浅入深、循序渐进的过程。

  1. 其次,Java具有良好的跨平台特性。Java程序可以不受计算机硬件和操作系统的约束,在任何支持Java虚拟机(JVM)的环境下都可以正常运行。编写的Java程序经过编译后生成的字节码可以被JVM识别,JVM为程序运行屏蔽了底层操作系统的差异。

  2. 第三个特点是Java具有垃圾回收机制,简称GC(Garbage Collection)。在Java中不需要关心内存空间的回收问题,这一切都会交给JVM进行处理。JVM会识别出哪些对象不需要再次被使用,进而自动回收其内存空间,不需要手动回收,大大提高了开发效率。

  3. 第四个特性是Java为单根结构。Java中所有的类都继承成自同一个基础类object,如此所有类具有同一个通用接口,并且在层次结构上都属于同一类型,这为编程提供了极大的便利。

  4. 另外Java在设计之初就非常注重安全性,在多个阶段均提供了安全保证。Java中不支持指针,避免了非法内存的操作。在编译运行时,提供了多重语法、类型、边界和字节码的检查。

  5. 最后Java语言是解释型的语言。Java编译的结果并不会在操作系统上运行,而是生成一个中间class文件,被JVM加载并解释执行。早期的Java版本因为解释过程,运行速度相比C++要慢很多,但随着Java编译器的优化,某些结果甚至已经表明Java会比C++运行更快,因此如今并没有统一的定论。

二. 如何学习Java

首先,Java的学习有两条主线——Java语言和JVM。一方面,大家需要学习Java语言编程的语法规则,能够熟练使用JDK提供的常用的工具类,并通过多线程解决问题。此外还需要熟练掌握一至两个框架,快速上手工程的开发。另一方面,大家需要了解JVM底层,了解Java内部的运行机制。

其次,关于工具的选择,这里推荐大家使用在业界比较流行的IntelliJ IDEA或Eclipse。一个好的编程工具会提供很多优秀的能力,提升开发效率。

第三点,建议大家使用较新的JDK版本,例如JDK8及以上。JDK在更新过程中会出现一些优秀的类库以及新的语法规则,及时更新版本有助于跟上业界新步伐。最后尤为重要的是需要多看、多思考、多实践。多看一些优秀的源码和工程,例如JDK源码,可以了解好的编码习惯和风格,并且通过熟悉底层的原理,有助于写出高性能和健壮的程序;再例如Tomcat源码,阿里Dubbo源码等,从中学习软件设计思维。最后还需要多练习实践。

三. JVM概述

1.Java内存区域管理

Java内存区域包括两部分:由所有线程共享的数据区和线程隔离的数据区,如图所示:

在这里插入图片描述

在线程隔离的数据区中,包括虚拟机栈、本地方法栈和程序计数器。程序计数器可以指示当前线程所执行的字节码的行号,字节码解释器会通过更改计数器的值来选取下一条需要执行的字节码指令。每个线程的程序计数器都是独立的,确保各线程间计数器互不影响。虚拟机栈也是线程私有的,生命周期和线程相同,每个方法执行时会创建一个栈针、当前执行方法的局部变量表、操作数、动态链接、方法出口等信息都存储在该区域中。方法的调用和返回对应的栈针在虚拟机栈中的入栈和出栈操作中。本地方法栈的作用与虚拟机栈类似,不过本地方法栈存储的是调用native方法时使用的数据结构。方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量和静态变量等数据。堆也是共享内存区域,存储对象实例、JVM的垃圾回收等。

2.垃圾回收

Java的垃圾回收机制中,首先需要确定哪些对象需要进行垃圾回收,这里通常采用可达性分析来进行判断。这个算法的基本思想是设置一系列对象作为起点,称为GC Roots节点,搜索建立引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。在进行可达性分析时,需要让整个系统冻结在某个时间点,对外则表现为所有工作进程都停止,如此才可以准确获取所有GC Roots,这个过程称为stop the world。此外,引用计数器算法也可以判断对象是否存活,虽然该算法效率较高,但如果存在对象间的循环引用,即使这些对象不可访问,也存在无法回收的情况。

在回收对象实例时,有多种算法可供选择。第一种标记-清除算法,分为两个阶段,首先标记出所有需要回收的对象,然后统一进行回收。第二种复制算法,针对方法一中内存碎片过多的缺点,复制算法将内存按照容量划分为大小相同的两块,每次只使用其中的一块,当一块用完后,将仍存活的对象复制到另一块中,然后将使用的那块空间一次性清理,如此反复使用。第三种标记-整理算法,针对方法二中内存利用率不高的缺点进行改进,过程和方法一类似,首先对对象进行标记,然后将仍存活的对象向一端移动,然后清理边界以外的内存区域。方法四分代收集算法,将堆划分为新生代和老年代,根据对象的生命周期,分别放入不同的内存区域中,同时针对不同垃圾回收特点的对象采用不同的回收策略。新生代分为一块较大的Eden区和两个较小的survival区,因为新生代大部分对象都需要回收,所以采用复制算法进行回收。而老年代中需要回收的对象较少,因此采用标记-清除或者标记-整理算法进行回收。基于上述垃圾回收算法,JVM实现了多个垃圾收集器,可以通过一些参数进行设定(具体内容可参考扩展阅读)。

四. 面向对象入门

在Java语言中,所有类都拥有一个共同的父类Object,即便没有显式声明。接下来展示Object的一些方法,如下图所示:

在这里插入图片描述

首先,它包含一个private方法refisterNatives(),该方法与本地注册有关,这里不做详细讨论。其次,它包含notify()和notifyAll()方法,这两种方法比较类似,归并为一类,另包含三种wait()方法,也归为一类。因此Object类共包含8种方法,分为以下四类进行讲解。

他们分别回答了四个问题:我是谁,我从哪里来,我到哪里去,我与外界如何互相作用的。getClass和hashCode分别让外界知晓当前对象的类型和一个独一无二的标识。equals告诉外界当前对象是否和另一个对象相等。toString用字符串标识当前对象信息。clone方法可以让外界获得当前对象的一个拷贝。finalize方法可以实现对象被回收前最后的清理工作。notify()和notifyAll()方法用于唤醒一个等待在该对象上的一个线程或所有线程。wait方法是让当前线程进入等待状态,直至被唤醒或者等待时间结束。注意这里clone方法和finalize方法使用灰色表示,因为二者都属于protected方法,如果需使用则需要重写其实现。另外在重写clone还要注意深拷贝和浅拷贝的问题,finalize方法使用时具有不确定性,这里不推荐大家使用。

五. 示例演示

1.整体示例

在类Phone中,定义了两个属性brand和serialNum,代表品牌和序列号。在构造函数中,为两个属性初始化值。同时实现了clone接口,覆盖了父类实现。

在这里插入图片描述

在main函数中,定义了phone1和phone2,phone2是phone1的拷贝,然后打印出两个变量的基本信息,包括手机的类名称、hashCode、表示当前手机的字符串和对比两个手机是否相同。运行结果如下所示:

在这里插入图片描述

由运行结果可见,二者属于同一个类,但hashCode不同,并且字符串表示也不相同。接下来仔细介绍每个方法。hashCode方法为native,表明调用的本地方法,代码由非Java代码写出。hashCode返回一个int数值,代表内存空间中的一个地址。

在这里插入图片描述

equals方法如下所示,用双等号来对比两个对象,注意因为此处两变量都为引用类型,因此这里双等号对比的是二者引用的内存地址是否一致。上例中由打印出的hashCode可见二者内存地址不一致,因此equals方法返回false。

在这里插入图片描述

toString方法中,首先打印类名称,加上@,还有内存地址空间的十六进制表示。

在这里插入图片描述

但某些情况下我们认为如果phone的品牌和序列号一致即为二者一致,此时便需要尝试修改一些方法的实现。这里可以使用IDE工具自动生成generate的部分代码(具体操作详见视频),如下所示:

在这里插入图片描述

此时在equals中,首先比较二者的内存地址空间,如果一致返回true;若不一致则进一步比较二者的类信息,若类不一致,则返回false,若一致,则需要继续比较其属性值,若属性值都一致,则可以认为二者是相同的对象。hashCode中也类似,使用其两个属性值生成hashCode。

类似的也可以生成toString的实现,使用StringBuffer类来拼接字符串,打印出相关属性值。此时再运行主函数,得出结果如下:

此时两个变量的hashCode值已经一致,用字符串表示时也会打印出一些属性信息,对比结果也返回true。

2.深浅拷贝示例

类Screen中,包含属性值size,表示屏幕大小。并且有getSize方法获取屏幕大小以及setSize方法设置size。toString方法将size值打印出来。

接着在上例Phone类中加入属性值Screen,并且更新构造函数,加入获取和更新屏幕的方法,如下所示:

重新编写main()函数。首先定义了大小为5的屏幕,phone1和phone2与上例一致,只是phone1新增了参数变量screen。分别打印出两个phone的屏幕大小,然后更改screen的值,再打印一次,运行结果如下所示:

由结果可见,在更改screen大小之前,两个phone的屏幕大小都为5,更改完成后都变为6。这表明此处默认的clone方法实现的为浅拷贝。因为screen中存储的为内存地址空间,拷贝后的对象存储的依然是该地址,因此改变屏幕size时二者同时变化。下面展示深拷贝,代码如图所示:

首先从super.clone中获得phone变量,为其重新设置屏幕大小,设置的值为调用当前screen的clone方法,最后返回变化后的拷贝。运行结果如下所示:

此时可以看到在第二次更改完size之后,只有phone1的屏幕大小变为6,而phone2的屏幕大小仍然为之前的值。

在学习JAVA编程的同学们,可以加我们的学习交流

QQ群:370161306群内有相关学习资料

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

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

相关文章

jop怎么读音英语怎么说_“春晚”英语怎么说?

大家都说近年来的春节年味越来越淡,每年陪老人一起看春晚、上网吐槽春晚,应该算是最有年味的一件事了吧!你期待今年的春晚吗?在春晚即将开播之际,先和我一起了解一些有关“春晚”的英语知识吧!01、“春晚”…

2019 年软件开发人员必学的编程语言 Top 3

这篇文章将探讨编程语言世界的现在和未来,这些语言让新一代软件开发者成为这个数字世界的关键参与者,他们让这个世界变得更健壮、连接更加紧密和更有意义。开发者要想在 2019 年脱颖而出,这三门语言一定要关注。 作为软件开发者,…

小数据量计算最大lyapunov代码_Software | 计算Lyapunov指数的GUI工具箱及函数包汇总...

二十年前读书时用过的Lyapunov Exponents Toolbox,推荐给做非线性动力学入门的同学们。那个时候不会编写程序,做分支图、算连续或者离散系统的Lyapunov指数,极其困难,还好有这个工具箱,慢慢看源程序学会写一点改进的程…

git 小乌龟 更新分支_git常用操作

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式&a…

web 服务器 内存 影响_C/C++服务器开发常用的7大开源库,让你在同行中脱颖而出...

C/C服务器开发7大常用开源库,在这里简单介绍一下。1、OpenSSLOpenSSL是一个开放源代码的安全套接字层密码软件库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,应用程序可以使用这个包来进行安全通信,避免窃听&…

pandas 更改单元格的值_懂Excel轻松入门Python数据分析包pandas(二十四):连续区域...

此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的)经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得…

产生式是蕴含式_独栋别墅~下沉式庭院设计

遇见美. 发现美创造美. 成就美有趣、有情奢享生活.创艺空间设计项目概述:这是一套婚房,从设计到装修完毕,历经三年。这是一生幸福开启的地方。一层为会客厅、室内花园、餐厅、茶室、老人房。原始房屋整体空间不够方正,空间利用率低…

在前端中如何在表格中最后一行加入输入框_UI设计进阶干货 — 如何制定UI规范...

APP为何要制定设计规范作为UI设计师,整理设计规范也是设计能力的一种体现。但很多小公司的设计师都觉得, 整个公司只有自己一个设计师, 所有的设计稿都是自己一个人做的, 风格肯定都是统一的, 所以没必要花那么长时间去做一个没有用的东西。但其实规范的本身并不是只…

如何用三元组表表示下列稀疏矩阵_盘一盘 Python 系列特别篇21之:SciPy 稀疏矩阵...

引言和稠密矩阵相比,稀疏矩阵的最大好处就是节省大量的内存空间来储存零。稀疏矩阵本质上还是矩阵,只不过多数位置是空的,那么存储所有的 0 非常浪费。稀疏矩阵的存储机制有很多种 (列出常用的五种):COO (Coordinate List Format)…

六西格玛dfss_向六西格玛质量水平进攻!

为提高设计质量,提升研发团队整体作战能力,2019年初,技术中心确定了大力推进先进质量管理方法DFSS(六西格玛设计)的工作目标。一年来,在DFSS小组的策划组织和通用黑带大师的倾力支持下 ,技术中心各区域工程师积极地学习…

c字符串中包含双引号_必须知道的C语言知识细节:单引号和双引号正确用法

C语言中ACSII码字符单引号和双引号"在程序中经常出现,很简单,但却是十分重要的语法标点符号,初学者容易混淆使用。单引号在字符常量时使用,表示单个字符。例如:char c;c a;c 1;c A;当在单引号中出现两个及以上…

计算机组成原理哈工大期末_浅谈计算机组成原理(三)

1、第二章:存储系统通过下面的思维导图来依次分享「存储系统」里面重要知识点。2、第一节:存储器的结构1. 主存储器:简称主存,又称内存储器(内存),用来存放计算机运行期间所需的大量程序和数据,CPU可以直接…

网页中竖的目录怎么改成横的_怎么学习手绘插画?小白也能入门哦

怎么学习手绘插画?小白也能入门哦!在回答这个问题之前,我们先来认识一下什么插画?相信很多人对插画这个概念是很笼统的。插画在中国被人们俗称为插图。发展至今其应用范围很是广泛包括;出版物配图、卡通吉祥物、广告、…

python自动测试v_python下selenium自动化测试自我实践

周末实验自动化提交数据时,本来没打算写记录的,不过遇到一些问题,觉得可以提提。基本操作就不用写了,搜索过程中都发现了两个博客都出了seleniumpython的书,说明操作一搜一大把。 1. 等待页面加载完成 本来用的sleep()…

graphpad细胞增殖曲线_肿瘤干细胞?居然被这两个新加坡人轻松干掉了?

近日,著名医学期刊《自然•医学》上发表了一篇关于肿瘤干细胞的文章。来自新加坡的研究团队发现,人类非小细胞肺癌的肿瘤干细胞需要大量的蛋氨酸,以维持自身组蛋白的甲基化,这对于肿瘤干细胞的生长和致瘤作用至关重要。同时&#…

isight参数优化理论与实例详解_案例1(ISIGHT集成ADAMS CAR方法实现)

本文字数1304字25图,建议阅读时间7分钟强调一下是ISIGHT,不是INSIGHTINSIGHT是ADAMS内置的一个试验设计模块,它提供了一组统计工具,用于分析仿真结果,辅助优化和改进系统ISIGHT是功能强大的计算机辅助优化平台&#xf…

修改图片src_【学习园地】企业SRC搭建

xSRC-企业SRC搭建腾讯xSRC 开源版是腾讯安全应急响应中心(TSRC)面向合作伙伴推出的安全应急响应中心(SRC)建站软件,软件源代码开放,可支持合作伙伴轻松构建SRC平台,省去大量开发运维工作,并支持个性化功能及页面设置,企…

2 数据源配置_论多数据源(读写分离)的实现方案

好的,作为一个合格的bug生产者,我们直接进入主题,多数据源和读写分离实现方案。首先多数据源和读写分离什么时候我们才需要呢?多数据源:一个单体项目过于复杂,需要操作多个业务库的时候,就需要多…

docker安装gitlab_docker 安装部署gitlab

下载镜像并且启动//下载镜像(镜像较大,如果网速不行可以切换阿里云镜像仓库) docker pull gitlab/gitlab-ce:latest //启动镜像 docker run --name gitlab -d -p 18080:80 -p 1443:443 -p 2222:22 -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/lo…

easyexcel导出百万级数据_百万级别数据Excel导出优化

这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出。笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现了服务经常因为大数据量的数据导出频繁Ful…