// 注释:源于现在已经快是大四了,到现在为止,学习编程也没多久,课堂在上自学,知识点实在是碎片化。加之自己 //又没有实际项目经验,现在都不知道自己学了些什么东西。于是开始整理所学知识碎片,也当作是笔记,方便自己查 //阅。最近在读《java编程思想》巩固,就以这个开始,逐步把自己学过的知识加以整理。主要记录可能会忘记的或者是比 //较重要的。已经掌握不会忘记的类容忽略
一元加减操作符:一元减号用于转变数据的符号,而一元加号知识为了与一元减号相对应。但是它唯一的作用仅仅是将叫较小的类型的操作数提升为int。
//: operators/Equivalence.java public class Equivalence { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1 == n2); //比较的是对象的引用,而不是数值 System.out.println(n1 != n2); } } /* Output: false //n1,n2不是指向同一个对象,所以错 true *///:~
注意:equals()的默认行为比较的是引用,所以除非在自己的新类中覆盖equals()方法,否则不可能表现出我们希望的行为。
大多数java类库都实现了equals()方法,以便用来比较对象的内容,而非比较对象的引用。
短路:当我们使用逻辑操作符时,我们会遇到一种“短路”现象。即一旦能够明确无误的确定整个表达式的值,就不再计算表达式余下的部分了。
java允许我们把任何基本数据类型转换成别的基本数据类型,但布尔型除外,后者根本不允许进行任何类型的转换处理。(与C++不一样)
在将floating或double转型为整型值时,总是对该数字执行截尾。如果想要得到舍入的结果,就需要使用java.lang.Math中的round()方法。
如果对基本数据类型执行算术运算或按位运算,只要类型比int小(即char,byte,short),那么在运算之前,这些值会自动转换成int,运算的结果自然也是int。
switch(x) { case: case }
如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。char型略有不同,如果无法找到接收char参数的方法,就会把char直接提升至int型。
在static 方法内部,不能调用非静态方法。
java垃圾回收机制中方法finalize()方法,工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且下一次垃圾回收动作发生时,才会真正收回对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
如果java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
当它工作时,将一面回收空间,一面是使堆中的对象紧凑排列。
通过对对象重新排列,实现了一种高速的,有无限空间可供分配的堆模型。
java尽力保证:所有变量在使用前都能得到恰当的初始化。
无法阻止初始化的自动进行。
在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
static关键字不能作用于局部变量,因此它只能作用于域。
显示的静态初始化
静态子句(静态块):(static关键字后面花括号中的代码)
//: initialization/Spoon.java public class Spoon { static int i; static { i = 47; //静态代码块 } } ///:~
非静态示例初始化
在类中,仅用花括号包裹的代码:相比静态代码块少了static关键字。
这种语法对于支持“匿名内部类”的初始化是必须的。在构造器之前执行
可变参数列表
//: initialization/NewVarArgs.java // Using array syntax to create variable argument lists. public class NewVarArgs { static void printArray(Object... args) //参数为可变参数列表,即参数为Object类型的数组args,其数组长度根据具体传入的实际参数为准
{ for(Object obj : args) System.out.print(obj + " "); System.out.println(); } public static void main(String[] args) { // Can take individual elements: printArray(new Integer(47), new Float(3.14), new Double(11.11)); printArray(47, 3.14F, 11.11); printArray("one", "two", "three"); printArray(new A(), new A(), new A()); // Or an array: printArray((Object[])new Integer[]{ 1, 2, 3, 4 }); printArray(); // Empty list is OK } } /* Output: (75% match) 47 3.14 11.11 47 3.14 11.11 one two three A@1bab50a A@c3c749 A@150bd4d 1 2 3 4 *///:~
2. 每个编译单元(文件)都只能有一个public类(该类的名字要跟文件名一样)。当然也可以一个public的类也没有,那样对 类的命名就没有规定。
3. 最好的设计是一个文件一个public类。
4. 构造器也可以指定访问类型。如果是private,则可以组织任何人或类去创建该类的任何对象。