Java常见知识点(一)
1.+不仅可作为加法运算符使用,还可作为字符串连接运算符使用。
2.a = b = c = 7;//虽然java支持这种一次为多个变量赋值的写法,但这种写法导致程序的可读性降低,因此不推荐这样写。
3.当进行移位运算时,只要被移位的二进制码没有发生有效位丢失(对于整数而言,通常指被移出的位全部都是0),不难发现左移n位就相当于乘以2的n次方,右移n位则是除以2的n次方。不仅如此,进行移位运算不会改变操作数本身,只是得到了一个新的运算结果,而原来的操作数本身是不会改变的。
4.java中switch语句在执行时一旦遇到相等的值,程序就开始执行这个case标签后的代码,不再判断与后面的case、default标签的条件是否匹配,除非遇到break;才会结束。
5.使用switch语句时,有两个值得注意的地方:第一个抵港是switch语句后的expression表达式的数据类型只能是byte、short、char、int四种整数类型,String(Java7才支持)和枚举类型;第二个地方是如果省略了case后代码块的break;,将引入一个陷阱。
6.Java中的标签就是一个紧跟着英文冒号(:)的标识符。与其他语言不同的是,Java中的标签只有放在循环语句之前才有作用。通常紧跟break之后的标签,必须在break所在循环的外层循环之前定义才有意义。
7.Java语言支持两种语法格式来定义数组:type[] arrayName; type arrayName[]; 对于这两种语法格式而言,通常推荐使用第一种格式。
8.使用foreach循环迭代数组元素时,并不能改变数组元素的值,因此不要对foreach的循环变量进行赋值。
9.在使用内部类来实例化接口时,接口要被引入到java类中;
10.如果一个Java原文件里定义的所有类都没有使用public修饰,则这个Java源文件的文件名可以是一切合法的文件名;但如果一个Java源文件里定义了一个public修饰的类,则这个源文件的文件名必须与public修饰的类的类名相同。
11.如果程序员没有为Java类提供任何构造器,则系统会为这个类提供一个无参数的构造器,这个构造器的执行体为空,不做任何事情。无论如何,Java类至少包含一个构造器。
12.当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为他从父类继承得到的所有实例变量分配内存,即使子类定义了与父类中同名的实例变量,也就是说,当系统创建一个Java对象时,如果该Java类有李娜改革父类(一个直接父类A,一个间接父类B),假设A类中定义了2个实例变量,B类中定义了3个实例变量,当前类中定义了2个实例变量,那么这个Java对象将会保存2+3+2个实例变量。
13.引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法。因此,编写Java代码时,引用变量只能调用声明该变量时所用类里包含的方法。
14.通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量。
15.当吧子类对象赋给父类引用变量时,被称为向上转型(upcasting)。这种转型总是可以成功的,这也从另一个侧面证实了子类是一种特殊的父类。这种转型只是表明这个引用变量的编译时类型是父类,但实际执行它的方法时,依然表现出子类对象的行为方式。但把一个父类对象赋给子类引用变量时,就需要进行强制类型转换,而且还可能在运行时产生ClassCastException异常,使用instanceof运算符可以让强制类型转换更安全。
16.虽然Java允许一个类里定义2个普通初始化块,但这没有任何意义。因为初始化块是在创建Java对象时隐式执行的,而且它们总是全部执行,因此完全可以把多个普通初始化块合并成一个初始化块,从而可以让程序更加简洁,可读性更强。
17.实际上初始化块是一个假象,使用javac命令编译Java类后,给Java类中的初始化块会小时——初始化块中代码会被“还原”到每个构造器中,且位于构造器所有代码的前面。
18.静态初始化块也被称为类初始化块,也属于类的静态成员,同样需要遵循静态成员不能访问非静态成员的规则,因此静态初始化块不能访问非静态成员,包括不能访问实例变量和实力方法。
19.Java系统加载并初始化某个类时,总是保证该类的所有父类(包括直接父类和间接父类)全部加载并初始化。
20.当JVM第一次主动使用某个类时,系统会在类准备阶段为该类的所有静态成员变量分配内存;在初始化阶段则负责初始化这些静态成员变量,初始化静态成员变量就是执行类初始化代码或者声明类成员变量时指定的初始值,它们的执行顺序与源代码中的排列顺序相同。