Java语言特性和技术特点探究

2.4.3  Non-JVM

一些平台提供了对Java的直接硬件支持;有一些微控制器可以在硬件中运行Java字节码而不是软件Java虚拟机,而一些基于ARM的处理器可以通过其Jazelle选项对执行Java字节码提供硬件支持,值得注意的是在目前的ARM实现中,这种支持大多已经被放弃。

2.4.4  自动内存管理

Java使用自动垃圾回收器来管理对象生命周期中的内存。程序员决定对象何时创建,一旦对象不再使用,Java运行时负责回收内存。一旦没有对象的引用残留下来,无法到达的内存就会在垃圾回收时被垃圾回收器自动释放。如果程序员的代码中保留了一个不再需要的对象引用,那么类似于内存泄露的事情仍然可能发生,通常情况下,当不再需要的对象被存储在仍在使用的容器中时,就会出现类似于内存泄露的情况。如果调用了一个不存在的对象的方法,就会抛出一个空指针异常。

Java的自动内存管理模型背后的一个想法是,程序员可以省去手动管理内存的负担。在某些语言中,创建对象的内存是在堆上隐式分配,或者显式分配,然后在堆上释放。在后一种情况下,管理内存的责任在于程序员。如果程序不对对象进行释放,就会发生内存泄漏。如果程序试图访问或释放已经被释放的内存,其结果是无意义的而且难以预测的,程序很可能会变得不稳定甚至崩溃。这种情况可以通过使用智能指针来部分补救,但这些都会增加开销和复杂度。

注意,垃圾回收并不能防止逻辑内存泄漏,即那些内存仍被引用但从未使用的内存泄漏。

垃圾回收可能会在任何时候发生。理想情况下,它将在程序空闲时发生。如果堆上没有足够的空闲内存来分配一个新的对象,它就会被触发,这可能会导致程序瞬间停滞。在Java中不支持显式内存管理。

Java不支持C/C++风格的指针算术,比如对象地址可通过加减偏移量来进行算术操作。这使得垃圾回收器可以重新定位引用的对象,并也确保了类型安全和安全性。

就像C++和其他一些面向对象语言一样,Java的原始数据类型的变量要么直接存储在字段中(对于对象而言),要么存储在堆中(对于方法而言),而不是像非原始数据类型那样通常存储在堆中。这是Java的设计者出于性能方面的考虑有意识的决定。

Java包含多种类型的垃圾回收器。默认情况下,HotSpot使用的是并行清空垃圾回收器。然而,也有其他几种垃圾回收器可以用来管理堆。对于Java中90%的应用来说,并发标记扫描(CMS)垃圾回收器已经足够了。Oracle的目标是用Garbag-First Collector(G1)代替CMS。

解决了内存管理问题后,并没有减轻程序员正确处理其他资源的负担,比如网络或数据库连接、文件句柄等,尤其是在出现异常时的处理。有个矛盾的现象是,垃圾回收器的存在,在类中使用显式的析构函数的必要性淡化了,这一点进而增加了这些其他资源的管理难度。

2.5 语法

Java的语法主要是受C++的影响。与C++结合了结构化、泛型和面向对象编程的语法不同,Java几乎完全是作为一种面向对象的语言来构建的,所有的代码都写在类内,除了原始数据类型(即整数、浮点数字、布尔值和字符)之外,每一个数据项都是一个对象。

Java重用了C++的一些流行的功能, 如printf方法。

与C++不同的是,Java不支持操作符重载,也不支持类的多重继承,但支持接口多重继承。

