java 学习笔记之一

学习Java前的准备工作
Lesson1A
相关概念
老师,什么是JDK啊?
 即Java Develop Kit,Java开发工具包。
老师,你们讲的是Java1还是Java2?
1998年12月,SUN公司发布了JDK1.2,开始使用“Java 2” 这一名称,目前我们已经很少使用JDK1.1版本,所以我们所说的Java都是指Java2。J2SDK当然就是Java 2 Software Develop Kit。
老师,什么是JRE?
JRE(Java Runtime Environment),即Java运行环境,通常已包含在J2SDK中了。如果我们仅仅是为了运行Java程序,而不是从事Java开发,我们可以直接下载JRE,在我们的系统上安装。
Java的开发工具包(JDK)
        J2SE(Java 2 Platform, Standard Edition)
        J2EE(Java 2 Platform, Enterprise Edition)
        J2ME(Java 2 Platform, Micro Edition)(手持设备的开发)
J2SE v1.4.2相关下载
        Java 2 Platform, Standard Edition, v 1.4.2
        http://java.sun.com/j2se/1.4.2/download.html
        J2SE v 1.4.2 Documentation
            http://java.sun.com/j2se/1.4.2/download.html
        Java Tutorial
            http://java.sun.com/docs/books/tutorial/information/download.html

Java技术与应用
一、Java的起源
Java来自于Sun公司的一个叫Green的项目,其原先的目的是为家用消费电子产品开发一个分布式代码系统,这样我们可以把E-mail发给电冰箱、电视机等家用电器,对它们进行控制,和它们进行信息交流。开始,准备采用C++,但C++太复杂,安全性差,最后基于C++开发了一种新的语言Oak(Java的前身),Oak是一种用于网络的精巧而安全的语言,Sun公司曾以此投标一个交互式电视项目,但结果被SGI打败。可怜的Oak几乎无家可归,恰巧这时Mark Ardreesen开发的Mosaic和Netscape启发了Oak项目组成员,他们用Java编 制 了HotJava浏 览器,得到了Sun公司首席执行官Scott McNealy的支持,触发了Java进 军Internet。 Java的取名也有一则趣闻,有一天,几位Java成员组的会员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖 啡,有一个人灵机一动说就叫Java怎 样,得到了其他人的赞赏,于是,Java这个名字就这样传开了。
二、我们为什么要用Java?
因为Java是简单的、面向对象的、健壮的、安全的、解释的、与平台无关的、多线程的、动态的语言
1)简单的
Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了。Java语言的简单性主要体现在三个方面:
1、Java的风格类似于C++,因而C++程序员初次接触Java语言,就会感到很熟悉。从某种意义上讲,Java语言是C及C++语言的一个变种,因此,C++程序员可以很快地掌握Java编程技术。
2、Java摒弃了C++中容易引发程序错误的一些特性,如指针、结构、枚举以及内存管理等。
3、Java提供了丰富的类库,可以帮助我们很方便的开发Java程序。
2)面向对象的
面向对象可以说是Java最重要的特性,所以它支持继承、重载、多态等面向对象的特性。Java语言的设计是完全面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。
3)健壮的
Java致力于检查程序在编译和运行时的错误。Java也是一种强类型的语言,其类型检查比C++还要严格。类型检查帮助我们检查出许多开发早期出现的错误。Java自己负责内存管理,提供了垃圾内存回收机制,有效的避免了C++中最头疼的内存泄漏问题。
4)安全的
Java的安全性可从两个方面得到保证。
一方 面,在Java语言里,删除了指针和释放内存等C++功能,避免了非法内存操作。
另一方面,通过Java的安全体系架构来确保Java代码的安全性。
当我们从网上下载Java代码在本地执行时,Java的安全架构能确保恶意的代码不能随意访问我们本地计算机的资源,例如:删除文件,访问本地网络资源等操作都是被禁止的。
5)解释的
Java代码是解释执行的,我们使用Java编译器将Java代码编译成字节码,这是一种中间代码,然后由Java解释器解释执行。而C++程序是编译执行的,C++程序代码被编译为本地机器指令,然后执行。
6)与平台无关的
Java作为一种网络语言,其源代码被编译成一种结构中立的中间文件格式。只要有Java运行系统的机器都能执行这种中间代码。Java源程序被编译成一种与机器无关的字节码格式,在Java虚拟机上运行。
7)多线程的
Java语言的一个重要特性就是在语言级支持多线程的程序设计。多线程就好像我们做一张桌子,如果你一个人完成这张桌子—就好像单线程,那么你需要先做桌面,做完桌面后,再做4个桌子腿,如果现在有5个人来做桌子—在程序中开辟5个线程,其中1个人做桌面,另外4个人分别做4个桌子腿,那么这两种方式效率的高低,相信大家都能区分出来。
8)动态的(有点难懂)
Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类,这是我们采用C++语言进行面向对象程序设计所无法实现的。在C++程序设计过程中,每当在类中增加一个实例变量或一个成员函数后, 引用该类的所有子类都必须重新编译,否则将导致程序崩溃。Java从以下几个方面采取措施来解决这个问题。
 Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下来,传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。一个在存储器中生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。 解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。Java还简化了使用一个升级的或全新协议的方法。如果你的系统运行Java程序时遇到了不知怎样处理的程序,Java能自动下载你所需要的功能程序。

