《 Java 编程思想》CH03 操做符

《 Java 编程思想》CH03 操做符

在最底层,Java中的数据是经过操做符来操做的。java

操做符

  • +,-,*,*=与其余语言相似
  • 几乎全部的操做符只能操做“基本相似”,而===!=是例外
  • String 类支持++=操做符,表示拼接操做,在进行拼接的操做会尝试将非 String 的元素转换为 String(调用tostring())
  • 赋值操做符=的左边(左值)必须是一个明确的已命名的变量。

赋值

在为对象“赋值”时,其实质是拷贝“引用”,须要注意“别名现象”编程

package com.company.ch03;

class Tank {
    int level;
}

public class Assignment {
    public static void main(String[] args) {
        Tank tank1 = new Tank();
        Tank tank2 = new Tank();
        tank1.level = 12;
        tank2.level = 13;
        System.out.println("tank1 = " + tank1.level);
        System.out.println("tank2 = " + tank2.level);

        tank1 = tank2;
        tank1.level++;
        System.out.println("tank1 = " + tank1.level);
        System.out.println("tank2 = " + tank2.level);
    }
}
//tank1 = 12
//tank2 = 13
//tank1 = 14
//tank2 = 14

方法调用中的别名问题

package com.company.ch03;

class Letter {
    char c;
}

public class PassObject {
    static void f(Letter y) {
        y.c = 'z';
    }

    public static void main(String[] args) {
        Letter x = new Letter();
        x.c = 'a';
        System.out.println("x.c = " + x.c); // a
        f(x);
        System.out.println("x.c = " + x.c); // z
    }
}

无论是那种别名问题,关键是要理解到拷贝的是引用,不是对象。函数

算数操做符 & 自增与自减 & 按位操做符

  • 整数除法不会四舍五入,而是直接舍去小数位
  • 其他与C++中的同样

关系操做符

关系操做符与 C++ 也是相似,有一点比较特殊的是在 Java 中==!=能够用在对象上,其比较的是引用,而不是对象内的值,若是要比较两个对象是否相等(语义上),一般调用equals函数来比较。code

Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
n1 == n2; // false
n1.equals(n2); // true

equals默认是比较引用,因此在本身实现的类中须要覆盖equals方法才能进行语义上的比较对象

逻辑操做符

&&,||!操做只能用于布尔值,与C++不一样,对一个非布尔值进行逻辑运算不会对该值强制转换,会报编译错误blog

Java中的逻辑操做符也有“短路”现象字符串

直接常量

  • 十六进制0x/0X前缀+0-9a-f
  • 八进制0前缀+0-8
  • 后缀l/L表示long类型
  • 后缀f/F表示float类型
  • 后缀d/D表示double类型
  • 指数记数法:1.39E-43表示$1.39 \times e^{-43}$

移位操做符

  • 移位操做符只能用于处理整数类型
  • >>符号扩展,>>>0扩展
  • 对 char、byte、short 类型进行移位运算,在进行移位以前会先转回为 int

三元运算符

boolean-exp ? value0 : value1get

字符串操做符 ++=

  • 字符串中操做符 ++=表示“拼接”操做
  • 若是一个表达式以字符串开头,那么其后续操做数都必须是字符串类型(不是则进行强制转换)

类型转换操做符

**类型转换(cast)**是指,在适当的时候,Java 会将一种数据类型自动转换为另外一种。string

显式的类型转换以下:编译

int i = 200;
long l = (long)i;
int j = (int)l;

类型转换:

  • 窄式转换,须要显式指定(如 long 转 int)
  • 扩辗转换,无需显式指定(如 int 转 long)
  • Java容许任何基本类型之间的类型转换,除了布尔值。
  • “类”数据类型不容许类型转换

截尾和舍入

  • 当 float 或 double 转向整型时,老是对数字进行截尾
  • 若是须要舍入,能够调用java.lang.Math.round()

提高

一个表达式中出现的最大的数据类型决定了该表达式最终结果的数据类型,如 int 类型与 long 类型相加,获得一个 long 类型。

Java 没有 sizeof

因为Java中全部基本数据类型的大小都是明确的,因此不须要sizeof。BTW,boolean 不是没有明确嘛。

本文首发于Code & Fun

相关文章
相关标签/搜索