在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode)(class文件的内容),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。【From CNBlog's lovebeauty】

编译器(高级语言.java To 字节码.class)------->【虚拟机(解释执行.class字节码文件,送达解释器)】------->解释器(翻译为机器码,面向特定系统的特定机器而运行)   即 .java--.class--机器码

特性:
  1.跨平台(可移植,平台无关性)
  2.安全性(参考文献:
http://www.bubuko.com/infodetail-187060.html

  3. 面向对象特性
       3.1封装:在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sleep()等行为,我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性;
       3.2继承:继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体;
       3.3多态:多态就是通过传递给父类对象引用不同的子类对象从而表现出不同的行为
       3.4抽象:抽象就是将一类实体的共同特性抽象出来,封装在一个抽象类中,所以抽象在面向对象语言是由抽象类来体现的。比如鸟就是一个抽象实体,因为抽象实体并不是一个真正的对象,它的属性还不能完全描述一个对象,所以在语言中体现为抽象类不能实例化
  4.垃圾自动回收机制
  5.健壮性:
         5.1 异常处理机制
         5.2 垃圾自动回收机制与内存管理
  6.简单性:Eg.取消了指针,取消了goto .etc 
  7.网络技能
  8.多线程
      
学习重点:

    Java代码编译和执行的整个过程
    JVM内存管理及垃圾回收机制
 

个人理解:
   .Java File ----JVM执行完后输出的.Class File  可以视为 编译 
 

   jvm.Class File【解释器】----机器码  可以视为 解释   
 

[Process]
  

A.编译器(Javac,Java Compiler):将.java文件编译成.class文件
    A.1 系统平台无关
    A.2 面向虚拟机编译
    A.3 Questions:
              Q:C/C++与Java编译器的区别?(将有助于理解Java的跨平台特性)
              A:参考文献:https://openhome.cc/Gossip/JavaEssence/WhyJVM.html

 
B.虚拟机(Java virtual Machine
) :通过在实际的计算机上仿真模拟各种计算机功能来实现的。
    B.1 系统平台相关

C.类加载器(Java ClassLoader):类加载器把一个类装入JVM虚拟机需要经过三步骤:
              1. 装载(Load):查找和导入.class文件             
              2.链接(Link):检查装入.class文件的正确性,然后JVM虚拟机为变量分配内存,设置默认值

                  2.1校验
                  2.2准备
                  2.3解析        
              3.初始化(Initialize):把符号引用变成直接引用
       

           4.Questions:
               4.1
那为什么我要有验证这一步骤呢?首先如果由编译器生成的class文件,它肯定是符合JVM字节码格式的,但是万一有高手自己写一个class文件,让JVM加载并运行,用于恶意用途,就不妙了,因此这个class文件要先过验证这一关,不符合的话不会让它继续执行的,也是为了安全考虑吧。
               4.2在一个类加载器中一个类能初始化几次?Only once.
               4.3类的加载?
                   JVM的类加载是通过ClassLoader及其子类来完成的。
                   4.3.1 类的加载的最终产品是位于堆区中的Class对象

                   4.3.2 Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口 
                   4.3.4 加载类的方式有以下几种:
                           1)从本地系统直接加载
                           2)通过网络下载.class文件
                           3)从zip,jar等归档文件中加载.class文件
                           4)从专有数据库中提取.class文件
                           5)将Java源文件动态编译为.class文件(服务器)

[类的加载:自顶向下]
[参考文献:http://blog.csdn.net/bingduanlbd/article/details/8363734]  

D.类的初始化

    类什么时候才被初始化:
1)创建类的实例,也就是new一个对象(初始化后,才为变量附值(默认值或指定值))
2)访问某个类或接口的静态变量,或者对该静态变量赋值
3)调用类的静态方法
4)反射(Class.forName("com.lyj.load"))
5)初始化一个类的子类(会首先初始化子类的父类)
6)JVM启动时标明的启动类,即文件名和类名相同的那个类
         只有这6中情况才会导致类的类的初始化。
     类的初始化步骤:
         1)如果这个类还没有被加载和链接,那先进行加载和链接
         2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
         3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。
7)Java 中所有定义的基本类型或对象都必须初始化才能输出值
     Eg:
     import java.io.*;

     import java.util.*;
     public class foo{
        public static void main (String[] args){
           String s;    
           System.out.println("s=" + s);
        }
     }

A. 代码得到编译,并输出 “s=”
B. 代码得到编译,并输出 “s=null”
C. 由于 String s 没有初始化,代码不能编译通过
D. 代码得到编译,但捕获到 NullPointException异常

答案:C

解析:开始以为会输出 null 什么的,运行后才发现 Java 中所有定义的基本类型或对象都必须初始化才能输出值。     
          
E..class文件
      0.含义:class为后缀名的Java虚拟机可装载的文件。这个特定格式就是指JVM能够识别、能够装载的格式。
                因:
