1. JAVA类中,若某个主数据类型属于一个类成员,那么即使不明确(显式)进行初始化,也可以保证它们获得一个默认值。 一旦将变量作为类成员使用,就要特别注意由 Java 分配的默认值。这样做可保证主类型的成员变量肯定得到了初始化( C++不具备这一功能),可有效遏止多种相关的编程错误。 但是如果变量不是类成员,就不会分配默认值,这一点JAVA和C++相同,许多 C++编译器会对变量未初始化发出警告,但在 Java 里却是错误 .
2. 命名冲突:C++—— 关键字 namespace; Java语言自带命名空间.
3. JAVA编码样式: 大写一个类名的首字母,类内成员标识符的第一个字母采用小写 。所有方法首字母小写的编码规则并不适用于构建器 (构造函数)。
class AllTheColorsOfTheRainbow {
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int newHue) {
// ...
}
// ...
}
4. Java运算符:几乎所有运算符都只能操作“主类型”(Primitives)。唯一的例外是“=”、“==”和“!=”,它们能操作所有对象(也是对象易令人混淆的一个地方)。除此以外,String 类支持“+”和“+=”。
使用 == 和!= 比较对象时,实际是比较对象句柄,使用所有对象都适用的特殊方法equals()来比较对象内容。但这个方法不适用于“主类型”。
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);
System.out.println(n1.equals(n2));
} }
运行结果: false, true, true
5. Java只可将 AND,OR 或 NOT 应用于布尔值。与在 C 及 C++中不同,Java不会从一个 int 数值中转换得到布尔值,因此 不可将一个非布尔值当作布尔值在逻辑表达式中使用。若这样做,就会发现尝试失败,并用一个“//!”标出。
6. Java移位运算:移位操作符能操作的数只有int类型和long类型,这个是指左操作数的类型。
左移位运算符(<<) :在低位补 0
右移位运算符(>>) :“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入 0;若值为负,则在高位插入 1。
“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入 0。这一运算符是 C 或 C++没有的 。
对 char,byte 或者 short 进行移位处理,那么在移位进行之前,它们会自动转换成一个 int, 并进行右移位。但右移位 “零扩展”不会发生 。犹豫int类型32位,所以移位运算符右边的变量如果大于32,只会取其二进制的低5位,以保证移位个数小于32。long类型只取低6位。
short s = -1;
s >>>= 10;
System.out.println(s);
结果s = -1
7. Java中使用标签lable:在 Java 里唯一需要用到标签的地方就是拥有嵌套循环,而且想中断或继续多个嵌套级别的时候。
(1) 简单的一个 continue 会退回最内层循环的开头(顶部),并继续执行。
(2) 带有标签的 continue 会到达标签的位置,并重新进入紧接在那个标签后面的循环。
(3) break 会中断当前循环,并移离当前标签的末尾。
(4) 带标签的 break 会中断当前循环, 并移离由那个标签指示的循环的末尾。
//: c03:LabeledFor.java
// Java’s "labeled for" loop.
public class LabeledFor {
public static void main(String[] args) {
int i = 0;
outer: // Can't have statements here
for(; true ;) { // infinite loop
inner: // Can't have statements here
for(; i < 10; i++) {
prt("i = " + i);
if(i == 2) {
prt("continue");
continue;
}
if(i == 3) {
prt("break");
i++; // Otherwise i never
// gets incremented.
break;
}
if(i == 7) {
prt("continue outer");
i++; // Otherwise i never
// gets incremented.
continue outer;
}
if(i == 8) {
prt("break outer");
break outer;
}
for(int k = 0; k < 5; k++) {
if(k == 3) {
prt("continue inner");
continue inner;
}
}
}
}
// Can't break or continue
// to labels here
}
static void prt(String s) {
System.out.println(s);}
} ///:~
8. Java将一个 float 或 double 值造型成整数值后,总是将小数部分“砍掉”,不作任何进位处理 .
Switch语句的选择因子必须是int 或 char类型
9. 变量初始化
基本类型初始化为0,对象为空,字符为‘’。
类成员变量的初始化可以在类定义时同时进行,也可以放在构造器中。构造器外的成员初始化无论其位置在构造函数前或后都将发生在构造函数前。
class Card {
Tag t1 = new Tag(1); // Before constructor
Card() {
// Indicate we're in the constructor:
System.out.println("Card()");
t3 = new Tag(33); // Reinitialize t3
}
Tag t2 = new Tag(2); // After constructor
void f() {
System.out.println("f()");
}
Tag t3 = new Tag(3); // At end
}
输出:
Tag(1)
Tag(2)
Tag(3)
Card()
Tag(33)
f()
t3 句柄会被初始化两次,一次在构建器调用前,一次在调用期间(第一个对象会被丢弃,所以它后来可被当作垃圾收掉)。