《 Java 编程思想》CH03 操作符

《 Java 编程思想》CH03 操作符

在最底层,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函数来比较。

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

equals默认是比较引用,所以在自己实现的类中需要覆盖equals方法才能进行语义上的比较

逻辑操作符

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

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 : value1

字符串操作符 ++=

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

类型转换操作符

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

显式的类型转换如下:

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 一年又一年,字节跳动 Lark(飞书) 研发团队又双叒叕开始招新生啦!【内推码】:GTPUVBA【内推链接】:ht...
    卢卡斯哔哔哔阅读 274评论 0 1
  • Java byte code 的学习意义 为啥要学java bytecode,这就跟你问我已经会python了为...
    shanggl阅读 1,645评论 0 3
  • 第3章 操作符 在最底层,java的数据是通过使用操作符来操作的。 3.2 使用Java操作符 操作符作用于操作数...
    vernwang阅读 649评论 0 49
  • 赋值 “=”,取右边的值把它复制给左边。基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值时,是直...
    海生2018阅读 187评论 0 0
  • 最近工作中被运算效率问题所困扰,比如大数据排序或者去重,因此现在需要补习一下位移运算。 首先讲一下位移概念? 左位...
    等一夏_81f7阅读 1,148评论 0 0