第三章 操作符

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 提升

表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。

你可能感兴趣的:(第三章 操作符)