本文将以笔记摘要的形式,记录Java的一些基本知识点,将会不断扩充,没有特定顺序,只为记录方便以后查阅。
1.Java使用Unicode字符集,最多可以识别65536个字符,Unicode字符集前128个字符刚好是ASCII码表。
2.switch(表达式)语句中,表达式的值必须是整型或字符型。
3.系统自动引入java.lang包中的所有类,是Java的核心类库;如果使用import语句引入了包中所有的类,可能会增加编译时间,但绝不会影响程序性能,因为在程序运行时,只是将真正使用到的类的字节码文件加载到内存。
4.Java的两个double类型作比较(如比较经纬度是否相同),最好不要用“==”号,因为double在计算机中存储是不精确的,可以让两个double数值做减法,然后将得到的差的绝对值跟一个很小的阈值(如0.0001)做比较,如果差的绝对值小于该阈值,则认为两个double值相等。
5.Java语言有内置的多线程机制,而C++没有,需要调用操作系统的多线程来实现多线程的逻辑。
6.Java字节码(.class文件)是与平台无关的二进制码,编译器(javac.exe)把源文件(.java文件)编译成字节码;然后字节码由解释器(java.exe)解释成本地机器码,解释一句,执行一句。
7.如果局部变量名字与成员变量的名字相同,则成员变量会被隐藏,即这个成员变量在这个方法内暂时失效,如果想在该方法内使用成员变量,必须使用this关键字。
8.方法的返回类型和参数名字不参与比较,也就是说如果两个方法的名字相同,即使返回类型不同也不允许,必须保证参数类型或个数不同。
9.构造方法是特殊的方法,不能用static修饰。
10.实例方法可以操作实例变量也可以操作类变量,而类方法只能操作类变量。
11.一个类中的实例方法可以调用该类中的实例方法或类方法;而类方法只能调用该类中的其他类方法,不能调用实例方法。
12.如果一个类中定义了一个或多个构造方法,则不再提供默认的无参构造方法。
13.在分配内存时,整型变量默认为0,浮点型默认为0.0,boolean类型默认为false,引用型默认的初始值为null,如String。
14.一个类的不同对象的实例变量分配不同的内存空间,而类变量却是被多个不同对象所共享的,即只分配一处内存空间。实例变量在new之后才会真正分配内存,而类变量在字节码文件被加载到内存时就分配了内存,直到程序退出,才释放内存;类变量可以通过对象或类名访问。
15.类方法与实例方法的区别:当类的字节码文件加载到内存时,类的实例方法不会被分配入口地址,只有通过new创建对象后,类中的实例变量才会被分配入口地址,从而实例方法可以被该类创建的任何对象调用;需要注意,当创建第一个对象时,类中的实例方法就分配了入口地址,当再次创建对象时,不再分配入口地址,也就是说方法的入口地址被所有对象共享,当所有对象不存在时,方法的入口地址才被取消。实例方法中可以使用类变量和成员变量。当类被加载到内存时,就给类方法分配了入口地址,所以类方法可以通过类名调用,也可以被任何该类的对象调用。类方法的入口地址直到程序退出才被取消,且类方法不可以操作成员变量,因为在创建对象之前,成员变量还没分配内存,类方法也不能调用其他实例方法,因为在类创建对象之前,实例方法也没有入口地址。
16.无论是类方法还是实例方法,只有被调用执行时,方法中的局部变量才被分配内存,方法调用完毕,局部变量即刻释放所占的内存。在一个方法被调用执行完毕之前,如果该方法又被调用,那么该方法的局部变量会被再次分配新的内存空间,比如递归调用。
17.this是Java的一个关键字,表示某个对象,this可以出现在实例方法和构造方法中,但不可以出现在类方法中。
18.子类中只要定义一个跟父类中同名的成员变量,就可以隐藏继承到的成员变量。子类可以通过方法重写隐藏继承的方法,方法重写是指:子类定义一个方法,并且该方法的名字、返回类型、参数个数和类型与从父类中继承的方法完全相同。注意的是子类重写的方法的权限不能低于父类中该方法的权限,权限从高到底为:public、protected、友好的、private。
19.final关键字可以修饰类、成员变量和方法中的参数。final类不能被继承,即不能有子类。final方法不能被重写。final类型的成员变量就是常量,final参数不能被修改。