● Java入门
①.字节码由Java虚拟机负责解释运行,即Java虚拟机负责将字节码翻译成本地计算机的机器码,并将将机器码交给本地的操作系统运行。
②.如果源文件中有多个类,那么只能有一个类是public类;如果有一个类是public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是.java;
③.如果源文件中没有public类,那么源文件的名字只要和某个类的名字相同,并且扩展名是.java。
④.如果源文件中包含多个类,编译源文件将生成多个扩展名为.clalss的文件,每个扩展名是.class的文件中只存放一个类的字节码,其文件名和该类的名字相同。
⑤.这些字节码文件被存放在与源文件相同的目录中。Java解释器执行的类名必须是主类的名字(没有扩展名)。当使用Java解释器运行应用程序是,Java虚拟机首先将程序需要的字节码文件加载到内存,然后解释执行自己码文件。
● 基本数据类型和数组
Java中没有无符号的byte,short,int和long,这一点和C语言有很大的不同,因此,unsigned int m;是错误的变量声明。
基本类型级别由高到低
double float long int char short byte
当把级别低的变量的值赋给级别高的变量是,系统自动完成数据类型的转化。当把级别高的变量的值赋给级别低的变量是必须使用类型转换运算。一个常见的错误是把一个double型常量赋值给float型变量时没有进行类型的转换运算:float x = 12.4;
正确的做法:
float x = 12.4F;或者float x = (float)12.4;
注:与C/C++不同,Java不允许在声明数组中的方括号内指定数组元素的个数。一次性声明多个数组:int [] a,b;
注:和C语言不同的是,Java允许使用int变量的值指定数组的元素的个数,例如:int size = 30;double number[] = new double[size];
● 类与对象
成员变量有默认值,但局部变量没有默认值,因此在使用局部变量之前,必须保证局部变量有具体的值。
注:变量的赋值
声明变量时可赋予初值 class A{ int a; float b= 12.56f; } 非法的赋值语句:编译出错 class A{ int a; float b; a=12; b=12.56f; }
所谓创建对象,就是指为对象分配变量,并获得一个引用,以确保这些变量由该对象来操作管理,new运算符只能和类的构造方法进行运算,运算的最后结果是一个十六进制的数,这个数称作为对象的引用,即表达式new XXX()的值是一个引用。new运算符在计算出这个引用之前,首先给类中的成员变量分配内存空间,然后执行构造方法中的语句,这个时候不能称对象已经诞生,因为还没有计算出引用,即还没有确定被分配了内存空间的成员变量是“谁”的成员。当计算出引用之后,即new XXX()表达式已经有值后,对象才诞生。如果把new XXX()表达式的值赋给一个对象,这个对象就拥有了被new 运算符分配了内存的成员变量,即new运算符为该对象分配了变量。
注:对象的引用存在栈中,对象的实体(分配个对象的变量)存在堆中。
栈(stack)与堆(heap)都是Java用来在RAM中存放数据的地方。Java自动管理栈和堆,程序员不能直接的设置栈和堆。栈的优势是,存取速度比堆快。缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。堆的优势是,可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集齐会自动的收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
● 垃圾回收
Java运行环境的“垃圾收集”发现堆中分配的实体不再被栈中任何对象所引用时就会释放该实体在堆中在堆中占用的内存。因此Java中很少出现“内存泄漏”,即由于程序忘记释放内存所导致的内存溢出。
注:如果希望Java虚拟机立刻进行“垃圾收集”操作,可以让System类调用gc()方法。