1 一个java文件中至少应有一个类,但最多只能有一个public类;若有public类,源文件必须按该类命名。
2 java 的数据类型分为基本类型和引用类型。变量根据生成周期不同,可以分为静态变量、成员变量和局部变量。
3 局部变量在被使用前一定要初始化,全局变量中的实例变量和类变量使用前不需要初始化,会获得一个默认值。
4 数值不能再变化的变量叫做常量,需要用关键字final来修饰。一般情况下,常量名用大写字母标识。
5 一个整数值可以赋给一个long变量,但是指定一个long变量,你需要明白地告诉编译器变量的值是long型,可以通过在变量的后面加大写或者小心的L来做到这点
6 在拷贝数组时,最容易犯的错就是使用赋值运算符=来复制数组,然后对新数组的操作也影响到原数组的操作,那是因为它们根本指向的就是同一段内存空间。其实,拷贝数组数据应该使用systm.arraycopy()方法,示例代码如下:
int[] arr = new int[]{1,2,3};
int[] arr2 = new int[3];
System.arraycopy(arr, 0, arr2, 0, arr.length);
7 当环境变量path指定了某些路径,就可以在任何目录下访问到指定路径中的软件。
8 运行时的数据存储区有堆(heap)和栈(stack)。一般来说,栈中存放的是非static的自动变量、函数参数、表达式的临时结果和函数返回值(如果它们没有放到寄存器中)。栈中的这些实体数据的分配和释放均是由系统自动完成的,堆中存放的实体数据都是程序中显式分配的,没有自动垃圾回收机制的系统中必须由程序代码显式地释放这些实体。
9 java中,引用是不可计算的。C++中的指针可以计算,如++,--。引用不会引起内存泄露。
10 内部类
1) 静态内部类:它相当于外部类的静态成员一样,使用static修饰的内部类,它隶属于外部类,使用起来相当于一个独立的外部类。
2) 成员内部类:它相当于外部类普通成员一样,隶属于外部类的具体对象,在定义它的时候,需要先创建外部类对象,再创建它的实例。
3) 局部内部类:它定义在一个方法的方法体中,往往仅作为方法暂时的使用,只能访问final修饰的局部变量。
4) 匿名内部类: 它也定义在方法体中,但是它没有个具体的名字,具有非常大的灵活性,工作本质与局部内部类类似。
11 基础数据类型创建不会在堆内存中开辟空间,一般保存在栈中。在参数传递时,直接传递它的值。
类的创建,会在堆内存中开辟一块新的空间。在参数传递的时候,传递的是它所代表的对象的一个引用。
12 Java虚拟机在启动的时候会实例化9个对象池。这9个对象池分别用来存储8种基本类型的包装类对象和String对象,主要是效率问题。
13 java对待目录和文件都统一使用File来表示,并且在创建File对象的时候,并不检查该目录或文件是否存在,只作为一种代表,开发者在需要时使用isDirectory()或isFile()方法来判断。
14 java的所有数据读写,都是通过流进行的。因此要完成一个复制文件的程序,就得有两个流对象,一个输入流FileInputStream,一个输出流FileOutputStream。
15 java流根据数据格式不同,可以分为字节流和字符流。
字节流最大的特点,就是每次的输出输入都是一个字节,因此它主要应用在最原始的的流的处理上,如内存缓存操作、文件复制等不用关心流的内容是什么格式的地方。
字符流是针对文本文件的。输入和输出类型包括StringReader和StringWriter、BufferReader和BufferWriter。
16 序列化本质上就是把对象内存中的数据按照一定的规则,变成一系列的字节数据,然后再把这些字节数据写入到流中。而反序列化的过程相反,先读取字节数据,然后再重新组装成java对象 。
所有需要进行序列化的类,都必须实现Serializable接口,必要时还需要提供静态的常量serialVersionUID。
17 Runnable接口与thread类的区别
线程类继承自Thread则不能继承自其它类,而Runnable接口则可以。
线程类继承自Thread相对于Runnable来说,使用线程更方便些。Thread类提供了很多关于线程的方法,例如,获取线程ID,线程名等方法。
实现Runnable接口的线程类的多个线程,可以更方便的访问同一变量,而Thread类就需要内部类来进行替代。
18 如何启动一个线程
继承自Thread类的线程,可以通过new创建一个线程对象以后,执行start()方法开始一个线程。而实现了Runnable接口的线程类,需要用它的对象实例,作为Thread类构造方法的参数,创建一个Thread对象,然后调用start()方法。
19