Lesson1B
Java跨平台的原理
Java的跨平台是通过 Java虚拟机(JVM) 来实现的。

Java源文件的编译过程
   Java应用程序的开发周期包括 编译、下载、解释和执行几个部分。Java编译程序(javac.exe)   将 Java源程序  翻译为  JVM可执行代码—字节码。
   这一编译过程 同 C/C++的编译有些不同。当 C编译器 编译生成一个对象的代码时,该代码是为  在某一特定硬件平台   运行而产生的。因此,在编译过程中,编译程序  通过查表  将所有对  符号的引用  转换 为特定的内存偏移量,以保证程序运行。
    Java编译器 却不将  对变量和方法的引用  编译为  数值引用,也不确定  程序执行过程中的  内存布局,而是将这些  符号引用信息  保留在  字节码  中,由  解释器  在运行过程中 创建  内存布局,然后再通过查表来确定  一个方法所在的地址。这样就有效的保证了  Java的可移植性和安全性。

Java解释器的执行过程
运行  JVM字节码  的工作是由  解释器  来完成的。解释执行过程分三步进行:
代码的装入、代码的校验和代码的执行。
1) 装入代码的工作由  “类装载器”(class loader)  完成。类装载器  负责装入  运行一个程序需要的所有代码,这也包括程序代码中的类所   继承的类  和  被其调用的类。当类装载器装入一个类时,该类被放在自己的  名字空间  中。除了  通过符号  引用自己名字空间以外的类,类之间没有其他办法可以影响其它类。在本台计算机上的所有类  都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。
2) 当装入了运行程序需要的所有类后,解释器  便可确定整个可执行程序的  内存布局。解释器  为  符号引用  同  特定的地址空间  建立对应关系  及  查询表。通过在这一阶段确定代码的  内存布局,Java很好地解决了由  超类  改变  而使 子类  崩溃的问题,同时也防止了  代码  对  地址  的非法访问。随后,被装入的代码由  字节码校验器  进行检查。校验器可发现  操作数栈  溢出,非法数据类型转换等多种错误。
3) 通过校验后,代码便开始执行了。
        
Java字节码的两种执行方式
1、即时编译方式:解释器  先将  字节码  编译成  机器码,然后再执行该机器码。
2、解释执行方式:解释器  通过每次解释并执行  一小段代码  来完成  Java字节码程 序  的所有操作。
通常采用的是第二种方法。由于  JVM规格描述  具有足够的灵活性,这使得将  字节码  翻译为  机器代码的工作具有较高的效率。对于那些对  运行速度  要求较高的应用程序,解释器  可将  Java字节码  即时 编译为机器码,从而很好地保证了Java代码的可移植性和高性能。
        
