《张孝祥JAVA就业培训教程》书摘

1.java虚拟机及java的跨平台原理:
图P2
       java兼顾解释件与编译性语言的特点,java源文件转换成.class字节码文件的过程是编译型的,.class在操作系统上运行的过程则是解释型的,Java虚拟机充当了解释器的作用。


2.java(虚拟机)的运行过程:
    运行JVM字节码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验和代码的执行。

3.Java字节码的执行有两种方式:
    (1)即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。
    (2)解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。
    通常采用的是第二种方法。由于州规格报述具有足够的灵活性,这使得将字节码翻译为机器代码的工作具有较高的效率。对于那些对运行速度要求较高的应用程序,解释器可将Java字节码即时编译为机器码,从而很好地保证了Java代码的可移植性和高性能。

4.反编译工具:
JAD(只能在DOS下运行)
FrontEnd(JAD的一个图形化操作界面,它的反编译引擎就是jad.exe)


5.java程序的注释:
 /*...*/中可以嵌套“//”注释,但不能嵌套“/*...*/”,例如,下面的注释是非法的:
  /*
  /* int c=19;*/
  int x=5;
  */

6. System.out.println()除了可以在屏幕上打印字符串外,还可以支接在屏幕上打印其他类型的数据,  读者再想想System.out.println('a'+1)在屏幕上的打印结果与System.out.println(""+'a'+1)在屏幕上的打印结果有什么不同呢?前者将字符'a'与整数1相加后得到的结果是整数98,后者将一个空字符串与字符'a'相连后再与整数1相连形成一个新的字符串"a1"。

7.    读者在日常的编程当中,尽量多读一些别人优秀的源程序、积累一些好的算法,这样对你以后的工作会有很大帮助。如下面的留言板分页问题和走马灯问题,有的程序员可能会用到一大堆的if else和for语句未判断和循环,作者在这里给出两个经典的算法。
    思考题1:某个培训中心要为新到的学员安排房间,假设共有x个学员,每个房间可以住6人,让你用一个公式未计算他们要住的房间数(千万不要像我以前的有些学员开玩笑、说男生和女生是不能分在一块的,我们就不在这考虑了)。
    答案:  (x+5)/6。这种算法还可用在查看留言根的分页显示上,其中x是总共的留言数,6是每页显示的留言数,结果就是总共有多少页。
    思考题2:假设你要让x的值在0至9之间循环变化
    答案:
    int x=0;
    while(true)
    {
    x=(x+1)%10;
    }
    这样,x的取值总在0与9之间循环。


8.“&”和“&&”的区别在于,如果使用前者连接,那么无论任何情况,  “&”两边的表达式都会参与计算。如果使用后看连接,当“&&”的左边为false,则将不会计算其右边的表达式(短路)。  “|”和“||”的区别与“&”和“&&”的区别一样。


9.移位运算:
<<左移:补0
>>右移:看最高位,高位为0则补0,高位为1则补1
>>>无符号右移:补0
注意:以上移位运算符适用数据类型有byte、short、char、int、long。
    1.对低于int型的操作数将先自动转换为int型再移位。
    2.对于int型整数移位a>>b,系统先将b对32取模,得到的结果才是真正移位的位数。例如:a>>33和a>>l结果是一样的,a>>32的结果还是a原来的数字。
    3.对于long型整数移位时a>>b,则是先将移位位数b对64取模。
   
      移位能为我们实现整数除以或乘以2的n次方的效果,如:x>>1的结果和x/2的结果是—样的,x<<2和x*4的结果也是—样的。总之,一个数左移n位,就是等于这个数乘以2的n次方,一个数右移n位,就是等于这个数除以2的n次方。请思考:屏幕上每个像素的颜色用一个8位的二进制数据表示,那么屏幕上最多能显示多少种颜色?这其实就是如何用程序实现求2的x次方的问题。答案:y=1<      移位不会改变变量本身的值。如a>>1;在一行语句中单独存在,毫无意义,因为它没有改变a的值,也没有把它赋值给别的变量。作者在深史半夜编程时,常犯这错误,也帮不少人排除过类似的错误。

10.while循环语句中while()没有“;”,而do while语句中的while()后有“;”


11.for语句还可以用下面的特殊语法格式:
  for(;;)
  {
   .......
  }
同样意义的还有while(true),这些都是无限循环,需要用break语句跳出循环

12. Java把内存划分成两种:一种是栈内存  另一种是堆内存。
       在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块(也就是一对花括号{}之间)定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放并为该变量所分配的内存空间,该内存空间可以立即被另作他用。
       堆内存用来存放由New创建的对象和数组,在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象,引用变量就相当于是为数组或对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它时,才会变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后一个不确定的时间被垃圾回收器收走(释放并)。这也是Java比较占内存的原因。 

你可能感兴趣的:(Java学习笔记)