什么是真正的Java技术,本篇文章让你了解

“你学习一门技术的最佳时机是三年前,其次是如今。”这句话对于哪种行业都很适用,若是你已经学习过Java,那么恭喜你你颇有先见之明,若是你并不了解Java,这篇文章带你快速掌握Java的几个核心知识点。java

1、Java特色程序员

一、 面向对象算法

尽管受到其前辈的影响,但Java没被设计成兼容其余语言源代码的程序。这容许Java开发组自由地从零开始。这样作的一个结果是,Java语言能够更直接、更易用、更实际的接近对象。Java的对象模型既简单又容易扩展,对于简单数据类型,例如整数,它保持了高性能,但不是对象。编程

二、 解释性和高性能数组

字节码能够在提供Java虚拟机(JVM)的任何一种系统上被解释执行。早先的许多尝试解决跨平台的方案对性能要求都很高。其余解释执行的语言系统,如BASIC,Tcl,PERL都有没法克服的性能缺陷。然而,Java却能够在很是低档的CPU上顺利运行。前面已解释过,Java确实是一种解释性语言,Java的字节码通过仔细设计,于是很容易便能使用JIT编译技术将字节码直接转换成高性能的本机代码。Java运行时系统在提供这个特性的同时仍具备平台独立性,于是“高效且跨平台”对Java来讲再也不矛盾。安全

三、 动态数据结构

Java程序带有多种的运行时类型信息,用于在运行时校验和解决对象访问问题。这使得在一种安全、有效的方式下动态地链接代码成为可能,对小应用程序环境的健壮性也十分重要,由于在运行时系统中,字节码内的小段程序能够动态地被更新。jvm

2、面向对象的编程编程语言

2.1 抽象函数

面向对象编程的一个实质性的要素是抽象。人们经过抽象(abstraction)处理复杂性。

例如,人们不会把一辆汽车想象成由几万个互相独立的部分所组成的一套装置,而是把汽车想成一个具备本身独特行为的对象。这种抽象令人们能够很容易地将一辆汽车开到杂货店,而不会因组成汽车各部分零件过于复杂而不知所措。传统的面向过程程序的数据通过抽象可用若干个组成对象表示,程序中的过程步骤可当作是在这些对象之间进行消息收集。这样,每个对象都有它本身的独特行为特征。你能够把这些对象看成具体的实体,让它们对告诉它们作什么事的消息做出反应。这是面向对象编程的本质。面向对象的概念是Java 的核心。

2.2面向对象编程的3个原则

全部面向对象的编程语言都提供帮助你实现面向对象模型的机制,这些机制是封装,继承及多态性。如今让咱们来看一下它们的概念。

封装

封装(Encapsulation)是将代码及其处理的数据绑定在一块儿的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。理解封装性的一个方法就是把它想成一个黑匣子,它能够阻止在外部定义的代码随意访问内部代码和数据。对黑匣子内代码和数据的访问经过一个适当定义的接口严格控制。

Java封装的基本单元是类。尽管类将在之后章节详细介绍。如今仍有必要对它做一下简单的讨论。类是一种逻辑结构,而对象是真正存在的物理实体。若是你对C/C++熟悉,能够这样理解:Java程序员所称的方法,就是C/C++程序员所称的函数(function)。在彻底用Java编写的程序中,方法定义如何使用成员变量。这意味着一个类的行为和接口是经过方法来定义的,类这些方法对它的实例数据进行操做。

继承

继承(Inheritance)是一个对象得到另外一个对象的属性的过程。继承很重要,由于它支持了按层分类的概念。使用了继承,一个对象就只需定义使它在所属类中独一无二的属性便可,由于它能够从它的父类那儿继承全部的通用属性。

继承性与封装性相互做用。若是一个给定的类封装了一些属性,那么它的任何子类将具备一样的属性,并且还添加了子类本身特有的属性。这是面向对象的程序在复杂性上呈线性而非几何性增加的一个关键概念。新的子类继承它的全部祖先的全部属性。它不与系统中其他的多数代码产生没法预料的相互做用。

多态性

多态性是容许一个接口被多个同类动做使用的特性,具体使用哪一个动做与应用场合有关,下面咱们以一个后进先出型堆栈为例进行说明。假设你有一个程序,须要3种不一样类型的堆栈。一个堆栈用于整数值,一个用于浮点数值,一个用于字符。尽管堆栈中存储的数据类型不一样,但实现每一个栈的算法是同样的。若是用一种非面向对象的语言,你就要建立3个不一样的堆栈程序,每一个程序一个名字。可是,若是使用Java,因为它具备多态性,你就能够建立一个通用的堆栈程序集,它们共享相同的名称。多态性的概念常常被说成是“一个接口,多种方法”。这意味着能够为一组相关的动做设计一个通用的接口。多态性容许同一个接口被必于同一类的多个动做使用,这样就下降了程序的复杂性。选择应用于每一种情形的特定的动做(specific action)(即方法)是编译器的任务,程序员无需手工进行选择。你只需记住而且使用通用接口便可。

