刚刚接触java语言时,接触的便为一个java main方法。我们知道这样程序就可以运行了,但是程序是怎么运行起来的我们却不知道。

众所周知,当执行一个java程序时,首先会启动一个JVM虚拟机进程,当程序执行完时,JVM进程则消亡。其他导致JVM进程消亡的还有以下情况:
  1. System.exit(int)方法,执行该方法时,虚拟机腿粗好。int参数为状态码,为0时,正常退出;若不为0,则异常退出。
  2. 遇到异常或错误时。若在程序过程中遇到异常时,不作处理会一直抛出异常到main函数,若main函数也未处理,则会抛出给JVM,若JVM处理不了该异常时,则JVM崩溃。
  3. JVM所依赖的平台发生错误。
JVM主要由 类加载子系统、运行时数据区(内存空间)、执行引擎以及本地方法接口组成。运行时数据区又由 方法区、堆、java栈、PC寄存器、本地方法栈组成。
在内存空间中,方法区和堆是所有java线程共享的,而java栈、本地方法栈、PC寄存器则由每个线程私有。
在执行java程序时,在上篇博客http://blog.sina.com.cn/s/blog_ae63f79a0102vw94.html中已经讲到类加载子系统的过程。
类加载首先将.class文件从硬盘加载到内存,.class文件和JVM即为java实现一次编写,处处运行的关键。
前面说到将.class文件从硬盘加载到内存,具体加载到哪里呢,即为前述的运行时数据区的方法区
然后JVM会在堆中创建一个该类的class对象。Class对象都是JVM自己创建的,并且只有JVM才会创建class对象,所有的类对应的class对象都只存在一个,可以说是单例模式的一个典范。
 
下面开始讨论,普通通过构造函数创建对象和通过反射创建对象的区别。
newInstance和new的区别在于创建对象的方式不同。前者是使用类加载机制。在使用newInstance时,必须保证该类已经加载并且已经连接了。以上由Class.forname(String)实现。newInstance只能使用默认的无参构造函数,而new可以使用任意声明的public构造函数。
我们常见到在引用所写的java代码时,会有import,使用import关键字的java类,JVM在启动时会自动加载引用的java类。
而我们希望能够动态的加载类,那就可以使用Class.forName了。
故我们可以得到一下的结论:
newInstance: 弱类型。低效率。只能调用无参构造。
   new: 强类型。相对高效。能调用任何public构造。
newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口编程。
所以我们在写jdbc时会发现调用数据库驱动程序时,会使用Class.forName()函数了。

http://www.cnblogs.com/vikeria/p/4374973.html

从java main方法说开去(转)的更多相关文章

  1. 07 java main方法

    1.问题:Java main方法为什么是  public static void main(String[] args)??? 序号 场景 编译 运行 解释 1 public修改为private pr ...

  2. java main方法

    1.问题:Java main方法为什么是  public static void main(String[] args)??? 序号 场景 编译 运行 解释 1 public修改为private pr ...

  3. java main方法背后的故事?(转)

    jvm java 看似一种语言,实则一个巨大的体系的王国,开发这么多年了,还是没有搞懂,我以为我懂了,可是过了一段时间又忘了,所以说还是没懂 1.main方法说起 编译完我们的java文件后,需要有个 ...

  4. 为什么使用Junit Test而不用普通java main方法来完成测试?

    因为在程序里边,一个接口对应一个实现方法,而在接口中常常会定义相关的很多方法,所以在测试的时候,如果都在main方法里边进行测试,main方法就会显得臃肿,而且不便于以后其他人测试以及查看测试数据,用 ...

  5. public static void main(String[] args){} 关于Java main()方法

    是Java程序的入口方法,JVM在运行程序时,会首先查找main()方法. public是权限修饰符,表明任何类或对象都可以访问这个方法: static表明main()方法是一个静态方法,即方法中的代 ...

  6. Java main方法继承

    java中main方法是可以继承的 Test1.java package Variables; public class Test1 { public static void main(String[ ...

  7. linux shell脚本调用java main方法 代码传值

    #!/bin/bash #description: ljdjService export PRG_HOME=/ainmc/work/toptea/dataTransfer PRG_KEYWORD=pr ...

  8. linux shell脚本调用java main方法 代码

    #!/bin/sh # #该脚本为Linux下启动java程序的通用脚本.即可以作为开机自启动service脚本被调用, #也可以作为启动java程序的独立脚本来使用. # #Author: tuda ...

  9. Java基础学习总结(78)——Java main方法深入研究学习

    1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7开始就行不通了. 2.main() ...

随机推荐

  1. 驯服你的Windows Server 2003

    虽然通过一些技巧可以让Windows Server 2003更符合我们的使用习惯,但对我等菜鸟来说,操作还是有相当的难度,有没有更简单.更省事的驯服它的办法呢?有,那就是使用Windows Serve ...

  2. (C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令

    原文(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:( ...

  3. Cocos2d-x init() 和 onEnter() 区别

    在Cocos2d-x中经常碰到 init() 和 onEnter() init()和onEnter()这两个方法都是CCNode的方法. 1.二者的执行顺序是:先init() 后onEnter(). ...

  4. 使用IDENTITY列属性和Sequence对象

    使用IDENTITY列属性 1. 建立表 Sales.MyOrders USE TSQL2012; IF OBJECT_ID(N'Sales.MyOrders', N'U') IS NOT NULL ...

  5. [译]Stairway to Integration Services Level 14 - 项目转换(SSIS 2008 ~ SSIS 2012)

    介绍 本文中我们会用SSDT把第一个SSIS项目转换为 SSIS 2012, 为什么要升级到2012? 你可能想使用SSIS 2012新的特性. 又或者想使用 SSIS 2012 Catalog. 想 ...

  6. 解決 centos中-bash: vim: command not found

    用centos 的主机的時候, 用 vim 时出现 -bash: vim: command not found. 只能使用 vi. 那么如何安裝 vim 呢? 输入 rpm -qa|grep vim ...

  7. Software Version --hdu1976

    #include using namespace std; int main() { int T; cin>>T; int a1,b1,c1; int a2,b2,c2; while(T- ...

  8. Qt Creator插件工作流程代码走读

    Qt Creator有个很风骚的插件管理器PluginManager,还有个很骚包的插件说明PluginSpec.基本上,所有的Qt程序的入口都是传统的C程序一样,代码流程从main()函数开始.  ...

  9. __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )

    root@xuanfei-desktop:~/cpropram/2# cat global.h //头文件#ifndef CLOBAL_H        #define GLOBAL_H        ...

  10. 数据结构——二叉树(Binary Trees)

    非线性数据结构 二叉搜索树(Binary Search Tree) 树的密度=结点数/高度 二叉树类 #pragma once class stnode { public: int nodeValue ...