Java使用的注释样式与C++的注释样式类似。有三种不同的注释风格:用两个斜线标记的 单行注释风格(//),用/*开头*/结尾的多行注释风格,用/**开头*/结尾的Javadoc注释风格。Javadoc注释样式允许用户运行Javadoc可执行文件来创建程序的文档,并且可以被一些集成开发环境(IDE)(如Eclipse)读取,允许开发人员在IDE中访问文档。

2.5.1  Hello World 例子

传统的Hello world程序可以用Java写成:

public class HelloWorldApp {

public static void main(String[] args) {

System.out.println(“Hello World!”);

}

}

源文件必须以其包含的公共类命名,并使用后缀.java,例如,HelloWorldApp.java。首先必须使用Java编译器将其编译成字节码,生成一个后缀为.class的文件(本例中为HelloWorldApp.class)。只有这样,它才能被执行或启动。Java源文件可能只包含一个公共类,但也可以包含多个带有非公共访问修饰符的类和任意数量的公共内部类。当源文件包含多个类时,需要将一个类(由class关键字引入)为public(前面有public关键字),并以该public类名命名源文件。

没有声明为public的类可以存储在任何.java文件中。编译器将为源文件中定义的每个类生成一个类文件。类文件的名称是类的名称,并附加了.class。对于类文件的生成,匿名类被视为其名称是由类的名称、一个$和一个整数组成。

关键词public表示一个方法可以被其他类的代码调用,或者一个类可以被类层次结构之外的类使用。类的层次结构与.java文件所在的目录名称有关。这就是所谓的访问级修饰符。其他的访问级修饰符包括关键字private和protected。

方法前面的关键字static表示静态方法,它只与类相关联,而不与该类的任何特定实例相关联。只有静态方法才能在没有引用对象的情况下被调用。静态方法不能访问任何非静态的类成员。没有被指定为静态的方法是实例方法,需要类的特定实例才能操作。

关键字 void 表示主方法不向调用者返回任何值。如果Java程序要以错误代码退出,必须明确地调用System.exit()。

方法名main不是Java语言中的关键字。它仅仅是Java启动器调用的方法名称,用于向程序传递控制权。在托管环境中运行的Java类(如applet和Enterprise JavaBeans)不使用也不需要main()方法。一个Java程序可能包含多个具有main方法的类,这意味着需要明确告诉VM从哪个类启动。

main方法必须接受一个String对象的数组参数。按照惯例,它被引用为args,尽管可以使用任何其他合法的标识符名称。从Java 5开始,main方法也可以使用变量参数,形式为public static void main(String…args),允许用任意数量的String参数来调用main方法。这种交替声明的效果在语义上是相同的(对args参数来说,它仍然是一个String对象的数组)。

Java启动器通过加载一个给定的类(在命令行中指定或作为JAR中的属性)并启动其公共静态void main(String[])方法来启动Java程序。单机程序必须明确声明这个方法。     String[] args参数是一个String对象的数组,包含了传递给类的所有参数。给main方法的参数通常是通过命令行传递的。

打印是Java标准库的一部分。System类定义了一个叫out的公共静态字段。out对象是PrintStream类的一个实例,它提供了许多将数据打印成标准的out的方法,包括println(String),它会在传递的字符串上附加一个新行。

字符串 "Hello World!"会被编译器自动转换为String对象。

2.5.2  带方法的例子

package fibsandlies;

import java.util.Map;

import java.util.HashMap;

public class FibCalculator extends Fibonacci implements Calculator {

private static Map<Integer, Integer> memoized = new HashMap<>();

public static void main(String[] args) {

memoized.put(1, 1);

memoized.put(2, 1);

System.out.println(fibonacci(12));

}

public static int fibonacci(int fibIndex) {

if (memoized.containsKey(fibIndex)) {

return memoized.get(fibIndex);

} else {

int answer = fibonacci(fibIndex - 1) + fibonacci(fibIndex - 2);

memoized.put(fibIndex, answer);

return answer;

}

}

}

2.5.3  特殊类

2.5.3.1 Applet

Java小程序是嵌入到其他应用程序中的程序,通常是在Web浏览器中显示的Web页面中。自2017年Java 8以来,Java applet API已经被废弃了。

2.5.3.2 Servlet

Java servlet技术为Web开发人员提供了一个简单、一致的机制,用于扩展Web服务器的功能和访问现有业务系统。Servlet是服务器端Java EE组件,它对来自客户端的请求(通常是HTTP请求)产生响应(通常是HTML页面)。

Java servlet API在一定程度上已经被两种标准的Java Web 服务技术所取代:

·         用于RESTful Web服务的Java API (JAX-RS 2.0),适用于AJAX、JSON和REST服务,以及

·         Java API for XML Web Services (JAX-WS) , 适用于SOAP Web Services。

2.5.3.3 JavaServer Pages

JavaServer Pages (JSP)是服务器端Java EE组件,它可以生成通常是HTML页面的响应,响应源自于来自客户端的HTTP请求。JSPs通过使用特殊的分隔符<%和%>将Java代码嵌入到HTML页面中。JSP被编译成一个Java servlet,之后用生成的servlet来创建响应。

2.5.3.4 Swing 应用

Swing是一个用于Java SE平台的图形用户界面库。它可以通过Swing的可插拔的外观和响应系统来指定不同的外观和响应。Windows、GTK+和Motif的克隆版由Sun公司提供。苹果公司也为macOS提供了Aqua外观。之前的这些外观和响应的实现被认为是有缺陷的,而Java SE 6中的Swing通过使用底层平台的原生GUI小部件绘制例程解决了这个问题。

2.5.3.5 JavaFX 应用

JavaFX是一个软件平台,用于创建和交付桌面应用程序,以及可以在各种设备上运行丰富 的互联网应用程序(RIA)。JavaFX旨在取代Swing作为Java SE的标准GUI库,但在可预见的未来,这两个库都将被包含在内。JavaFX支持Microsoft Windows、Linux和macOS上的桌面电脑和网络浏览器。JavaFX不支持原生操作系统的外观和响应。

2.5.3.6 泛型

2004年,作为J2SE 5.0的一部分,在Java语言中加入了泛型。在引入泛型之前,每个变量声明必须是特定类型的。例如,对于容器类来说,这就是一个问题,因为没有简单的方法来创建一个只接受特定类型的对象容器。要么容器对类或接口的所有子类型(通常是Object)进行操作,要么必须为每个包含的类创建不同的容器类。

泛型允许在编译时进行类型检查,而不需要创建许多容器类,每个容器类包含几乎相同的代码。这除了可以让代码更高效外,还可以通过发布编译时错误来防止某些运行时异常的发生。如果Java能够阻止所有的运行时类型错误(ClassCastExceptions)的发生,那么它就是类型安全的。

2016年,Java的类型系统被证明不健全的。

2.5.3.7 批评

针对Java的批评意见包括:属性的实现、速度、 对无符号数的处理、浮点算术的实现、 以及Java虚拟机的主要实现(HotSpot)的安全漏洞。

2.5.3.8 类库

Java类库是标准库,是为支持Java中的应用程序开发而开发的。它由Oracle通过Java社区进程计划与他人合作控制,参与这一进程的公司或个人可以影响API的设计和开发。这个过程在2010年代曾引起了争议。该类库包含的功能有:

·         核心库包括:

o   IO/NIO

o   Networking

o   Reflection

o   Concurrency

o   Generics

o   Scripting/Compiler

o   功能性编程(Lambda、流媒体)

o   数据结构的集合库,如列表、字典、树、集、队列和双端队列或堆栈等

o   XML处理(解析、转换、验证)库

o   安全性

o   国际化和本地化图书馆

·         集成库,它允许应用程序编写者与外部系统进行通信。这些库包括:

o   用于数据库访问的Java数据库连接(JDBC)API

o   用于查询和发现的Java命名和目录接口(JNDI)

o   用于分布式应用开发的RMI和CORBA

o   用于管理和监测应用程序的JMX

·         用户界面库,其中包括:

o   (重量级的或原生的)抽象窗口工具包(AWT),它提供了GUI组件、布局这些组件的方法和处理这些组件的事件的方法。

o   (轻量级)Swing库,它是建立在AWT基础上,但提供了AWT小部件的(非原生)实现。

o   用于音频采集、处理和播放的API

o   JavaFX

·         Java虚拟机的平台依赖性实现,它是执行Java库和第三方应用程序字节码的手段。

·         插件,使小程序可以在网页浏览器中运行。

·         Java Web Start,使Java应用程序能够有效地在互联网上向终端用户分发。

·         许可证和文档

2.5.4  文档

Javadoc是一个全面的文档系统,由Sun Microsystems公司创建,很多Java开发人员都在使用。它为开发人员提供了一个有组织的系统来记录他们的代码。Javadoc注释的开头有一个额外的星号,也就是说,分界符是/**和*/,而Java中正常的多行注释是用分界符/*和*/来设置的。

2.5.5  Java实现

在2010年1月27日收购Sun Microsystems公司后,甲骨文公司是目前Java SE平台正式实现的所有者。这个实现是基于Sun公司对Java的原始实现。甲骨文的实现适用于Microsoft Windows(仍然适用于XP,而目前官方只支持晚期版本)、macOS、Linux和Solaris。由于Java缺乏被Ecma International、ISO/IEC、ANSI或其他第三方标准组织认可的正式标准化,因此Oracle的实现是事实上的标准。

Oracle的实现被打包成两个不同的发行版。Java Runtime Environment (JRE),它包含了Java SE平台上运行Java程序所需的部分内容,面向最终用户;Java Development Kit (JDK),面向软件开发人员,包括Java编译器、Javadoc、Jar和调试器等开发工具。Oracle还发布了GraalVM,这是一个高性能的Java动态编译器和解释器。

OpenJDK是另一个值得注意的Java SE实现,它是由GNU GPL授权的。这个实现是从Sun开始在GPL下发布Java源代码开始的。从Java SE 7开始,OpenJDK就是官方的Java参考实现。

Java的目标是使所有的Java实现都兼容。从历史上看,Sun公司在使用Java品牌的商标许可中坚持要求所有的实现都要兼容。在Sun公司发现微软的实现不支持RMI或JNI,并添加了自己的平台特定功能后,与微软发生了法律纠纷。Sun在1997年起诉,并在2001年赢得了2000万美元的和解,以及法院命令强制执行Sun公司的许可条款。

独立于平台的Java对于Java EE来说是必不可少的,要认证一个实现,还需要更严格的验证。这种环境使得可移植的服务器端应用得以实现。

2.5.6  在Java平台之外的使用

Java编程语言需要有一个软件平台才能执行编译后的程序。

甲骨文公司提供了Java平台,用于Java程序的运行。Android SDK是一个替代软件平台,主要用于开发自有GUI系统的Android应用程序。

2.5.6.1 Android

Java语言是开放源码移动操作系统Android的一个关键支柱。虽然基于Linux内核构建的Android主要是用C语言编写的,但Android SDK使用Java语言作为Android应用程序的基础,但并没有使用其标准的GUI、SE、ME或其他既定的Java标准,Android SDK支持的字节码语言与Java字节码不兼容,运行在自己的虚拟机上,针对智能手机和平板电脑等低内存设备进行了优化。根据Android版本的不同,字节码要么由Dalvik虚拟机解释,要么由Android Runtime编译成原生代码。

Android并没有提供完整的Java SE标准库,尽管Android SDK中确实包含了一个独立的Java SE标准库的大部分子集的实现。它支持Java 6和一些Java 7功能,提供了与标准库(Apache Harmony)兼容的实现。

2.5.6.2 争论

最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

面试经验技巧篇
  • 经验技巧1 如何巧妙地回答面试官的问题
  • 经验技巧2 如何回答技术性的问题
  • 经验技巧3 如何回答非技术性问题
  • 经验技巧4 如何回答快速估算类问题
  • 经验技巧5 如何回答算法设计问题
  • 经验技巧6 如何回答系统设计题
  • 经验技巧7 如何解决求职中的时间冲突问题
  • 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
  • 经验技巧9 在被企业拒绝后是否可以再申请
  • 经验技巧10 如何应对自己不会回答的问题
  • 经验技巧11 如何应对面试官的“激将法”语言
  • 经验技巧12 如何处理与面试官持不同观点这个问题
  • 经验技巧13 什么是职场暗语

面试真题篇
  • 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
  • 真题详解2 某知名社交平台软件工程师笔试题
  • 真题详解3 某知名安全软件服务提供商软件工程师笔试题
  • 真题详解4 某知名互联网金融企业软件工程师笔试题
  • 真题详解5 某知名搜索引擎提供商软件工程师笔试题
  • 真题详解6 某初创公司软件工程师笔试题
  • 真题详解7 某知名游戏软件开发公司软件工程师笔试题
  • 真题详解8 某知名电子商务公司软件工程师笔试题
  • 真题详解9 某顶级生活消费类网站软件工程师笔试题
  • 真题详解10 某知名门户网站软件工程师笔试题
  • 真题详解11 某知名互联网金融企业软件工程师笔试题
  • 真题详解12 国内某知名网络设备提供商软件工程师笔试题
  • 真题详解13 国内某顶级手机制造商软件工程师笔试题
  • 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
  • 真题详解15 某著名社交类上市公司软件工程师笔试题
  • 真题详解16 某知名互联网公司软件工程师笔试题
  • 真题详解17 某知名网络安全公司校园招聘技术类笔试题
  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

资料整理不易,点个关注再走吧
详解3 某知名安全软件服务提供商软件工程师笔试题

  • 真题详解4 某知名互联网金融企业软件工程师笔试题
  • 真题详解5 某知名搜索引擎提供商软件工程师笔试题
  • 真题详解6 某初创公司软件工程师笔试题
  • 真题详解7 某知名游戏软件开发公司软件工程师笔试题
  • 真题详解8 某知名电子商务公司软件工程师笔试题
  • 真题详解9 某顶级生活消费类网站软件工程师笔试题
  • 真题详解10 某知名门户网站软件工程师笔试题
  • 真题详解11 某知名互联网金融企业软件工程师笔试题
  • 真题详解12 国内某知名网络设备提供商软件工程师笔试题
  • 真题详解13 国内某顶级手机制造商软件工程师笔试题
  • 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
  • 真题详解15 某著名社交类上市公司软件工程师笔试题
  • 真题详解16 某知名互联网公司软件工程师笔试题
  • 真题详解17 某知名网络安全公司校园招聘技术类笔试题
  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

[外链图片转存中…(img-yoC2q033-1721142820671)]

资料整理不易,点个关注再走吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值