JVM在装载class文件时,要进行class文件验证,以保证装载的class文件内容符合正确的内部结构。 
      1.本质:指符合特定格式的字节流组成的二进制文件
      2.此类文件均由八位字节流组成,所有的16位,32位,64位分别通过读入2个,4个,8个字节来构造(按照高位字节在前---低地址的Big-endian顺序)。
      3.每个class文件包含且仅包含一个Java类型(类or接口)
      4.参考文献:
            
《The JavaTM Virtual Machine Specification》
            《Inside the Java Virtual Machine》(Second Edtion)  
             http://wenku.baidu.com/view/481b5b024b73f242336c5f95.html

Java SE之Java工作原理的更多相关文章

  1. Java类加载器的工作原理

    Java类加载器的作用就是在运行时加载类.Java类加载器基于三个机制:委托.可见性和单一性.委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它. ...

  2. Java 详解 JVM 工作原理和流程

    Java 详解 JVM 工作原理和流程 作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java ...

  3. Java 连接池的工作原理(转)

    原文:Java 连接池的工作原理 什么是连接? 连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“. 有人接受这种说法,却不知道它的真正含义.因此,下面我将解释 ...

  4. Java SE、Java EE、Java ME

    Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.J ...

  5. Java SE、Java EE和Java ME有什么区别?

    Java现在已不仅仅是一种语言,从广义上说,它代表了一个技术体系.该体系根据应用方向的不同主要分为Java SE.Java EE和Java ME的3个部分. 1998年12月份Sun公司公布的Java ...

  6. java的几个版本以及jre,jdk等概念——【转载】JDK、Java SE、Java EE、Java ME我该选

    我们平时使用的一些软件,有一部分需要Java环境的支持,但是SUN那么多的产品,让人眼花缭乱的版本号,前看后看都差不多的缩写,让我们选择起来的时候常常望而却步,只好跟着感觉走.所以下面我要介绍的就是那 ...

  7. 浅谈Java SE、Java EE、Java ME三者的区别

    本文把JAVA SE.JAVA EE.JAVA ME拿来做下区别,同时也分享一下作者的一些成果.目前的Java平台根据软件开发人员.服务提供商和设备生产商可以针对特定的市场可以分为三个版本JAVA S ...

  8. Java SE、Java EE、Java ME 三者区别

    现在一个个来分析 1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 ...

  9. Java、Java SE、Java Web和Java EE的区别

    刚接触Java对这些概念上的东西有点模糊,查了很多资料,想把它分享出来,要是哪里不对请大家指正(^_^) 1.Java 毫无疑问这就是门语言和C.C++.C#一样没什么好说的. 2.Java SE和J ...

  10. 24. Java SE 、 Java EE 、JavaME 、 JavaWeb 直接的区别和联系

    这个是在别人博客抄的,并不是本人撰写 Java是一门编程语言.Java分为三大版本,SE即标准版,包含了Java核心类库,主要用来开发桌面应用:EE即企业版,包含SE,又有扩展部分(Servlet,J ...

随机推荐

  1. Test Scenarios for image upload functionality (also applicable for other file upload functionality)

    1 check for uploaded image path2 check image upload and change functionality3 check image upload fun ...

  2. OpenGL 使用 PBO 高速复制屏幕图像到内存或者纹理中

    如果你想给游戏做个截图功能,或者想把屏幕图像弄成一个纹理,你就非常需要 PBO 了 通常情况下,你想把屏幕图像的像素数据读到内存需要用 glReadPixels 然后 pixels 参数传进去一块内存 ...

  3. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  4. BZOJ1774[USACO 2009 Dec Gold 2.Cow Toll Paths]——floyd

    题目描述 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费 ...

  5. BZOJ4822[Cqoi2017]老C的任务——树状数组(二维数点)

    题目描述 老 C 是个程序员.     最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松 地完成了系统的大部分功能,并把其中一个功能交给你来实 ...

  6. BZOJ4785 ZJOI2017树状数组(概率+二维线段树)

    可以发现这个写挂的树状数组求的是后缀和.find(r)-find(l-1)在模2意义下实际上查询的是l-1~r-1的和,而本来要查询的是l~r的和.也就是说,若结果正确,则a[l-1]=a[r](mo ...

  7. html页面出现&#65279,影响布局

    这个问题只会在chrome和edge浏览器出现.由于该HTML页面是由PHP解析模版生成的. UTF-8 + BOM编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件, ...

  8. python基础成长之路四-基础数据类型方法

    1,程序开发三大流程: 顺序--从上向下,顺序执行代码 分支--根据条件判断,决定执行代码的分支 循环--让特定的代码重复执行 2,whlie循环语句: Break 某一条件满足时,退出循环,不在执行 ...

  9. Bash Game 巴什博弈

    巴什博弈(Bash Game,同余理论):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先 ...

  10. MT【35】用复数得到的两组恒等式

    特别的,当$r\rightarrow1^{-}$时有以下两个恒等式: 第二个恒等式有关的自主招生试题参考博文MT[31]傅里叶级数为背景的三角求和 评:利用两种展开形式得到一些恒等式是复数里经常出现的 ...