JVM规格描述
JVM的设计目标  是  提供一个基于抽象规格描述的   计算机模型,为  解释程序  开发人员提供很好的灵活性,同时也确保  Java代码  可在符合该规范的任何系统上  运行。
JVM对其实现的某些方面  给出了具体的定义,特别是对  Java可执行代码,即  字节码(Bytecode)的格式  给出了明确的规格。这一规格包括  操作码和操作数  的语法和数值、标识符的数值表示方式、以及  Java类文件中的  Java对象、  常量缓冲池  在JVM的存储映象。
这些定义  为  JVM解释器  开发人员  提供了  所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲  使用Java的自由。
JVM  是   为Java字节码  定义的  一种独立于具体平台的  规格描述,是  Java平台独立性的 基础。
        
Java程序执行与C/C++程序执行的对比分析
如果把  Java源程序  想象成我们的  C++源程序, Java源程序  编译后 生成的 字节码 就相当于 C++源程序编译后的80x86的  机器码(二进制程序文件),JVM虚拟机  相当于  80x86计算机系统, Java解释器  相当于 80x86CPU。在80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。
Java解释器  相当于运行  Java字节码的  “CPU”,但该“CPU”不是通过 硬件 实现的,而是用  软件  实现的。Java解释器  实际上就是  特定的平台下的  一个应用程序。只要实现了特定平台下的  解释器程序,Java字节码  就能通过  解释器程序  在该平台下运行,这是Java跨平台的根本。
 当前,并不是在所有的平台下都有相应  Java解释器程序,这也是Java并不能在所有的平台下  都能运行的原因,它只能在  已实现了  Java解释器程序  的平台下运行。

J2skd1.4.1_02的安装
安装目录下的一些目录的介绍:bin, demo, include, lib, jre

Lesson1C
Teacher Sun recommend the software “UltraEdit” to edit your sorce file.
1、介绍UltraEdit软件的特色。
2、介绍利用模拟DOS窗口的 命令提示符  来开发java程序
3、如何快速显示可执行文件路径的方法?
4. 命令set path   //看path环境变量中的路径
5. set path=c:"jsdk1.4.1_02"bin    //将路径添加到path环境变量中。

Lesson1D
1. 在源程序中可以写多个类,每个类编译后都对应一个字节码文件
2. %JAVA_HOME%/bin/jar.exe 可帮助我们将多个类打包成一个jar包
3. Jar包的用法:jar  cvf  Lesson1.jar  Hello.class Welcome.class
4. Jar  cvf  Lesson1.jar  Lesson1/     将Lesson1目录下所有的文件都打包。
5. 在java源文件中虽然有多个类,但有且只有一个类为public,且将其类名作为文件名

Lesson1E
1. Public class Welcom: main():
注意:当我们想用解释器(加载的是类,不是文件)去解释执行一个类时,类中必须要有main方法。
2. Java中注释有三种:
1) //  单行注释
2)  /* ……*/    多行注释
3)  /** ………*/
3. Main(): System.out.println(“打印出你想打印的信息。”);   //向屏幕上打印输出一段话后并换行。
4. 比较println()与print()之间的区别:  println()  ==  print(“….."n”);

5. set classpath=E:"JavaLesson"Lesson1 这样做  java就只按classpath中指定的目录去找类文件了。而不是在当前目录下了,为了将当前路径包含进去,可用“.”来表示。

Lesson1F
1. 配置环境变量:我的电脑-->属性-->高级-->环境变量-->系统变量:  classpath, path, java_home
2. Java语法:八种基本数据类型:byte"short"int"long"char"double"float"boolean
3. Class welcome: main():println(b"s"i"l"ch"f"d"bool);
即:println(int i/float f/.....)有多个重载方法
4. byte b = -128~127(只占一个字节)    byte类型  参与算术运算时会自动转换成  整型
5. short s = -32768~32767 (占两个字节)  int i(四个字节); long l;(8个字节)
6. char ch=’a’;  (占两个字节)ch=97; 与C有些不同。
7. float f=1.3f; (4个字节)   double d(8个字节)
8. boolean bool; (true"false) ;  java中 if(1){}   //error. 与C有些不同
9. Java中数组的定义:
1)  一维:
a) int num[3]; //error 
b) int num[]; num=new int[3]; //correct  int[] num;
c) int [ ] num = {1,2,3};//必须在定义的同时赋初值
   int [ ] num = new int[]{1,2,3}; //ok  
