电脑语言发展:
第一代:机器语言-》第二代:汇编语言-》第三代:高级语言
汇编语言:结构不好,出来很多高级语言(面向对象、面向过程(B->C语言(贝尔)->C++))
高级语言:fortran(IBM); C#:小型项目;
JAVA特性:一次编写,各处运行。(完全面向对象)
一、 概述
a) The Source for JAVATM technology: www.sun.com
b) 过程中一定要查java api文档。
c) 诞生于1991,sun公司,原名Oak(橡树)。
d) 应用领域
1>*企业级应用:地图,电力系统,华为(协议封装(好维护)),大型ERP系统后台。
2>大型应用服务器:oracle, application,server, IBM webspere, bea weblogic.
3>无线领域:WAP CATE
4>嵌入式领域:手机游戏,JAVA芯片
5>JAVA图形:CIS平台客户端
二、 优点
1. 简单:
风格类似c++;摒弃了C++中容易引发程序错误的地方。
2.面向对象:
支持静态和动态风格的代码继承及重用
3. 健壮(用户不管怎么输入都不会出现异常)
4. 多线程(线程调动机制不一样,产生的结果不定,控制问题)*(线程安全问题,悲观锁,乐观锁)
5. 结构中立跨平台(java核心优势)
6. 安全
7. **一次编写,到处运行**
克服c的问题,GC垃圾回收改善内存泄漏。单一继承。指针问题。
缺点:效率低。内存耗量大(硬件要求高)。
三、JAVA应用程序运行机制
1.计算机的高级编程语言类型
1>编译型:C语言(效率高,一次性把源程序编译成机器语言直接执行,结构化语言,需求变化不大,底层变化不大)
2>解释型:Basic语言
2.JAVA是两种语言的结合(面向对象,需求变化不定)
**JAVA虚拟机**
先编译成虚拟机接受的字节码文件,虚拟机再相应的具体的机器系统解释成指令。
**每个系统对应一个虚拟机**
需要为每一个执行系统提供一个虚拟机(统一规范,按Java标准),同一个程序在四个操作系统上运行,提供四个虚拟机(优点:上层都符合同样的规范,拿到相同的字节码文件。
缺点:效率低,转化编译又解释JAVA缺点)
3.JAVA源程序,字节码文件,机器码指令。
四·JAVA的平台相关性
1.JAVA源代码和字节码的与机器无关的
2.JVM是与机器相关的
3.装有不同操作系统的机器上,需要有专门为该操作系统开发的JVM.
七.JAVA的垃圾回收机制(GC)
**垃圾收集GC**
(后台线程)程序执行过程中对内存使用情况跟踪,当对象长时间无人使用时,自动进行(除非对象被设置为持久态)。
优点:改善内存泄漏
缺点;效率低
**Java能真正避免内存泄漏吗?**
答:(c语言容易出现:内存使用不当,内存泄漏,系统崩溃。)不能,只能改善。内存泄漏仍是国际难题。
八. Java分为两类(applet小应用程序(较少使用不安全),应用程序application)
九.Java应用程序
*4.虚拟机:就是一种规范。主方法是虚拟机的入口。虚拟机只能通过类找主方法,因为最开始是没有对象的。
会向主方法栈帧里传参数,空数组对象,类型string。(没有任何一个元素)标准类库里类中找string类型,创建string类型的变量s.
**String类型和string[]类型**
String[]类型(args输出string[]类型的对象的地址,返回的就是string[]类型,加载了string[]类型的字节码文件。传一个string[]类型字符串数组对象(空数组对象无元素))
字节码文件:不一定是主类的字节码文件,但一定包含主方法。
HelloWorld运行原理及过程
Java HelloWorld 找到字节码文件
Javac HelloWorld.java 只有一个类编译成一个字节码文件。
**helloworld有几个文件几个对象几个类**:
两个文件:源文件,字节码文件(分为四个;string文件,string[]文件,HelloWord.class,system文件。)
五个对象:空对象,HelloWorld常对象,三个输入输出流对象(标准字节输出流对象system.out /system.in键盘输入/system.err显示器)
三个方法:main方法,println方法,to string方法
两个变量:局部变量:args ; s
一个类:helloworld
零个属性
过程:
省略了导包(默认)Java.Lang.*.包在标准类库中的lang包中找对象。
1.虚拟机加载helloworld,加载内存字节码文件,找主方法,用static通过类找主方法且公有public执行主方法,虚拟机不需要接收返回值(void),主方法不要给虚拟机返回值。
虚拟机会向主方法传参,将局部变量s定为形参(没有确切的值,赋予null),参数为一个字符串数组对象new String[0],
参考上图。空数组对象无元素有值。
2.执行string s,string.class,建string类型的变量,到jdk里的标准类库里找到string的字节码文件和缓冲内存,加载内存的内方法区,(args类型也是string[].class,)
找到string类型局部变量s, string.class, s在栈中,s在方法里值是不定的(string会复写s的值),当方法区中常量池无helloworld时建一个helloworld字符串对象。对象的返回值即使对象的值又是对象的地址引用距离,对象的值返回的是对象的地址,字符串常量字符串对象理论上在堆,这个对象特殊。将这个字符串对象给s。输出。
3.在堆上创建三个输入输出对象,system.out标准字节输出流对象等。
4.调用println()方法输出s的值,即helloworld的地址,没有真正输出地址。Jdk会自动调用string对象的to string方法,直接输出对象里的字符串。