3.1 更简单的打印语句
静态导入(static import)
import java.util.*;
import static net.mindview.util.Print.*;
public class HelloDate{
public static void main(String[] args){
print("Hello, it's ");
print(new Date());
}
}
3.2 使用Java操作符
操作符作用于操作数,生成一个新值。有些操作符可能会改变操作数自身的值,这被称为“副作用”。那些能改变操作数的操作符,最普遍的用途就是用来产生副作用。
几乎所有的操作符都只能操作“基本类型”。例外的操作符是=、==、!=,这些操作符能操作所有的对象。除此之外,String类支持“+”和“+=”。延展——使用方法操作非基本类型(对象),比如math里面的add方法等。
3.3 优先级
不必记得所有的操作符的优先级,可使用括号明确规定计算顺序。
3.4 赋值
对基本数据类型的赋值是值传递,即直接将一个地方的内容赋值到另外一个地方(不同的存储地址)。
对对象的赋值是引用传递,即将“引用”从一个地方赋值到另外一个地方,两个引用指向的是同一个对象(同一个存储地址)。
别名现象:将同一个对象的引用赋值给两个不同的变量,比如:
Class t1 = new Class();
Class t2 = t1;
3.4.1 方法调用中的别名问题
class A{
int x;
}
public class B{
static void function(A a){
a.x = "b";
}
}
public static void main(String[] args){
A a =new A();
a.x = "c";
function(a); //实际改变的方法function之外的对象a
}
3.5 算术操作符
+、-、*、/、%(取模,他从整数除法中产生余数。)
3.5.1 一元加、减操作符
一元减号(-,取反)、一元加号(+,将较小类型的操作数提升为int)
3.6 自动递增和递减
前缀递增和递减:先执行运算,再生成值;
后缀递增和递减:先生成值,再执行运算。
3.7 关系操作符
关系操作符生成的是一个boolean结果:<、>、<=、>=、==、!=
3.7.1
==和!=比较基本类型时,比较的是值;而比较对象时,比较的是对象的引用。因而比较两个对象的实际内容时,必须使用equals()方法,但equals方法默认比较的也是引用,所以如果要比较实际内容,需要重写equals方法。
class Value{
int i;
}
public class EqualsMethod{
public static void main(String[] args){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2)); // false
v1 = v2;
System.out.println(v1.equals(v2)); // true
}
}
3.8 逻辑操作符
根据参数的逻辑关系,生成一个布尔值:&&、||、!
//!:注释语句,这种注释语法使得注释能够被自动移除以方便测试
3.8.1 短路
短路算法有助于获得潜在的性能提升。
3.9 直接常量
使用直接常量相关的某些字符来额外增加一些信息,让编译器可以准确的知道要生成什么样的类型。
L/l:long
F/f:float
D/d:double
前缀0x(0X):十六进制
前缀0:八进制
可使用Integer或者Long的toBinaryString()方法显示二进制。注意:如果将比较小的类型(short、byte)传递给Integer.toBinaryString()方法,则该类型将自动转换为int。
3.10 按位操作符
按位操作符用来操作整数基本数据类型中的当个“比特”(bit),即二进制位。
&:按位“与”
|:按位“或”
^:按位“异或”
~:按位“非”,取反操作符,属于一元操作符
按位操作符具有与逻辑操作符相同的效果,区别在于按位操作符不会中途“短路”。
3.11 移位操作符
移位操作符操作的运算对象也是二进制“位”,且值可用来处理整数类型。
左移位操作符(<<):能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)。
“有符号”右移操作符(>>):按照操作符左侧指定的位数将操作符右边的操作数向右移动。“有符号”右移位操作符使用“符号扩展”:若符号为正,则在高位补0,若符号为负,则在高位补1。
“无符号”右移操作符(>>>):它使用“零扩展”,无论正负,都在高位插入0。
3.12 三元操作符 if-else
三元操作符也称为条件操作符,它显得比较特别,因为它有三个操作数:
boolean-exp ? value1 : value2
3.13 字符串操作符 + 和 +=
连接不同的字符串。
3.15 类型转换操作符
int i = 100;
long lng1 = (long)i;
long lng2 =(long)200;
窄化转换(narrowing conversion):将容纳更多信息的数据类型转换成无法容纳那么多信息的类型,比如Object转换为String。这种情况可能面临信息丢失的危险。这个时候,编译器要求显示强制进行类型转换。
扩展转换(widening conversion):不必显示的进行类型转换,不会造成信息的丢失。
Java允许把任何基本数据类型转换成别的基本数据类型,但布尔类型除外,后者根本不允许进行任何类型的转换处理。“类”数据类型不允许进行类型转换,除非采用特殊的方法:继承。
3.15.1 截尾和舍入
将folat或double转型为整型值时,总是对该数字执行截尾。如果想要得到舍入的结果,就需要用到java.lang.Math中的round()方法。
3.15.2 提升
表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。