2) 二维:
a) int num[][]; or int [][] num; //correct

Lesson1H
1. Java中二维数组的特点如下:
a) int [][] num; num=new int[3][];
   num[0]=new int[5];
   num[1]=new int[3];
   num[2]=new int[2];
2. 知道如何给二维数组进初始化?
int [][] num={ {1,2,3},{4,5,6} }; //ok

3. Java语言当中的++操作:
1) i++; ++i;(与C语言相同)
2) int i=3; int count = (i++)+(i++)+(i++); //key: count=12; i=6;
3) int i=3; int count = (++i)+(++i)+(++i); //key: count=15; i=6;
caution: 以上结果与编译器相关,不同编译器可能会得出不同的结果。

Lesson1I
Java中也提供了if语句,while语句,do-while语句,for语句
注:java中与C语言中for语句的不同 :循环变量的作用范围不同。
/------------------------------------------------------------------------------------------------------/
Code:
public class Welcome
{
        public static void main(String[] args)
        {
                //System.out.print("维新:http://www.mybole.com.cn"n");
                //System.out.println(" Welcome you!");
                /*byte b;
                b=3;
                b=(byte)(b*3);
                System.out.println(b);*/
                //short s;
                
                /*int i;
                long l;*/
                /*char ch;
                ch=97;
                System.out.println(ch);*/
                /*float f;
                f=1.3f;
                System.out.println(f);*/
                //double d;
                /*boolean bool;
                bool=true;
                System.out.println(bool);*/
                
                /*if(true)
                {
                }*/
                //int num[]=new int[3];
                /*int[] num;
                num={1,2,3};                //error*/
                //int [] num1;
                //int []num2;
                //num=new int[3];
                
                //int [] num=new int[]{1,2,3};        //ok
                //int [] num=new int[3]{1,2,3};        //error;
                /*int [] num;
                num=new int[3];
                num[0]=1;
                num[1]=12;
                num[2]=32;
                System.out.println(num[0]);
                System.out.println(num[1]);
                System.out.println(num[2]);*/
                
                /*int [][] num;
                num=new int[3][4];
                num[0][1]=12;
                num[2][3]=34;*/
                
                /*int [][] num;
                num=new int[3][];
                num[0]=new int[5];
                num[1]=new int[3];
                num[2]=new int[2];
                
                num[0][4]=45;
                num[1][2]=34;
                num[2][1]=21;
                System.out.println(num[0][4]);
                System.out.println(num[1][2]);
                System.out.println(num[2][1]);
                System.out.println(num[2][2]);*/
                
                //int [][] num=new int[][]{1,2,3,4,5,5};                //error
                //int [][] num=new int[][]{{1,2,3},{4,5,5}};        //ok
                //int [][] num=new int[2][]{{1,2,3},{4,5,5}};        //error
                //int [][] num={{1,2,3},{4,5,6}};                //ok
                
                /*int [][] num={{1,2,3},{4,5},{6}};
                System.out.println(num[0][2]);
                System.out.println(num[1][1]);
                System.out.println(num[2][0]);*/
                
                /*int i=3;
                //System.out.println(i++);
                System.out.println(++i);*/
                
                /*int i=3;
                //int count=(i++)+(i++)+(i++);
                int count=(++i)+(++i)+(++i);
                System.out.println(i);
                System.out.println(count);*/
                
                if()
                {
                }
                while(true)
                {
                }
                do
                {
                }while(true);
                
                for(int i=0;i<10;i++)
                {
                }
                
        }
}
posted @ 2008-09-16 18:31  zqblog007  阅读(231)  评论(1编辑  收藏  举报