目录
一、什么是编程?
二、什么是Java?
三、Java语言之父是谁
四、Java开发平台
1. JAVA三大平台介绍
a. JAVA SE
b. JAVA EE
c. JAVA ME
2. 选择哪个平台学习
3. 搭建JAVA SE平台
a. 到官网下载JAVA SE平台
b. 将下载好的压缩包解压
c. 配置环境变量
3.4 第一个程序的开发
4. 总结
五、Java语言特点
1. 简单性
2. 面向对象
3. 分布式
4. 键状性/正确性
5. 安全性
6. 体系结构中立
7. 可移植性
8. 编译/解释性
9. 高性能
a. JVM
b. JIT编译器
c. 内存管理
d. 多线程处理
10. 多线程
Java使用多线程的优势
a. 发挥多处理器的强大能力
b. 在单处理器系统上获得更高的吞吐率
c. 建模的简单性
d. 异步事件的简化处理
11. 动态性
a. 反射(Reflection)
11.2 动态代理(Dynamic Proxy)
11.3 动态加载类(Dynamic Class Loading)
一、什么是编程?
编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到相应
结果的过程。
编程就是写那些指令的过程,我们使用一种编程语言来实现这些指令的编写,这些指令被翻
译成计算机能够读懂的格式,最后由计算机执行指令。
计算机编程语言包括C语言、C++语言 Java语言、Python语言、数据库开发语言、其他编程
语言。
计算机编程语言是程序设计的最重要的工具,它是指计算机能够接受和处理的、具有一定语
法规则的语言。
很多人觉得编程是门高深莫测的学问, 担心自己学不来。
实际上, 编程虽然不是随便能学会的技能, 但是也没有那么难。
因为, 普通人已经具备了很多编程需要的基础. 为什么这么说?
和我们日常使用的中文、英语一样, 编程语言也是一门用于沟通的语言.只不过"编程语言"是和
计算机沟通的语言。
而"程序", 就是使用计算机能够理解的语言书写的一连串命令.而"编程"就是我们为了完成某项
任务, 将解决问题的步骤, 用计算机能够理解的语言写成指令, 这就是"编程"。
而后, 计算机会根据这些指令一步步执行, 最后完成任务.
二、什么是Java?
Java是一种高级编程语言,由Sun Microsystems于1995年推出。它是一种面向对象的语言,
广泛用于开发各种应用程序,包括Web应用程序、移动应用程序、桌面应用程序等。Java的设计
目标是让程序员可以编写一次代码,然后在不同的平台上运行。
Java的优点
Java程序可以在不同的操作系统上运行,而无需重新编写代码。
这是因为Java程序被编译为字节码,而不是特定于某个操作系统的机器码。
字节码可以在Java虚拟机上运行,这是一个独立于操作系统的软件。这种跨平台的能力使得Java
成为一种非常流行的编程语言。
Java是一种面向对象的语言,这意味着它支持封装、继承和多态等概念。
这些概念使得编写复杂的程序变得更加容易。
Java还有一个强大的标准库,其中包含了许多常用的类和方法,可以帮助程序员快速编写出高质量
的代码。
Java的应用范围
它被广泛用于开发Web应用程序,例如Java Servlet和JavaServer Pages(JSP)。
这些技术可以帮助程序员在Web浏览器中呈现动态内容。
Java还被用于开发移动应用程序,例如Android应用程序。
Android是世界上最流行的移动操作系统之一,而Java是Android应用程序的主要编程语言。
Java也被用于开发桌面应用程序,例如Eclipse和NetBeans等集成开发环境。
Java的学习曲线相对较缓。即使你没有编程经验,也可以通过学习Java来掌握编程技能。
Java有许多入门教程和学习资源可供使用,这些资源可以帮助初学者快速掌握基本的编程概念和语
法。
总之,Java是一种非常流行的编程语言,具有跨平台性、面向对象、标准库丰富等优点。
它被广泛用于开发各种应用程序,包括Web应用程序、移动应用程序和桌面应用程序等。如果你想
学习编程,Java是一个非常好的选择。
除了Java,还有许多其他的编程语言可供选择。例如Python、C++、JavaScript等。
每种编程语言都有其独特的优点和应用领域。
如果你想学习编程,可以先了解一下各种编程语言的特点和应用范围,然后选择最适合你的语言进
行学习。
三、Java语言之父是谁
詹姆斯·高斯林
詹姆斯·高斯林(James Gosling)出生于加拿大,是一位计算机编程天才。
在卡内基·梅隆大学攻读计算机博士学位时,他编写了多处理器版本的Unix操作系统,曾担任Sun公
司Oak项目组组长,Oak后来改名为Java,所以他不仅是Java编程语言的共同创始人之一,外界也
一般公认他为“Java之父”。
Java的虚拟机思想让一套程序运行在多种设备和操作系统上成为了可能。正是它的大一统思想,让
java得到了全速发展。
没几年,java就成了最受欢迎的语言,很多程序员都加入了Java的生态系统环境。
Java是一门面向对象的编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继
承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思
维方式进行复杂的编程 。
四、Java开发平台
java三大平台介绍,选择哪个平台学习java编程?
1. JAVA三大平台介绍
a. JAVA SE
全称为JAVA Standard Edition(也曾简称为J2SE)JAVA标准版或JAVA标准平台,是JAVA技术的核
心和基础,同时也是JAVA ME和JAVA EE的基础。它提供了标准的JAVA开发工具包(JDK),通过
它能够实现桌面应用程序、低端服务器和JAVA Applet程序等功能的开发,目前该平台官方已经更
新到JDK17版本。
b. JAVA EE
全称为Java Enterprise Edition(也曾称为J2EE)JAVA企业版或JAVA 企业平台,通过它能够构建企
业级服务应用。
实际上,JAVA EE包含了JAVA SE,并在这个基础上添加了许多功能强大的类库,用于支持企业
级别的业务开发如目录管理、消息管理等,目前该平台官网最新版本为JAVA EE8。
c. JAVA ME
全称JAVA Micro Edition(也曾称J2ME)JAVA微型版或JAVA小型平台,与JAVA EE主要构建企业级
应用相反,JAVA ME是一种很小的JAVA运行环境,它主要是应用在嵌入式的产品中,如移动电
话,掌上电脑、电视机机顶盒等,使得编译好的JAVA程序能够在上面执行,目前该平台官网最新
版本为JAVA ME8。
2. 选择哪个平台学习
三大平台各有特点,但是共同点都是平台内部包含了JAVA 虚拟机,编译好的程序在平台执行的流
程大致如下:
虚拟机将编译好的字节码文件加载到内存,然后采用解释执行的方式执行字节码(所谓解释执行
即:
平台根据响应系统将字节码解释一条,执行一条,就跟初学英语时一样,老师每讲一句英语都会给
你解释这句话的含义)。
既然三大平台处理的方式都是大同小异,那初学者该选择哪个平台学习更好呢?
根据官方书籍和无数实践证明,初学者最好先学习JAVA SE,选用它提供的软件开发工具包-
JDK,它是学习和掌握JAVA知识的最佳平台,也是学习JAVA EE和JAVA ME的基础。
3. 搭建JAVA SE平台
a. 到官网下载JAVA SE平台
说明:从搭建开始提到的JDK指的是OpenJDK而不是Oracle JDK,至于为什么不用Oracle JDK主
要原因是因为Oracle(甲骨文)公司在2023年08月30日宣布后续停止免费对JAVA SE8版本进行更
新,商用的话需要进行购买,而Open JDK作为Oracle JDK的免费开源版本,更适合个人开发者使
用(至于Oracle JDK和Open JDK之间的事,要扯起来能说半天,有时间再单独开一篇文章谈谈)
下载地址: JDK Builds from Oracle
注:本文演示使用JDK11版本(推荐大家学习时尽量使用JDK8或者JDK11版本,因为这两个版本是
长期维护的版本,更加稳定,但因为OpenJDK下载中windows环境下只有32位的,所以演示就使
用JDK11版本)
b. 将下载好的压缩包解压
将下载好的压缩包解压,可以查看到下面的目录
(注意:OpenJDK压缩包是绿色软件,既不需要安装即可直接使用)
c. 配置环境变量
配置环境变量:虽然解压后我们能够到指定的文件夹去执行对应的java.exe文件,但是,如果是想
在电脑的任意一个目录下都可以调用刚刚解压的java jdk,那就需要将jdk的执行路径配置到系统的
环境变量中。
配置环境变量可以通俗理解为身份证上的家庭住址,只要身份证上标记了这个地址,以后别人想要
找你的时候,都可以直接通过这个地址去到你家找你。程序配置了系统环境变量,以后在执行关于
jdk的相关命令时,会先根据配置的地址去找到对应的执行程序,然后执行对应的命令,这样就不
会出现"既不是内部或外部命令,也不是可执行程序…"的错误。
步骤一:此电脑 = > 属性 = 》高级系统设置
步骤二: 环境变量
步骤三:新增JAVA_HOME环境变量,值指向刚刚压缩好的openjdk目录
步骤四:在PATH变量中引入JAVA_HOME变量,并指向bin目录,格式:%变量名%in
步骤五:打开命令控制台(快捷键: Win键+R,输入cmd回车),输入:java -version查看安装好的
JAVA版本
看到此处,先要恭喜你终于完成了JAVA SE平台的搭建,从现在开始,我们可以真正进入到JAVA
程序的开发了,准备好大展身手了吗?
让我们先来完成第一个程序“Hello World”的搭建吧!
3.4 第一个程序的开发
1、创建一个名为HelloWorld.txt的文本文件,并添加入以下代码:
2、将文本HelloWorld.txt后缀名修改成java,然后在地址栏输入cmd回车进入命令控制台
3、编译、并执行JAVA程序,大功告成
4. 总结
这里主要介绍了关于JAVA的三大平台、如何搭建JAVA SE平台以及搭建第一个JAVA程序,初学者
会感觉步骤稍微麻烦,但是这个搭建是永久性的,搭建完之后我们只需要关注JAVA程序编写而无
需再关注环境的搭建,所以,之前的步骤都是值得的。
这里的HelloWorld程序案例的运行后大家会发现存在两个比较大的问题。
第一个是虽然程序运行了,但是还是没有了解这个程序是如何被运行的流程?
第二个是使用记事本编写程序比较麻烦,有没有更好的方式?
五、Java语言特点
1. 简单性
Java语言的简单性主要体现在三个方面:
1、Java的风格类似于C++,因而C++程序员初次接触Java语言,就会感到很熟悉。
从某种意义上讲,Java语言是C及C语言的一个变种,因此,C程序员可以很快地掌握Java编程技
术。
2、Java摒弃了C++中容易引发程序错误的一些特性,如指针、结构、枚举以及内存管理等。
3、Java提供了丰富的类库,可以帮助我们很方便的开发Java程序。
2. 面向对象
Java语言作为面向对象的编程语言,提供了面向对象的四种基本性质:抽象性、封装性、继承性和
多态性。
万事万物皆对象,Java面向对象编程是以人类最好理解的方向去编程(客观世界中的对象为中心)。
JAVA的特点:
封装是指属性私有化,根据需要提供setter和getter方法来访问属性,隐藏具体属性和实现细节,仅
对外开放接口,控制程序中属性的访问级别。
继承是指将多个相同的属性和方法提取出来,新建一个父类,java中一个类只能继承一个父类,且
只能继承访问权限非private属性和方法,子类可以重写父类中的方法,命名与父类中同名的属性。
多态(Polymiorph)可以分为两种:设计时多态、运行时多态,设计(编译)时多态:即重载
(Overload),是指java允许方法名相同
而参数不同(返回值可以相同也可以不同),同一个类中允许存在一个或多个以上的同名函数,只
要参数类型或参数个数不同即可。
什么是面向对象?
《Java编程思想》中提到“万物皆为对象”的概念。它将对象视为一种奇特的变量,它除了可以存储
数据之外还可以对它自身进行操作。
它能够直接反映现实生活中的事物,例如人、车、小鸟等,将其表示为程序中的对象。
每个对象都具有各自的状态特征(也可以称为属性)及行为特征(方法),java就是通过对象之间
行为的交互来解决问题的。
面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描
述某个事物在解决问题中的行为。
面向过程和面向对象的区别
面向过程
优点:性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。
缺点:不易维护、不易复用、不易扩展
面向对象
优点:
易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加
灵活、更加易于维护
缺点:性能比面向过程差
3. 分布式
Java作为面向对象编程语言,在设计时就设计成支持网络应用的分布式语言,既支持各种层次的网
络连接,又以Socket类支持可靠的流(stream)网络连接,所以,用户可以产生分布式的客户机和
服务器。
这里的Socket又称套接字(一种独立于协议的网络编程接口),所谓套接字就是对网络中不同主机
上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应
用层进程利用网络协议交换数据的机制。
那么,从java语言面向对象特点(前文已谈)来说,Socket就是第一个创建类,从编程上来说,大
多时候是基于TCP(传输控制协议)/UDP(用户数据报协议)等协议做的一层封装或者说抽象,
是一套系统所提供的用于进行网络通信相关编程的接口,通过stream(流媒体技术)的传送,可实
现服务端与客户端的链接。而这正是java语言分布性特点的体现。
当然,Socket编程,由专业的技术人员遵循严谨严密的逻辑来完成,这里不再赘述其基本流程。
提到这些专业术语和简单的逻辑关系,只是让有软件开发需求的用户,在计划开发软件时,大概地
知道一些简单的技术功能、属性和逻辑关系,做到最起码的、简单地知悉。仅此而已。
另外,java作为计算机编程语言,其实也是“面向对象”的一种程序设计思想,因此,面向对象作为
其主要特点之
在软件开发过程中,可遵循以下五个原则展开。
一,是单一职责原则(SRP)类的功能切忌一定要单一,不能啥都往里“装”;
二,是开放封闭原则(0CP)一个模块对于拓展是开放的,但对于修改是封闭的,可以增加功能,
但不可以修改;
三,是里式替换原则(LSP)子类可以替换“父”类出现在“父”类能够出现的任何地方,也就是说儿子可以代替父
亲去执行父亲的任务和工作;
四,是依赖倒置原则(DIP)这一原则中,高层次的模块不应依赖于低层次的模块,应该依赖于抽
象。但抽象不应依赖于具体事项,但具体实现应依赖于抽象。
五,是接口分离原则(ISP)设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好
的多,可以满足客户所期望的诉求。
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的存储不由编译程序决策安排,而是由解释程序来决定,也就是说Java为
Java程序提供了一个专用的运行空间,在这个空间里Java程序可做任何事情,但是,除了这个边
界就不能有任何操作了。
这里,就有一个类载入程序体系即JVM(Java虚拟机),其作用主要是类载入程序,负责输入哪些
定义运行程序的类和结构的二进制数据。JVM有非常灵活的类载入结构,它允许Java应用程序自己
定义装载的方式。
同时,类载入程序结构时,给不同的类载入程序装入的类,提供了受保护的命名空间,这就组织了
破坏性的代码干扰正常的代码,保障了
Java语言的安全性。
Java语言的安全性主要体现在以下几方面:
一是严格遵循面向对象(关于“面向对象”前面的文章中已陈述)的规范,即封装了数据细节,只提
供接口给用户,增加了数据级的安全性
二,是无指针运算,增加了内存级的运算;
三,是数组边界检查,有效防止了缓存溢出等安全漏洞;
四,是强制类型转换,使非同类型的对象之间不能进行转换;
五,是语言对线程安全的支持;
六,是通过编译器、检验器、类装载器自动建立安全策略。
6. 体系结构中立
编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,
就可以在许多处理器上运行。
Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。
精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以迅速地翻译成本地机器的
代码。
7. 可移植性
软件可移植性是指软件从某一种环境转移到另一环境性的难易程度。
需要注意的是,这里所说的软件可移植性,指代码的可移植性,而代码的可移植性主题就是软件,
因此,可移植性是软件产品的一种属性,它的行为表现为一种程度,这种程度与包括软件、硬件、
组织在内的环境有关。
这里,作为一名具有多年软件行从业经验的兰州东方商易科技工作人员,结合自己的行业从业经
验,删繁就简地谈谈软件可移植性。
从软件开发来说,可移植性是软件质量之一,良好的可移植性可以提高软件的生命周期。
说的再明白一点,就是软件可移植性具备了适应性、易安装性、共存性、易替换性、依存性等特
征,那么,从用户角度来看,这些特点无疑是最适合自己的了,正如俗话所说,适合的就是最好
的。
然而,软件开发作为新时代新业态中的新行业,人人都想抓住新机遇赚一把,于是就出现了鱼目混
珠、龙蛇混杂的市场现象,大家都在说定制开发、大家都说做可移植性开发,但是,真正能做定
制、做可移植性的又有多少呢?
恐怕屈指可数,因为一些所谓的软件开发企业,不管自己能不能做,都会说“完全可以”,
其实,这可以的背后就是先把业务接过来,然后找能做的再转包,有的会转几次,最后还是兜兜转
转地还是转到了那几个有技术团队和实力的公司手里,其实,这在业界来说,是大家心知肚明的
事。只是用户因为对软件知识、性能方面的东西实在有些复付之阙如,不明所以然,只能听之任
之。
那么,了解了软件可移植性是软件质量之一,也就是提高软件生命周期的好处之后,可移植性究竟
体现在哪些方面呢?
了解了这一点,在做软件开发时,也就有了方向。下面,就以软件开发常用的java来做以说明。
首先,源代码可移植性。java作为一种编程语言,提供了一种最简单并且是人们最熟悉的可移植
性,即源代码移植,也就是说任意一个java程序,不论它运行在何种cpu(中央处理器)、操作系
统或java编译器上,都将产生同样的结果。
因为java定义了严密的语意结构,使其它编程没有可选择的余地,这也是java特点之一的安全性所
决定的。
其次,cpu可移植性。技术开发人员基本都知道,大多数编译器产生的目标代码只能运行在一种
CPU上,即使那些能支持多种CPU的编译器,也不能同时产生适合多种CPU的目标代码。假如你
需要在三种CPU上运行同一程序,就必须得编译三次。但java编译器就不同了,因为Java为Java
程序提供了一个专用的运行空间,在这个空间里Java程序可做任何事情,由此产生一个类载入程序
即JVM(Java虚拟机),而java编译器产生的目标代码(J-Code),正是源代码的转换,并在
CPU–JAVA虚拟机(JVM)上运行,而且不止于此,还能运行于任何具有 JAVA虚拟机的机器上,
这就是CPU是可移植性。
再次,操作系统可移植性。对于这一方面,JAVA采用了提供一套与平台无关的库函数(包括
AWT、UTIL、LANG等等)的方法来解决这个问题。就象JVM提供了一个虚拟的CPU一样,JAVA
库函数提供了一个虚拟的GUI环境。
JAVA程序仅对JAVA库函数提出调用,而库函数对操作系统功能的调用由各不同的虚拟机来完成。
同时,java也在它的OS/GUI库中使用了一种“罕见名称符”(least-commom-denominator))来提供
对某种特定操作系统的功能调用,即此功能只在特定环境下生效,而在其它操作系统下则被忽略。
如此,可以针对某操作系统生成并拥有人们熟悉的界面的应用程序,同时,此程序又能在其它系统
下运行。
上述三点为java语言可移植性特点的具体体现,对于软件需求用户来说,大概熟悉这几方面主要的
源代码、CPU、操作系统即可。
8. 编译/解释性
在软件开发中,Java语言之所以受软件开发师的青睐,是因为java语言的跨平台性,赋予了一个编
译好的class文件可以在多个系统下运行的功能,并支持多线程,而这正是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作为一种跨平台的编程语言,具有很好的性能表现,并且可以在大规模应用程序中保持高效。
下面将从各个方面介绍Java的性能优势和如何保持高效。
a. JVM
Java虚拟机(JVM)是Java高效性能的重要保障。
JVM通过实时编译、垃圾回收和内存管理等机制,提高了Java应用程序的执行效率和资源利用率。
JVM还支持多线程并发处理,可以更好地利用多核CPU资源,并且保证对共享内存和锁的正确处
理。
b. JIT编译器
Java的即时编译器(JIT)是Java高效性能的另一个关键因素。
JIT可以针对Java代码进行实时编译和优化,从而提高代码的执行速度和效率。
JIT根据代码的使用频率和重要性来进行优化,通常会将频繁执行的代码进行预编译和缓存,提高
代码的执行效率。
c. 内存管理
Java的内存管理机制也是Java高效性能的重要保障之一。
Java使用垃圾回收机制来管理对象的内存分配和释放,从而避免了常见的内存泄漏和空间碎片。
此外,Java的堆内存和栈内存分离,可以更好地避免内存溢出和安全问题,提高了Java应用程序
的稳定性和可靠性。
d. 多线程处理
Java支持多线程并发处理,可以更好地利用多核CPU资源和提高系统的吞吐量。
通过多线程并发处理,可以将耗时操作和计算密集型任务分配到不同的线程中进行,从而提高了程
序的响应速度和效率。
同时,Java还提供了同步机制和锁机制来保证对共享数据的正确访问和操作。
Java具有优秀的性能表现,并且可以在大规模应用程序中保持高效。
通过JVM、JIT编译器、内存管理和多线程处理等机制,Java可以更好地利用计算资源和保障程序的稳定性、可靠
性。
对于Java开发人员来说,合理使用Java语言特性和优化技巧,编写高质量的Java代码,也是保证
Java高效性能的重要措施。
10. 多线程
Java使用多线程的优势
如果使用得当,线程可以有效地降低程序的开发和维护等成本,同时提升复杂应用程序的性能。
那么Java使用多线程的优势具体有哪些呢,一起来了解一下!
a. 发挥多处理器的强大能力
现在,多处理器系统正日益盛行,并且价格不断降低,即时在低端服务器和中断桌面系统中,通常
也会采用多个处理器,这种趋势还在进一步加快,因为通过提高时钟频率来提升性能已变得越来越
困难,处理器生产厂商都开始转而在单个芯片上放置多个处理器核。
试想,如果只有单个线程,双核处理器系统上程序只能使用一半的CPU资源,拥有100个处理器的
系统上将有99%的资源无法使用。
多线程程序则可以同时在多个处理器上执行,如果设计正确,多线程程序可以通过提高处理器资源
的利用率来提升系统吞吐率。
b. 在单处理器系统上获得更高的吞吐率
如果程序是单线程的,那么当程序等待某个同步I/O操作完成时,处理器将处于空闲状态。
而在多线程程序中,如果一个线程在等待I/O操作完成,另一个线程可以继续运行,使得程序能在I/
O阻塞期间继续运行。
c. 建模的简单性
通过使用线程,可以将复杂并且异步的工作流进一步分解为一组简单并且同步的工作流,每个工作
流在一个单独的线程中运行,并在特定的同步位置进行交互。我们可以通过一些现有框架来实现上
述目标,例如Servlet和RMI,框架负责解决一些细节问题,例如请求管理、线程创建、负载平衡,
并在正确的时候将请求分发给正确的应用程序组件。
编写Servlet的开发人员不需要了解多少请求在同一时刻要被处理,也不需要了解套接字的'输入流
或输出流是否被阻塞,当调用Servlet的service方法来响应Web请求时,可以以同步的方式来处理
这个请求,就好像它是一个单线程程序。
d. 异步事件的简化处理
服务器应用程序在接受多个来自远程客户端的套接字连接请求时,如果为每个连接都分配其各自的
线程并且使用同步I/O,那么就会降低这类程序的开发难度。如果某个应用程序对套接字执行读操
作而此时还没有数据到来,那么这个读操作将一直阻塞,直到有数据到达。
在单线程应用程序中,这不仅意味着在处理请求的过程中将停顿,而且还意味着在这个线程被阻塞
期间,对所有请求的处理都将停顿。
为了避免这个问题,单线程服务器应用程序必须使用非阻塞I/O,但是这种I/O的复杂性要远远高于
同步I/O,并且很容易出错。
然而,如果每个请求都拥有自己的处理线程,那么在处理某个请求时发生的阻塞将不会影响其他请
求的处理。
11. 动态性
Java是一种静态类型语言,其变量在编译时需要明确声明类型,并且类型检查是在编译时进行的。
然而,Java也具有一些动态特性,允许在运行时进行类型检查和动态处理对象。
下面是几个Java语言的动态特性以及相应的代码示例:
a. 反射(Reflection)
Java的反射机制允许在运行时动态地获取类的信息并操作对象。
可以使用反射来获取类的构造函数、方法、字段等,并在运行时创建对象、调用方法等。
import java.lang.reflect.*;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
Class<?> clazz = MyClass.class;
Constructor<?> constructor = clazz.getConstructor();
Object obj = constructor.newInstance();
Method method = clazz.getMethod("myMethod");
method.invoke(obj);
}
}
class MyClass {
public void myMethod() {
System.out.println("Hello, reflection!");
}
}
11.2 动态代理(Dynamic Proxy)
Java的动态代理允许在运行时动态地创建代理对象并拦截方法调用,可以用于实现AOP(面向切
面编程)等功能。
import java.lang.reflect.*;
public class DynamicProxyExample {
public static void main(String[] args) {
MyInterface target = new MyImpl();
MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
MyInterface.class.getClassLoader(),
new Class[] { MyInterface.class },
new MyInvocationHandler(target)
);
proxy.myMethod();
}
}
interface MyInterface {
void myMethod();
}
class MyImpl implements MyInterface {
public void myMethod() {
System.out.println("Hello, dynamic proxy!");
}
}
class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before invoking myMethod()");
Object result = method.invoke(target, args);
System.out.println("After invoking myMethod()");
return result;
}
}
11.3 动态加载类(Dynamic Class Loading)
Java的动态类加载允许在运行时根据需要加载类。
可以使用Class.forName()方法或ClassLoader来动态加载类文件,并在运行时实例化对象。
public class DynamicClassLoadingExample {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("MyClass");
Object obj = clazz.newInstance();
if (obj instanceof MyClass) {
MyClass myObj = (MyClass) obj;
myObj.myMethod();
}
}
}
class MyClass {
public void myMethod() {
System.out.println("Hello, dynamic class loading!");
}
}