3.1更简单的打印语句
1.在该小节中引入了一个import static的类库,net.mindview.util.Print可以很好的简化大多数代码,但是它并非在任何场合都显得恰当,有时要习惯它带来的麻烦。
3.2使用Java操作符
2.几乎所有的操作符都之能用来操作“基本类型”(C语言作为入门的语言,和这个是差不多的),例外的操作符是“=”,“==”,“!=”,这些操作符能操作所有对象,
(该点也是对象容易令人糊涂的地方)除此以外,String类支持“+”和“+=”(当String类型的元素后面跟一个“+”,而它后面又紧跟一个非String类型的元素是,就会
尝试将这个非String类型的元素转化为String
)。
3.3优先级
3.当有多个操作符时,为了使得清晰,用括号包含。
3.4赋值
4.赋值对于基本数据类型是简单的,但是对于对象,将一个对象赋值给另一个对象,实际是将“引用”从一个地方赋值到另一个地方。(对象)c=(对象)d;那么c和d都
指向了原来d指向的地方,而被覆盖的引用将会被垃圾回收器自动清理。
package Java_3_1;
class Tank{
int level;
}
public class java_3_3 {
public static void main(String arge[]){
Tank t1=new Tank();
Tank t2=new Tank();
t1.level=5;
t2.level=6;
System.out.println("1.t1.level="+t1.level);
System.out.println(" .t2.level="+t2.level);
t1=t2;
System.out.println("2.t1.level="+t1.level);
System.out.println(" .t2.level="+t2.level);
t2.level=9;
System.out.println("3.t1.level="+t1.level);
System.out.println(" .t2.level="+t2.level);
}
}
/* Output
* 1 .t1.level=5
.t2.level=6
2. t1.level=6
.t2.level=6
3. t1.level=9
.t2.level=9
*///:~
5.方法调用的别名问题
package Java_3_1;
class Letter{
char c;
}
public class java_3_4_1 {
static void f(Letter y){
y.c='z';
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Letter x=new Letter();
x.c='a';
System.out.println("x.c="+x.c);
f(x);
System.out.println("x.c="+x.c);
}
}/*Output:
*x.c=a;
*x.c=z;
*///:~
这里和我们所接触到的C语言不同,在经过函数f()的调用下,对象x改变其本身的数据,究其原因,还是Java中的对象其实就只C语言中的指针的别名。
3.6自动递增和递减
6.这里的递增和递减和C语言是如出一辙的,大家只要按照自己的方法技巧记住就可以了,不需要太去抠。
3.7关系操作符
7.在关系操作符中生成的是boolean(布尔)结果,只有两个值一个是true,一个是false,当然在这里我想最需要注意的还是对象的问题,看到下面这段代码我想大多数
学完C语言的人都很惊讶,没错我也是这样的,需要注意的是定义了两个不同的对象,分别进行的引用,然后指向的堆中的类是不同的,这样你就可以理解了。
package Java_3;
public class java_3_7_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a=new Integer (47);
Integer b=new Integer (47);
System.out.println(a==b);
System.out.println(a!=b);
}
}/*Output:
*false
*true
*///:~
8.equals可以用开比较内容,但是它的默认行为是比较引用的,就如下面的例子
package Java_3;
class Value{
int i;
}
public class java_3_7_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Value v1=new Value();
Value v2=new Value();
v1.i=v2.i=3;
System.out.println(v1.equals(v2));
}
}/*Output:
*false
*///:~
3.8逻辑运算符
9.逻辑操作符“与”,“或”,“非”,根据逻辑运算生成一个布尔值,此三种运算也只可以用于布尔值,与C和C++不同的是,不可将一个非布尔值当做布尔值来用,
如果在应该使用了String的地方使用了布尔值,布尔值会自动转化为适当的文本形式。
3.9直接常量
10.使用直接常量可以使编译器明确的知道要生成什么类型的数。
11.Java和C一样才用了用e或者E来表示的指数记数法
3.10按位操作符
12.按位操作符用来操作整数基本数据类型中的单个比特,即2进制位,按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。
13.熟悉C语言的人都知道,按位操作来源于设置硬件寄存器的二进制位,而Java保留的初衷是嵌入电视机顶盒,但是其他地方用的则是很少的。
14.按位操作符可与“=”连用,一并合并运算和赋值,(&,||,^)都可以,但是~不可以,这是一元操作符。
3.11移位操作符
15.移位操作符的运算对象也是二进制的“位”,只可用来处理整数类型。
16.左移位操作符(<<),低位补0;右移位操作符(>>),有符号使用“符号扩展”,若为正,则在高位插入0,若符号为负,则插入1;Java增加了一种
“无符号”右移位操作符(>>>),无论正负,都在高位插0,这是C和C++里面所没有的。
17.char和byte和short类型的数移位时都转化为int型,只有数值右端的低五位才用效,long按照long的来处理,只会用到数值的右端的低6位。
18.A>>=B,表示数A向右移动B位,然后再将数值赋给A;
3.12三元操作符
19.三元运算符起初出现于C语言中,是为了使运算更加的高效,但是如果你打算大量的运用它,会造成可读性极差的代码!
20.条件运算符与if-else完全不同,因为它会产生一个值。
3.13字符串操作符+和|+=
21.这个操作符在java中有一种特殊的用途:连接不同的字符串;
22.参考C++中的操作符重载,Java也引进了这一机制,虽然容易实现了很多,但是仍然过于复杂,使用Java程序员不能像C++程序员那样实现自己的重载操作符;
23.如果表达式以一个字符串起头,那么后续的所有操作数都必须是字符串型(编译器会把双引号内的字符序列自动转成字符串);
24.有时会看到一个空的String操作符后面跟随+和一个基本类型变量,以此作为不调用更加麻烦的显示方法而执行字符串转接的方式。
3.14使用操作符时长常犯的错误
25.使用操作符时最常见的错误就是对表达式如何计算有点不清楚,也不愿意使用括号。
26.
例如while(x=y),很明显是想测试是否相等,在C中是正确了,但是在java中,编译器不会将int 型转化为布尔型,所以会提示有错误。(除非x和y都是布尔值);
27.在Java中执行按位“与”和按位“或”用单字符“&”和“|”;
3.15类型转换操作符
28.类型转化是最普遍见到的了,形式很简单,一种的自动的转化,位数少的可以向位数多的自动转,(例float a=100;Output:a=100.00);还有就是手动转换的
(例float a=100,Output:a=100.00;(int)a;Output:a=100);
29.Java的类型转化分为窄化转换(可能会面临数据丢失)和扩展转化(不会造成任何数据丢失);
30.Java允许我们把任何基本数据类型转化成别的基本类型,除布尔类型外,后者不允许进行进行任何类型的转化。
31.浮点类型在转化为整数型的时候,对数字执行截尾处理,例如23.9在转化为int型的时候,对于23;
32.如果想得到舍入的结果,需要使用java.lang.Math中的roung()方法;
33.提升:如果对基本数据类型执行算术运算或按位运算,只要是类型比int小,在运算前都会将这些值自动转化为int型的,这样一来最终生成的一般将会是这个表达式中出现的最大类型;
3.16Java没有sizeof
34.在C和C++中,sizeof()操作符可以告诉你为数据分配的字节数,需要该运算符的最大原因是为了移植,而在Java中不需要考虑这些问题,因为它已经被包含在设计里面了;
3.17操作符小节
35.能够对布尔类型进行的运算非常有限,只能赋予它true和false,而不能相加,或者进行其他运算;
36.在char,byte和short类型中,我们可以看到类型的提升,执行完操作符的运算以后,会自动的将其转化为int类型,要想转化为其原来的类型,就需要进行强制类型转化;
注意可能会造成数据丢失;
37.虽然int类型是足够大了,在一定程度上,但是在做乘法时,要注意不要造成数据的溢出,但是编译器不会给出任何的警告,说明编译器还是有一定的限制的;