精华内容
下载资源
问答
  • java.versionjava.version Java 执行时环境版本号java.vendorjava.vendor Java 执行时环境供应商java.vendor.urljava.vendor.url Java 供应商的 URLjava.homejava.home Java 安装文件夹java.vm.specification....

    这里就不一一演示了,下面是获取信息的key。

    java.versionjava.version Java 执行时环境版本号

    java.vendorjava.vendor Java 执行时环境供应商

    java.vendor.urljava.vendor.url Java 供应商的 URL

    java.homejava.home Java 安装文件夹

    java.vm.specification.versionjava.vm.specification.version Java 虚拟机规范版本号

    java.vm.specification.vendorjava.vm.specification.vendor Java 虚拟机规范供应商

    java.vm.specification.namejava.vm.specification.name Java 虚拟机规范名称

    java.vm.versionjava.vm.version Java 虚拟机实现版本号

    java.vm.vendorjava.vm.vendor Java 虚拟机实现供应商

    java.vm.namejava.vm.name Java 虚拟机实现名称

    java.specification.versionjava.specification.version Java 执行时环境规范版本号

    java.specification.vendorjava.specification.vendor Java 执行时环境规范供应商

    java.specification.namejava.specification.name Java 执行时环境规范名称

    java.class.versionjava.class.version Java 类格式版本号号

    java.class.pathjava.class.path Java 类路径

    java.library.pathjava.library.path 载入库时搜索的路径列表

    java.io.tmpdirjava.io.tmpdir 默认的暂时文件路径

    java.compilerjava.compiler 要使用的 JIT 编译器的名称

    java.ext.dirsjava.ext.dirs 一个或多个扩展文件夹的路径

    os.nameos.name 操作系统的名称

    os.archos.arch 操作系统的架构

    os.versionos.version 操作系统的版本号

    file.separatorfile.separator 文件分隔符(在 UNIX 系统中是“/”)

    path.separatorpath.separator 路径分隔符(在 UNIX 系统中是“:”)

    line.separatorline.separator 行分隔符(在 UNIX 系统中是“/n”)

    user.nameuser.name 用户的账户名称

    user.homeuser.home 用户的主文件夹

    user.diruser.dir 用户的当前工作文件夹

    展开全文
  • 通常Java代码都是运行在JVM中而不能直接访问系统硬件如进行内存分配释放等,但如果有需要跳过JVM直接用Java访问系统硬件,比如像C语言指针一样操作的话就可以调用Unsafe对象相关方法。1、Unsafe说明Unsafe类在sun....

    通常Java代码都是运行在JVM中而不能直接访问系统硬件如进行内存分配释放等,但如果有需要跳过JVM直接用Java访问系统硬件,比如像C语言指针一样操作的话就可以调用Unsafe对象相关方法。

    1、Unsafe说明

    Unsafe类在sun.misc包下,不属于Java标准。但是很多Java基础类库,包括一些高性能的开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka、JUC并发包的基础AQS依赖的CAS操作和LockSupport类等。Unsafe在提升Java运行效率,增强Java底层操作能力方面起了很大的作用。但它大部分操作都是绕过JVM通过JNI完成的,因此它分配的内存需要手动free,过度的使用Unsafe类会让出错几率变大,所以是非常危险的,Java官方不建议直接使用。

    2、Unsafe类的使用

    Unsafe类是一个单例,可通过getUnsafe方法获取,但内部会检查限制,只有是系统类加载器加载的类才能调用,否则会抛出异常。可通过JVM启动参数-Xbootclasspath指定要启动的类为启动类或通过反射获取到它的实例【Unsafe类中有一个私有的成员变量theUnsafe,我们可以用反射将其实例的访问属性设置为true,然后通过File的get方法获取】。

    Field f = Unsafe.class.getDeclaredField("theUnsafe");

    f.setAccessible(true);

    Unsafe unsafe= (Unsafe) f.get(null);

    获取到Unsafe的实例之后,我们就可以实现如下功能

    内存管理:内存的分配、释放、拷贝等,利用copyMemory方法可以实现一个通用的对象浅拷贝方法。

    非常规对象的实例化:使用allocateInstance方法能直接生成实例对象,无需调用构造方法和它的初始化方法,在对象反序列化时会很有用,能重建和设置final字段而不要调用构造方法。

    操作类、对象、变量:获取对象指针,修改指针指向的数据。

    数组操作:使用Unsafe类的内存分配方法可以实现超大数组,但注意要自己释放内存。

    多线程同步:CAS操作、锁机制,LockSupport的pack、unpark方法最终都是调用了Unsafe的pack、unpack方法。

    内存屏障:在Java8中新引入的,用于定义内存屏障,避免代码重排。

    3、Java9中Unsafe的变化

    Unsafe包路径发生变化,被移动到jdk.internal.misc包下。

    增加了非常详细的注释,增加一个静态方法,可以直接拿到theUnsafe对象。

    展开全文
  • 硬件内存模型跟 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你碰到了半吊子面试...

    硬件内存模型跟 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你碰到了半吊子面试官,那就要恭喜你了。Java 内存模型比 JVM 内存结构复杂很多,Java 内存模型有一个规范叫:《JSR 133 :Java 内存模型与线程规范》,里面的内容很丰富,如果你没看过的话,我建议你看一下。今天我们就简单的来聊一聊 Java 内存模型,关于 Java 内存模型,我们还是先从硬件内存模型入手。

    硬件内存模型

    先来看看硬件内存简单架构,如下图所示:

    a991641c0ef5cdeb3bebbf44004ea8dc.png

    硬件内存结构

    这是一幅简单的硬件内存结构图,真实的结构图要比这复杂很多,特别是在缓存层,现在的计算机中 CPU 缓存一般有三层,你也可以打开你的电脑看看,打开 任务资源管理器 ---> 性能 ---> cpu ,如下图所示:

    aadafaabcdeb7e8add35f0be45f1c5e7.png

    CPU 缓存

    从图中可以看出我这台机器的 CPU 有三级缓存,一级缓存 (L1) 、二级缓存(L2)、三级缓存(L3),一级缓存是最接近 CPU 的,三级缓存是最接近内存的,每一级缓存的数据都是下一级缓存的一部分。三级缓存架构如下图所示:

    012a21cdfb13d405d579293cc10479d5.png

    现在我们对硬件内存架构有了一定的了解,我们来弄明白一个问题,为什么需要在 CPU 和内存之间添加缓存

    关于这个问题我们就简单点说,我们知道 CPU 是高速的,而内存相对来说是低速的,这就会造成一个问题,不能充分的利用 CPU 高速的特点,因为 CPU 每次从内存里获取数据的话都需要等待,这样就浪费了 CPU 高速的性能,缓存的出现就是用来消除 CPU 与内存之间差距的。缓存的速度要大于内存小于 CPU ,加入缓存之后,CPU 直接从缓存中读取数据,因为缓存还是比较快的,所以这样就充分利用了 CPU 高速的特性。但也不是每次都能从缓存中读取到数据,这个跟我们项目中使用的 redis 等缓存工具一样,也存在一个缓存命中率,在 CPU 中,先查找 L1 Cache,如果 L1 Cache 没有命中,就往 L2 Cache 里继续找,依此类推,最后没找到的话直接从内存中取,然后添加到缓存中。当然当 CPU 需要写数据到主存时,同样会先刷新寄存器中的数据到 CPU 缓存,然后再把数据刷新到主内存中。

    也许你已经看出了这个框架的弊端,在单核时代只有一个处理器核心,读/写操作完全都是由单核完成,没什么问题;但是多核架构,一个核修改主存后,其他核心并不知道数据已经失效,继续傻傻的使用主存或者自己缓存层的数据,那么就会导致数据不一致的情况。关于这个问题 CPU 硬件厂商也提供了解决办法,叫做缓存一致性协议(MESI 协议),缓存一致性协议这东西我也不了解,我也说不清,所以就不在这里 BB 了,有兴趣的可以自行研究。

    聊完了硬件内存架构,我们将焦点回到我们的主题 Java 内存模型上,下面就一起来聊一聊 Java 内存模型。

    Java 内存模型

    Java 内存模型是什么?Java 内存模型可以理解为遵照多核硬件架构的设计,用 Java 实现了一套 JVM 层面的“缓存一致性”,这样就可以规避 CPU 硬件厂商的标准不一样带来的风险。好了,正式介绍一下 Java 内存模型:Java 内存模型 ( Java Memory Model,简称 JMM ),本身是种抽象的概念,并不是像硬件架构一样真实存在的,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量 (包括实例字段、静态字段和构成数组对象的元素) 的访问方式,更多关于 Java 内存模型知识可以阅读 JSR 133 :Java 内存模型与线程规范。

    我们知道 JVM 运行程序的实体是线程,在上一篇 JVM 内存结构中我们得知每个线程创建时,JVM 都会为其创建一个工作内存 ( Java 栈 ),用于存储线程私有数据,而 Java 内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作 ( 读取赋值等 ) 必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完后再将变量写回主内存,不能直接操作主内存中的变量。

    我们知道 Java 栈是每个线程私有的数据区域,别的线程无法访问到不同线程的私有数据,所以线程需要通信的话,就必须通过主内存来完成,Java 内存模型就是夹在这两者之间的一组规范,我们先来看看这个抽象架构图:

    90183bce1b0dc1e1b7582804c5023494.png

    从结构图来看,如果线程 A 与线程 B 之间需要通信的话,必须要经历下面 2 个步骤:

    首先,线程 A 把本地内存 A 中的共享变量副本中的值刷新到主内存中去。

    然后,线程 B 到主内存中去读取线程 A 更新之后的值,这样线程 A 中的变量值就到了线程 B 中。

    我们来看一个具体的例子来加深一下理解,看下面这张图:

    4019939cbcde8a5abb388ee72dd69cae.png

    现在线程 A 需要和线程 B 通信,我们已经知道线程之间通信的两部曲了,假设初始时,这三个内存中的 x 值都为 0。线程 A 在执行时,把更新后的 x 值(假设值为 1)临时存放在自己的本地内存 A 中。当线程 A 和线程 B 需要通信时,线程 A 首先会把自己本地内存中修改后的 x 值刷新到主内存中,此时主内存中的 x 值变为了 1。随后,线程 B 到主内存中去读取线程 A 更新后的 x 值,此时线程 B 的本地内存的 x 值也变为了 1,这样就完成了一次通信。

    JMM 通过控制主内存与每个线程的本地内存之间的交互,来为 Java 程序员提供内存可见性保证。Java 内存模型除了定义了一套规范,还提供了一系列原语,封装了底层实现后,供开发者直接使用。这套实现也就是我们常用的volatile、synchronized、final 等。

    Happens-Before 内存模型

    Happens-Before 内存模型或许叫做 Happens-Before 原则更为合适,在 《JSR 133 :Java 内存模型与线程规范》中,Happens-Before 内存模型被定义成 Java 内存模型近似模型,Happens-Before 原则要说明的是关于可见性的一组偏序关系。

    为了方便程序员开发,将底层的繁琐细节屏蔽掉,Java 内存模型 定义了 Happens-Before 原则。只要我们理解了 Happens-Before 原则,无需了解 JVM 底层的内存操作,就可以解决在并发编程中遇到的变量可见性问题。JVM 定义的 Happens-Before 原则是一组偏序关系:对于两个操作 A 和 B,这两个操作可以在不同的线程中执行。如果 A Happens-Before B,那么可以保证,当 A 操作执行完后,A 操作的执行结果对 B 操作是可见的

    Happens-Before 原则一共包括 8 条,下面我们一起简单的学习一下这 8 条规则。

    1、程序顺序规则

    这条规则是指在一个线程中,按照程序顺序,前面的操作 Happens-Before 于后续的任意操作。这一条规则还是非常好理解的,看下面这一段代码

    ca6db410036ade13bb591a1d29ab22af.png

    第四行代码要 Happens-Before 于第五行代码,也就是按照代码的顺序来。

    2、锁定规则

    这条规则是指对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。例如下面的代码,在进入同步块之前,会自动加锁,而在代码块执行完会自动释放锁,加锁以及释放锁都是编译器帮我们实现的

    4625e2d798427ed37e8d5b4b9bb30970.png

    对于锁定规则可以这样理解:假设 x 的初始值是 10,线程 A 执行完代码块后 x 的值会变成 12(执行完自动释放锁),线程 B 进入代码块时,能够看到线程 A 对 x 的写操作,也就是线程 B 能够看到 x==12。

    3、volatile 变量规则

    这条规则是指对一个 volatile 变量的写操作及这个写操作之前的所有操作 Happens-Before 对这个变量的读操作及这个读操作之后的所有操作。

    4、线程启动规则

    这条规则是指主线程 A 启动子线程 B 后,子线程 B 能够看到主线程在启动子线程 B 前的操作。

    8b2540fdf361a7e7fbea1c825d994e04.png

    子线程 t1 能够看见主线程对 count 变量的修改,所以在线程中打印出来的是 12 。这也就是线程启动规则

    5、线程结束规则

    这条是关于线程等待的。它是指主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程 B 的 join() 方法实现),当子线程 B 完成后(主线程 A 中 join() 方法返回),主线程能够看到子线程的操作。当然所谓的“看到”,指的是对共享变量的操作。

    5285379818e6800c575f960f817a6d92.png

    6、中断规则

    一个线程在另一个线程上调用 interrupt ,Happens-Before 被中断线程检测到 interrupt 被调用。

    24b9a0ea38fe07e31f72777d30d44f1f.png

    mian 线程中调用了 t1 线程的 interrupt() 方法,mian 对 count 的修改对 t1 线程是可见的。

    7、终结器规则

    一个对象的构造函数执行结束 Happens-Before 它的 finalize()方法的开始。“结束”和“开始”表明在时间上,一个对象的构造函数必须在它的 finalize()方法调用时执行完。根据这条原则,可以确保在对象的 finalize 方法执行时,该对象的所有 field 字段值都是可见的。

    8、传递性规则

    这条规则是指如果 A Happens-Before B,且 B Happens-Before C,那么 A Happens- Before C。

    欢迎工作一到五年的Java工程师朋友们加入我的个人粉丝群(Java技术剑:807987079)群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

    展开全文
  • Java(计算机编程语言)Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的...

    8d1faf5ec8cf0409d97fdda42876a2b8.png

    Java

    (计算机编程语言)

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2] 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

    发展历程

    20世纪90年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。Sun公司为了抢占市场先机,在1991年成立了一个称为Green的项目小组,帕特里克、詹姆斯·高斯林、麦克·舍林丹和其他几个工程师一起组成的工作小组在加利福尼亚州门洛帕克市沙丘路的一个小工作室里面研究开发新技术,专攻计算机在家电产品上的嵌入式应用。

    由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。

    82eb6a0dfffc7740d18ab1a807b4e93f.png

    由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比C++更加简单之外,没有什么大的区别。1992年的夏天,当Oak语言开发成功后,研究者们向硬件生产商进行演示了Green操作系统、Oak的程序设计语言、类库和其硬件,以说服他们使用Oak语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。因为他们认为,在所有人对Oak语言还一无所知的情况下,就生产硬件产品的风险实在太大了,所以Oak语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下来。

    82eb6a0dfffc7740d18ab1a807b4e93f.png

    1994年6、7月间,在经历了一场历时三天的讨论之后,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器WebRunner。1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝一杯Java咖啡时无意提到的Java词语)。5月23日,Sun公司在Sun world会议上正式发布Java和HotJava浏览器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。

    82eb6a0dfffc7740d18ab1a807b4e93f.png

    1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为一种独立的开发工具。9月,约8.3万个网页应用了Java技术来制作。10月,Sun公司发布了Java平台的第一个即时(JIT)编译器。1997年2月,JDK 1.1面世,在随后的3周时间里,达到了22万次的下载量。4月2日,Java One会议召开,参会者逾一万人,创当时全球同类会议规模之纪录。9月,Java Developer Connection社区成员超过10万。1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及。1999年4月27日,HotSpot虚拟机发布。HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机。

    布,几周后其获得了Apple公司Mac OS X的工业标准的支持。2001年9月24日,J2EE1.3发布。2002年2月26日,J2SE1.4发布。自此Java的计算能力有了大幅提升,与J2SE1.3相比,其多了近62%的类和接口。在这些新特性当中,还提供了广泛的XML支持、安全套接字(Socket)支持(通过SSL与TLS协议)、全新的I/OAPI、正则表达式、日志与断言。2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0(内部版本号1.5.0),代号为“Tiger”,Tiger包含了从1996年发布1.0版本以来的最重大的更新,其中包括泛型支持、基本类型的自动装箱、改进的循环、枚举类型、格式化I/O及可变参数。2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME。2006年11月13日,Java技术的发明者Sun公司宣布,将Java技术作为免费软件对外发布。Sun公司正式发布的有关Java平台标准版的第一批源代码,以及Java迷你版的可执行源代码。从2007年3月起,全世界所有的开发人员均可对Java源代码进行修改 。2009年,甲骨文公司宣布收购Sun。2010年,Java编程语言的共同创始人之一詹姆斯·高斯林从Oracle公司辞职。2011年,甲骨文公司举行了全球性的活动,以庆祝Java7的推出,随后Java7正式发布。2014年,甲骨文公司发布了Java8正式版。

    编程开发

    编程环境

    JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境。JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一些Java工具和Java的核心类库(Java API)。不论什么Java应用服务器实质都是内置了某个版本的JDK。主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如,IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK 。另外,可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE(JAVA Runtime Environment),JRE是支持Java程序运行的标准环境 。JRE是个运行环境,JDK是个开发环境。因此写Java程序的时候需要JDK,而运行Java程序的时候就需要JRE。而JDK里面已经包含了JRE,因此只要安装了JDK,就可以编辑Java程序,也可以正常运行Java程序。但由于JDK包含了许多与运行无关的内容,占用的空间较大,因此运行普通的Java程序无须安装JDK,而只需要安装JRE即可。

    编程工具

    Eclipse:一个开放源代码的、基于Java的可扩展开发平台 。NetBeans:开放源码的Java集成开发环境,适用于各种客户机和Web应用。IntelliJ IDEA:在代码自动提示、代码分析等方面的具有很好的功能。MyEclipse:由Genuitec公司开发的一款商业化软件,是应用比较广泛的Java应用程序集成开发环境 。EditPlus:如果正确配置Java的编译器“Javac”以及解释器“Java”后,可直接使用EditPlus编译执行Java程序。

    语言特点

    1.简单性Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。2.面向对象Java是一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。例如,Java提供产生图形用户接口部件的类(java.awt包),这里awt是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(http://java.io包)和支持网络功能的类(http://java.net包)。3.分布性Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。4.编译和解释性Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。

    5.稳健性Java原来是用作编写消费类家用电子产品软件的语言,所以它是被设计成写高可靠和稳健软件的。Java消除了某些编程错误,使得用它写可靠软件相当容易。Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java要求显式的方法声明,它不支持C风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。可靠性方面最重要的增强之一是Java的存储模型。Java不支持指针,它消除重写存储和讹误数据的可能性。类似地,Java自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。Java解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。异常处理是Java中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信号。使用try/catch/finally语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。6.安全性Java的存储分配模型是它防御恶意代码的主要方法之一。Java没有指针,所以程序员不能得到隐蔽起来的内幕和伪造指针去指向存储器。更重要的是,Java编译程序不处理存储安排决策,所以程序员不能通过查看声明去猜测类的实际存储安排。编译的Java代码中的存储引用在运行时由Java解释程序决定实际存储地址。Java运行系统使用字节码验证过程来保证装载到网络上的代码不违背任何Java语言限制。这个安全机制部分包括类如何从网上装载。例如,装载的类是放在分开的名字空间而不是局部类,预防恶意的小应用程序用它自己的版本来代替标准Java类。7.可移植性Java使得语言声明不依赖于实现的方面。例如,Java显式说明每个基本数据类型的大小和它的运算行为(这些数据类型由Java语法描述)。Java环境本身对新的硬件平台和操作系统是可移植的。Java编译程序也用Java编写,而Java运行系统用ANSIC语言编写。8.高性能Java是一种先编译后解释的语言,所以它不如全编译性语言快。但是有些情况下性能是很要紧的,为了支持这些情况,Java设计者制作了“及时”编译程序,它能在运行时把Java字节码翻译成特定CPU(中央处理器)的机器代码,也就是实现全编译了。Java字节码格式设计时考虑到这些“及时”编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。9.多线程性Java是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线索的程序设计很容易。Java的lang包提供一个Thread类,它支持开始线索、运行线索、停止线索和检查线索状态的方法。Java的线索支持也包括一组同步原语。这些原语是基于监督程序和条件变量风范,由C.A.R.Haore开发的广泛使用的同步化方案。用关键词synchronized,程序员可以说明某些方法在一个类中不能并发地运行。这些方法在监督程序控制之下,确保变量维持在一个一致的状态。10.动态性Java语言设计成适应于变化的环境,它是一个动态的语言。例如,Java中的类是根据需要载入的,甚至有些是通过网络获取的。

    4b426354e980c9ce98f4cd7b6553541f.gif
    展开全文
  • 好吧 pdf走起来)Java简介 Java,是于1995年5月被推出的Java程序设计语言和Java平台的总称.Java起源于Oak,在印度一个盛产咖啡的岛-爪(zhao)哇岛被命名,是由James Gosling等几位工程师于1995年5月推出的一种可以编写跨...
  • 在AndroidN(7.0)前你对手电筒的控制也许是这样的:Camera camera = Camera.open();if(open){Parameters mParameters = camera.getParameters();mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);...
  • Java 是一门通用型编程语言,由 Sun 微系统公司(后被甲骨文收购)于 1995 年推出。尽管 Java 已经 25 岁了,但仍然“宝刀未老”。在 Stack Overflow 2019 年流行编程语言调查报告中,Java 位居第 5 位,有 41% 的受调...
  • Java已经是最受欢迎的编程语言了,在当今高速发展的信息时代,Java技术无处不在,比如计算机软件、手机Java游戏、手机软件等等。那么java具体可以做什么呢?需要用到Java的工作有哪些?今天北大青鸟重庆艾替给大家...
  • Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向...
  • C语言和JAVA语言同样是高级语言,但是还是不同的,C语言要更低级一些,对硬件控制更加直接,JAVA语言的运行需要使用JAVA虚拟机。下面分别对C语言和JAVA语言说一说。C语言C语言是我大学时的必修课,记得那时还是用...
  • Java 对程序员“掩盖”底层存储功能,这使得 Java 对程序的要求要比 C 语言对程序的要求更低一些,但这意味着你对底层代码的运行逻辑了解比较少。从软件工程的基础到探索机器人技术的未来,你很可能已经学习了 Java...
  • 同时在嵌入式开发领域,考虑到成本和功耗的原因,计算能力和内存等硬件资源很紧张,这个时候别说Java就是C++大兄弟都感到为难。此时C由于暂用资源少,运行速度快,还能方便操作硬件,是嵌入式开发的首选语言。 相信...
  • Java 对程序员“掩盖”底层存储功能,这使得 Java 对程序的要求要比 C 语言对程序的要求更低一些,但这意味着你对底层代码的运行逻辑了解比较少。从软件工程的基础到探索机器人技术的未来,你很可能已经学习了 Java...
  • JAVA、C、C++、Python这四种编程语言,前三种玩的比较多,python做为兴趣爱好或者玩脚本的时候弄过,编程语言在使用的时候主要还是适合不合适,单片机使用的场景属于功能简单,成本相对较低,现在也有高配版的单片机...
  • Java串口编程控制硬件

    千次阅读 2019-09-20 17:19:46
    还是半年前接触的JAVA串口编程控制硬件,现在项目中又即将运用到,所以特别写成博客记录,同时分享交流。 Java环境中的JDK是本身不带有串口的jar包的,需要我们自己下载然后配置到本地的JDK之中,我们采用RXTX串口...
  • 满意答案vdg917972017.10.24采纳率:52%等级:10已帮助:515人import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net....
  • 通过 JNI 在 Java 代码里面调用 C 或者 C++,就可以实现安卓应用来控制底层硬件了,比如说打开 LED,关闭 LED 的操作。
  • Java实现远程控制技术java自带的java.net.和java.awt.robot.的混合可以用于实现通过网络对另一台计算机的远程控制,其中包括控制远程计算机鼠标的动作和键盘的输入,以及实时获得远程计算机屏幕的图像。本文将用简洁...
  • 作为一位 Java 程序员,在尽情享受 Java 虚拟机带来好处的同时,我们还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉 JVM,你才能在遇到 OutOfMemory 等异常时,不会束手无策,不会...
  • AP Computer Science A (APCSA)考试,需要掌握Java编程语言。对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构。多编程零基础的高中生,在自学一段时间内,会觉得Java学习最头疼的就是复杂的语法结构,...
  • 并且保证你的机器中已经安装了Java开发包,假设Java开发包安装在了C盘的C:\jdk1.5中。 2. 使用如下命令将win32com.dll复制到C:\jdk1.5\bin中。 copy c:\commapi\win32com.dll c:\jdk1.5\bin 3.使用如下命令将comm....
  • 对于零基础想学IT的同学来讲,在咨询过程中绝大部分的老师都推荐的是Java,因为Java除了因为市场需求高、入门要求低以外,本身作为编程语言也存在着巨大的优势,Java的学习群体很广:Java是美国的大学AP计算机课程,...
  • join方法:调用join方法的线程对象强制运行,该线程强制运行期间,其他线程无法运行,必须等到该线程结束后其他线程才可以运行。...计算机硬件和操作系统也无法精确到一纳秒;Eg:package july7;clas...
  • 当开发者深陷 Java 8 版本之际,这边下一版本 Java 16 有了最新的消息,与 Java 15 一样,作为短期版本,Oracle 仅提供 6 个月的支持。根据发布计划,JDK 16 将在 12 月 10 日和 2021 年 1 月 14 进入 Rampdown 阶段...
  • ESP8266+钛极OS(TiJOS)+面包板=JAVA控制物联网硬件平台[创客版]作者:crashMaker废话必说身为一屌丝级“资深”创客,是绝对不干于“拿来主义”的,创造永无止境。。。于是笔者决定自己制作个基于ESP8266的物联网硬件...
  • java语言如何用到软件控制硬件上去

    千次阅读 2009-05-06 10:44:27
    日前公司要我做一个软件,软件要能够直接控制电灯的开和关,通过button控制,我想用JAVA语言做,但是没有思路,希望各位大哥大姐帮忙提下思路 :D :D :D ...
  • TCP软件和硬件交互网络控制-.JAVA版本,底层原理是socket传输 默认服务端端口是9000 自己配置JDK以及java环境 在bin文件夹 cmd运行 java 【文件名】【如果想要客户端连接服务端的版本,后续更新。。。】 public ...
  • 多线程学习路线、视频、笔记1-volatile关键字的字节码原语2-synchronized与volatile的硬件级实现3-无锁、偏向锁、轻量级锁、重量级锁升级过程4-内存屏障的基本概念5-使用线程池的好与不好6-为什么阿里开发手册建议...
  • ESP8266+钛极OS(TiJOS)+面包板=JAVA控制物联网硬件平台[创客版] NodeMCU刷钛极OS(TiJOS)系统固件——告别LUA,用JAVA编程。[创客版] C.开源项目 【开源项目】TiJOS I/O 工场

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,609
精华内容 643
关键字:

java控制硬件

java 订阅