3、 hashmap hashtable

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。

HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value均可觉得null。此外,HashMap中的映射不是有序的。HashMap的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量是哈希表中桶的数量,初始容量 只是哈希表在建立时的容量。加载因子 是哈希表在其容量自动增长以前能够达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操做(即重建内部数据结构),从而哈希表将具备大约两倍的桶数。

四. jvm 内存模型

让你真正了解Java(纯干货)

让你真正了解Java(纯干货)

程序计数器

每一个线程有要有一个独立的程序计数器,记录下一条要运行的指令。线程私有的内存区域。若是执行的是JAVA方法,计数器记录正在执行的java字节码地址,若是执行的是native方法,则计数器为空。

虚拟机栈

线程私有的,与线程在同一时间建立。管理JAVA方法执行的内存模型。

本地方法区

和虚拟机栈功能类似,但管理的不是JAVA方法,是本地方法

方法区

线程共享的,用于存放被虚拟机加载的类的元数据信息:如常量、静态变量、即时编译器编译后的代码。也称为永久代。

JAVA 堆

线程共享的,存放全部对象实例和数组。垃圾回收的主要区域。能够分为新生代和老年代(tenured)。

5、 运行时类型信息(RTTI + 反射)

概念—RTTI:运行时类型信息使得你能够在程序运行时发现和使用类型信息。

使用方式:Java是如何让咱们在运行时识别对象和类的信息的,主要有两种方式(还有辅助的第三种方式,见下描述):

一种是“传统的”RTTI,它假定咱们在编译时已经知道了全部的类型,好比Shape s = (Shape)s1;另外一种是“反射”机制,它运行咱们在运行时发现和使用类的信息,即便用Class.forName()。其实还有第三种形式,就是关键字instanceof,它返回一个bool值,它保持了类型的概念,它指的是“你是这个类吗?或者你是这个类的派生类吗?”。而若是用==或equals比较实际的Class对象,就没有考虑继承—它或者是这个确切的类型,或者不是。

工做原理

要理解RTTI在Java中的工做原理,首先必须知道类型信息在运行时是如何表示的,这项工做是由称为Class对象的特殊对象完成的,它包含了与类有关的信息。Java送Class对象来执行其RTTI,使用类加载器的子系统实现。

不管什么时候,只要你想在运行时使用类型信息,就必须首先得到对恰当的Class对象的引用

反射与RTTI的区别

RTTI与反射之间真正的区别只在于:对RTTI来讲,编译器在编译时打开和检查.class文件(也就是能够用普通方法调用对象的全部方法);而对于反射机制来讲,.class文件在编译时是不可获取的,因此是在运行时打开和检查.class文件。

六. 即时编译器技术 — JIT

Java虚拟机中有许多附加技术用以提高速度,尤为是与加载器操做相关的,被称为“即时”(Just-In-Time,JIT)编译器的技术。这种技术能够把程序所有或部分翻译成本地机器码(这原本是JVM的工做),程序运行速度所以得以提高。当须要装载某个类时,编译器会先找到其.class文件,而后将该类的字节码装入内存。此时,有两种方案可供选择:

(1)一种就是让即时编译器编译全部代码。

(2)另外一种作法称为惰性评估(lazy evaluation),意思是即时编译器只在必要的时候才编译代码,这样,从不会被执行的代码也许就压根不会被JIT所编译。

7、 final关键字

对final关键字的误解

当final修饰的是基本数据类型时,它指的是数值恒定不变(就是编译期常量,若是是static final修饰,则强调只有一份),而对对象引用而不是基本类型运用final时,其含义会有一点使人迷惑,由于用于对象引用时,final使引用恒定不变,一旦引用被初始化指向一个对象,就没法再把它指向另外一个对象。然而,对象其自身倒是能够被修改的,Java并未提供使任何对象恒定不变的途径(但能够本身编写类以取得使对象恒定不变的效果),这一限制一样适用数组,它也是对象。

以上是咱们在学习Java时须要掌握的基本点和一些关键的重难点。了解他们对咱们学习Java很重要

相关文章
相关标签/搜索