目录
1. Java SE 8 以及之前版本的发布节奏和不同版本的差距
2. Java SE 9 以及之后版本的发布节奏和不同版本的差距
4. OpenJDK 和 OracleJDK 哪个jdk更好更稳定,正式项目用哪个呢?
4. 什么是Java程序的主类?应用程序和小程序的主类有何不同?
学习前言
本章文章视频快速讲解:Java入门前的认知_哔哩哔哩_bilibili
一、什么是编程?
目前我们要学习编程,我们就需要知道什么是编程,主流编程语言有哪些?
首先,编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到相应结果的过程。
抽象一点的说,编程就是我们使用一种编程语言来实现这些指令的编写,也就是说编写这些指令的过程,这些指令能够被翻译成计算机读懂的格式,最后由计算机执行。
像目前,主流的计算机编程语言包括C、C++、Java、GO、Python、数据库开发、其他等编程语言。
这些计算机编程语言是程序设计的最重要的工具,它们能够被计算机接受和处理、具有一定语法规则。
很多人认为编程是门高深莫测的学问, 担心自己学不来。
实际上, 编程虽然不是随便能学会的技能, 但是也没有那么难。
因为, 普通人已经具备了很多编程需要的基础,为什么这么说?
像我们日常使用的中文、英语一样, 编程语言也是一门用于沟通的语言.只不过"编程语言"是和计算机沟通的语言。
而"程序", 就是使用计算机能够理解的语言书写的一连串命令.而"编程"就是我们为了完成某项任务, 将解决问题的步骤, 用计算机能够理解的语言写成指令, 这就是"编程"。
而后, 计算机会根据这些指令一步步执行, 最后完成任务.
现在大家彻底明白编程这两个字的含义了吧?
现在我们已经理解什么是编程了,刚才我们也提到了计算机编程语言,现在笔者就带大家了解些计算机语言发展历史,以便于大家更好的理解计算机编程。Common On!
二、计算机语言发展史
一、机器语言
机器语言是使用二进制代码表示指令的语言,它是计算机硬件系统可以直接识别,并能真正理解和执行的唯一语言。
二、汇编语言
汇编语言是一种面向微处理器、微控制器等编辑器件的计算机语言。机器不同,汇编语言指令对应的机器语言指令集也不相同。
三、高级语言
高级语言接近人类自然语言,与机器情况无关,拥有自身特定的符号和语法规范,像笔者之前所说明的C、C++、Java、Go、Python等都属于高级语言。
三、Java 编程?
通过上一节,我们已经了解到Java是一门高级计算机编程语言后,现在就让我们正式踏入Java编程,哈哈哈,成为Java家庭的一名成员吧,现在有一句话怎么说呢,拥抱Java就等同于49年入国军。
现在让我们更深层次的了解Java编程,它是一种静态的、面向对象的强类型的高级编程语言,由Sun Microsystems于1995年推出。它广泛用于开发各种应用程序,包括Web应用程序、移动应用程序、桌面应用程序等。它的设计目标是让程序员可以编写一次代码,然后在不同的平台上运行。
也就是说,Java程序可以在不同的操作系统上运行,而无需重新编写代码。
为什么无需重新编写代码呢?原因很简单,这是因为Java程序被编译为字节码,而不是特定于某个操作系统的机器码。
字节码可以在Java虚拟机上运行,这是一个独立于操作系统的软件。
这种跨平台的能力使得Java成为一种非常流行的编程语言。
它也极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
这意味着它支持封装、继承和多态等概念。
这些概念使得编写复杂的程序变得更加容易。不仅如此,Java还有一个强大的标准库,其中包含了许多常用的类和方法,可以帮助程序员快速编写出高质量的代码。同时,它不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言还具有功能强大和简单易用等特征。
怎么理解Java虚拟机?
后续我会在JVM专栏带大家彻底理解Java虚拟机,因此这儿先让大家认识到Java的虚拟机思想的重要性!
Java的虚拟机思想就让一套程序运行在多种设备和操作系统上成为了可能。正是它的大一统思想,让java得到了全速发展。
现在我们已经了解到了Java编程,但是我们为什么要学习Java编程,而不是其它编程语言呢,接下来就让笔者好好去探讨下使用Java编程的优势在哪?它来啦!它来啦!它来啦!
四、使用Java编程的优势
1. 简单性
Java语言的简单性主要体现在三个方面,接下来就让我们来看一看,了解了解下!
1、Java的风格类似于C++,因而C++程序员初次接触Java语言,就会感到很熟悉。
从某种意义上讲,Java语言是C及C语言的一个变种,因此,C程序员可以很快地掌握Java编程技术。
2、Java摒弃了C++中容易引发程序错误的一些特性,如指针、结构、枚举以及内存管理等。
3、Java提供了丰富的类库,可以帮助我们很方便的开发Java程序。
忘记说了,笔者似乎没记错的话,学计算机的同学,大一时期的首门编程语言就是C吧,我相信大家也能理解到Java的简单性在哪吧。
2. 面向对象
Java语言作为面向对象的编程语言,提供了面向对象的四种基本性质:抽象性、封装性、继承性和多态性。
万事万物皆对象,Java面向对象编程是以人类最好理解的方向去编程(客观世界中的对象为中心)。
- 抽象是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。抽象性是面向对象编程中的一个重要特征,它允许程序员定义一个类,该类描述了一组对象共有的属性和方法,但不涉及具体的实现细节。
- 封装是指属性私有化,根据需要提供setter和getter方法来访问属性,隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问级别。
- 继承是指将多个相同的属性和方法提取出来,新建一个父类,java中一个类只能继承一个父类,且只能继承访问权限非private属性和方法,子类可以重写父类中的方法,命名与父类中同名的属性。
- 多态(Polymiorph)可以分为两种:设计时多态、运行时多态,设计(编译)时多态:
即重载(Overload),是指java允许方法名
相同而参数不同(返回值可以相同也可以不
同),同一个类中允许存在一个或多个以上
的同名函数,只要参数类型或参数个数不同
即可。
3. 分布式
Java作为面向对象编程语言,在设计时就设计成支持网络应用的分布式语言,既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以,用户可以产生分布式的客户机和服务器。
这里的Socket又称套接字(一种独立于协议的网络编程接口),所谓套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
那么,从java语言面向对象特点(前文已谈)来说,Socket就是第一个创建类,从编程上来说,大多时候是基于TCP(传输控制协议)/ UDP(用户数据报协议)等协议做的一层封装或者说抽象,是一套系统所提供的用于进行网络通信相关编程的接口,通过stream(流媒体技术)的传送,可实现服务端与客户端的链接。而这正是java语言分布性特点的体现。
当然,Socket编程,由专业的技术人员遵循严谨严密的逻辑来完成,这里不再赘述其基本流程。
提到这些专业术语和简单的逻辑关系,只是让有软件开发需求的用户,在计划开发软件时,大概地知道一些简单的技术功能、属性和逻辑关系,做到最起码的、简单地知悉。仅此而已。
另外,java作为计算机编程语言,其实也是“面向对象”的一种程序设计思想,因此,面向对象作为其主要特点之一,在软件开发过程中,可遵循以下七个原则展开。
参考本人设计模式专栏:
4. 键状性/正确性
一、健壮性
所谓健壮性,简单地将就是程序对于各种非法地输入能够有很好地处理,并且使程序能够正常地继续运行下去。
我们知道,一个程序通常有它的spec,我们可以理解为程序有它的目的与任务。
有了这目的与任务,程序的输入(或者说方法的输入参数)边有了要求。
那么当输入不符合spec要求时,考虑不周的程序往往会奔溃,而作为一名有良心的、优秀的程序员,怎么能容许这种情况发生呢。
我们要求程序再这种情况下,也能够正常地处理、运行。这样的性能,我们便将其称为健壮性。
好了,到此,我用“人话”解释了健壮性的含义,尽量使没有基础的小白也能理解。接下来,我继续介绍健壮性的相关性质。
健壮性有时也和容错性,可移植性,正确性有交叉的地方。
比如,一个软件可以从错误的输入推断出正确合理的输入,这属于容错性量度标准,但是也可以认为这个软件是健壮的。
一个软件可以正确地运行在不同环境下,则认为软件可移植性高,也可以叫,软件在不同平台下是健壮的。
一个软件能够检测自己内部的设计或者编码错误,并得到正确的执行结果,这是软件的正确性标准,但是也可以说,软件有内部的保护机制,是模块级健壮的。
软件健壮性是一个比较模糊的概念,但是却是非常重要的软件外部量度标准。
软件设计的健壮与否直接反应了分析设计和编码人员的水平。即所谓的高手写的程序不容易死。
但是,真的有这么简单么,开玩笑,这么简单就好了,列举以下事例:
1,我输入了负数
2,我的输入超出了double类型所能涵盖的范围
3,我输入了标点符号
4,我输入了中文
5,我没输入
6,我选择了取消或者点了右上角的关闭
这一切都是有可能发生的事件,而且超出了你程序的处理范围,这种事情本不该发生,但是程序使用时,一切输入都是有可能的,怎么办,你只能在程序中限制输入。
二、正确性
什么是正确性呢?我们知道,程序有其spec,用“人话”说就是程序应该达到什么任务(java中的spec指类的前条件、后置条件等)。
好了,你现在记住程序是有任务的。
既然有任务,那么程序往往对输入有要求,在代码中即表现为某个方法的输入参数是有限定的。
输入有限定,当输入是在我们限定的范围内时,我们的程序有义务给出正确的结果。
但是,当输入超出了我们的合理范围时,即输入不合理,这时程序在理论上可以做出任何反应,程序不必给出正确的反应。这就是,正确性。然而,在输入不合法时,一名有良心的程序员仍应该使得程序能够合理地应对不合法输入,这就是我上面说的健壮。
5. 安全性
编写消费类家用电子产品软件的语言,从一开始它就被设计成了写高可靠和稳健软件,并消除了某些编程错误,使得用它写可靠软件相当容易。
所以,Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。
也就是说,从Java语言的诞生起,就被赋予了安全性的特点。
首先,Java没有指针,这就使程序员无法得到隐蔽起来的内幕和伪造指针去指向存贮器。
尤为重要的一点是Java编译程序不处理存贮安排决策,因此,程序员不能通过查看声明去猜测类(关于类,前面的文章中已陈述)的实际存贮安排,所以,编译的Java代码中的存储应用在运行时,由Java解释程序决定实际存储地址。
从而可见,Java的存储分配模型是它防御恶意代码的主要方法之一。
其次,Java运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何Java语言限制。
这个安全机制部分包含了类如何从网上装在。
比如,装载的类是放在分开的名字空间的而不是局部类,这就从根本上有了预防一些恶意小程序用他自己的版本来代替标准Java类。
正是基于以上两点,赋予了Java语言的安全性。
简而言之,就是Java的存储不由编译程序决策安排,而是由解释程序来决定,也就是说Java为Java程序提供了一个专用的运行空间,在这个空间里Java程序可做任何事情,但是,除了这个边界就不能有任何操作了。
这里,就有一个类载入程序体系即JVM(Java虚拟机),其作用主要是类载入程序,负责输入哪些定义运行程序的类和结构的二进制数据。JVM有非常灵活的类载入结构,它允许Java应用程序自己定义装载的方式。
同时,类载入程序结构时,给不同的类载入程序装入的类,提供了受保护的命名空间,这就组织了破坏性的代码干扰正常的代码,保障了Java语言的安全性。
Java语言的安全性主要体现在以下几方面:
一是严格遵循面向对象(关于“面向对象”前面的文章中已陈述)的规范,即封装了数据细节,只提供接口给用户,增加了数据级的安全性
二是无指针运算,增加了内存级的运算;
三是数组边界检查,有效防止了缓存溢出等安全漏洞;
四是强制类型转换,使非同类型的对象之间不能进行转换;
五是语言对线程安全的支持;
六是通过编译器、检验器、类装载器自动建立安全策略。
6. 体系结构中立
编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,就可以在许多处理器上运行。
Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。
精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以迅速地翻译成本地机器的代码。
7. 可移植性
软件可移植性是指软件从某一种环境转移到另一环境性的难易程度。
需要注意的是,这里所说的软件可移植性,指代码的可移植性,而代码的可移植性主题就是软件,因此,可移植性是软件产品的一种属性,它的行为表现为一种程度,这种程度与包括软件、硬件、组织在内的环境有关。
这里,作为一名具有多年软件行从业经验的兰州东方商易科技工作人员,结合自己的行业从业经验,删繁就简地谈谈软件可移植性。
从软件开发来说,可移植性是软件质量之一,良好的可移植性可以提高软件的生命周期。
说的再明白一点,就是软件可移植性具备了适应性、易安装性、共存性、易替换性、依存性等特征,那么,从用户角度来看,这些特点无疑是最适合自己的了,正如俗话所说,适合的就是最好的。
然而,软件开发作为新时代新业态中的新行业,人人都想抓住新机遇赚一把,于是就出现了鱼目混珠、龙蛇混杂的市场现象,大家都在说定制开发、大家都说做可移植性开发,但是,真正能做定制、做可移植性的又有多少呢?
恐怕屈指可数,因为一些所谓的软件开发企业,不管自己能不能做,都会说“完全可以”,其实,这可以的背后就是先把业务接过来,然后找能做的再转包,有的会转几次,最后还是兜兜转转地还是转到了那几个有技术团队和实力的公司手里,其实,这在业界来说,是大家心知肚明的事。只是用户因为对软件知识、性能方面的东西实
在有些复付之阙如,不明所以然,只能听之任之。
那么,了解了软件可移植性是软件质量之一,也就是提高软件生命周期的好处之后,可移植性究竟体现在哪些方面呢?了解了这一点,在做软件开发时,也就有了方向。下面,就以软件开发常用的java来做以说明。
植,也就是说任意一个java程序,不论它运行在何种cpu(中央处理器)、操作系统或java编译器上,都将产生同样的结果。
1、首先,源代码可移植性。
java作为一种编程语言,提供了一种最简单并且是人们最熟悉的可移植性,即源代码移。
因为java定义了严密的语意结构,使其它编程没有可选择的余地,这也是java特点之一的安全性所决定的。
2、其次,cpu可移植性。
技术开发人员基本都知道,大多数编译器产生的目标代码只能运行在一种CPU上,即使那些能支持多种CPU的编译器,也不能同时产生适合多种CPU的目标代码。假如你需要在三种CPU上运行同一程序,就必须得编译三次。
但java编译器就不同了,因为Java为Java程序提供了一个专用的运行空间,在这个空间里Java程序可做任何事情,由此产生一个类载入程序即JVM(Java虚拟机),而java编译器产生的目标代码(J-Code),正是源代码的转换,并在CPU–JAVA虚拟机(JVM)上运行,而且不止于此,还能运行于任何具有 JAVA虚拟机的机器上,这就是CPU是可移植性。
3、再次,操作系统可移植性。
对于这一方面,JAVA采用了提供一套与平台无关的库函数(包括AWT、UTIL、LANG等等)的方法来解决这个问题。就象JVM提供了一个虚拟的CPU一样,JAVA库函数提供了一个虚拟的GUI环境。
JAVA程序仅对JAVA库函数提出调用,而库函数对操作系统功能的调用由各不同的虚拟机来完成。
同时,java也在它的OS/GUI库中使用了一种“罕见名称符”(least-commom-denominator))来提供对某种特定操作系统的功能调用,即此功能只在特定环境下生效,而在其它操作系统下则被忽略。
如此,可以针对某操作系统生成并拥有人们熟悉的界面的应用程序,同时,此程序又能在其它系统下运行。
上述三点为java语言可移植性特点的具体体现,对于软件需求用户来说,大概熟悉这几方面主要的源代码、CPU、操作系统即可。
8. 编译/解释性
件可以在多个系统下运行的功能,并支持多线程,而这正是java语言的编译和解释性特点。
所谓编译型即编译型语言,也就是编译后的代码,可以直接被及其执行,而解释型即解释型语言,指编译后的代码不能直接被机器执行,需要解释器来执行,其本质原理是因为class文件是运行在java虚拟机中的。
当然java语言的编译型主要以c、c++为主,而解释型语言则以javascript、PHP、java等为主。
这里的c、c++、javascript、PHP、java是技术上的专业术语,作为软件用户来说,只是大概了解一以便与技术人员沟通,开发出能为自己真正赋能的产品,不至于使自己对于产品性能一无所知而已。
其实,java的编译性和解释性特点,通俗简单地说,就是java编译程序生成字节码(byte-coode),这个字节码并不是通常所说的机器码,它只是提供对体系结构中型的目标文件格式,将代码设计成可对多个平台的有效程
序,藉此,java程序可以在任何实现了java解释程序和运行系统(run-time system)的系统上运行。那么,在一个解释型的环境中,程序开发的标准“链接”阶段就极大地消失了。
如果说java还有一个链接阶段,就是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,java支持快速原型和容易实验,它将利于快速程序开发,这与传统的、耗时的“编译、链接和测试”过程相比,形成了鲜明的
精巧开发过程。
这里,特别强调一下,java语言的跨平台性,要求平台上必须要有相匹配的java虚拟机,如果没有java虚拟机,则无法进行跨平台。
因为解释型语言中,java程序首先是通过编译器编译成class文件,如果在windows平台上运行,则通过windows平台上的java虚拟机(VM)进行解释。如在linux平台运行上,则通过linux平台上的java虚拟机进行解释执行。这
一点虽然技术人员会告诉你,但用户也要有所了解和知悉。
9. 高性能
Java作为一种跨平台的编程语言,具有很好的性能表现,并且可以在大规模应用程序中保持高效。
一、JVM
Java虚拟机(JVM)是Java高效性能的重要保障。JVM通过实时编译、垃圾回收和内存管理等机制,提高了Java应用程序的执行效率和资源利用率。
JVM还支持多线程并发处理,可以更好地利用多核CPU资源,并且保证对共享内存和锁的正确处理。
二、JIT编译器
Java的即时编译器(JIT)是Java高效性能的另一个关键因素。
JIT可以针对Java代码进行实时编译和优化,从而提高代码的执行速度和效率。
JIT根据代码的使用频率和重要性来进行优化,通常会将频繁执行的代码进行预编译和缓存,提高代码的执行效率。
三、内存管理
Java的内存管理机制也是Java高效性能的重要保障之一。
Java使用垃圾回收机制来管理对象的内存分配和释放,从而避免了常见的内存泄漏和空间碎片。
此外,Java的堆内存和栈内存分离,可以更好地避免内存溢出和安全问题,提高了Java应用程序的稳定性和可靠性。
四、多线程处理
1、Java支持多线程并发处理,可以更好地利用多核CPU资源和提高系统的吞吐量。通过多线程并发处理,可以将耗时操作和计算密集型任务分配到不同的线程中进行,从而提高了程序的响应速度和效率。
2、同时,Java还提供了同步机制和锁机制来保证