重学Java(四):操作符-阿里云开发者社区

开发者社区> 沉默王二> 正文

重学Java(四):操作符

简介: 重学Java(四):操作符
+关注继续查看

之前我写了一篇《重学Java(四):对象、引用、堆、栈、堆栈》,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老哥,你真的有8年java开发经验么。。。”(告诉我,为什么要用三个句号。。。而不是三个问号???)鉴于此,我在写这篇《Java操作符真的简单到易如反掌?》时感到惶恐不安,头顶三个大字几乎压得我喘不过气来,哪三个字呢?


——“臣有罪”,外加三个感叹号!!!。


但转念想到北航出版社董老师给我的建议:


你面对的是编程爱好者,或初级技术人员;所以不要担心,你把步骤写清楚,给人一种手把手的感觉,以实践和实例为主,技术原理为辅;让读者从简单开始,引导读者自己往深入的地方钻研。这样的话,你写作的目的也就达成了。


我惴惴不安的心情也就渐渐释然了——别担心那些抵触的声音,写好自己的文章就对了。


一、“=”号的宣言:我不是判官,我只是用来赋值的


记得10年刚参加工作的时候,我的同事小王就因为一行简单的代码被领导骂的狗血喷头。当时小王被骂的那个惨啊,至今我还历历在目。究竟是一行什么代码呢?据我惨痛的回忆,大概是这样的:


if (b = c) {

// ...

}


我那同事小王很明显是想要判断b和c是否相等(==),然而却莫名其妙的少了一个=号,变成了赋值操作;我相信小王绝对不是故意的,只是当时急于和女朋友聊天少写了一个=号而已。但这样的错误竟然没有被编译器发现,因为当b和c是布尔(boolean)类型时,编译器就不会报错提示——这真是小之又小的概率,就这么不幸的被小王撞上了(重要的是被领导当众羞辱)——从此以后,小王对编程失去了信心,实习期没结束,小王就转行做汽车销售了。


悲哀啊!


我和小王相处的时间大概有3个月吧,对他的印象蛮好的,蛮聪明伶俐的一个少年;可惜被这样一个不经意的错误给耽搁了。


是时候给“=”号一个明确的宣言了:我不是判官,我只是用来赋值的;什么意思呢?意思是,取“=”号右边的值(右值),把它复制给左边(左值);右值可以是任何常数、变量或者生成一个值得表达式;但左值必须是一个明确的、已命名的变量。例如,可以将一个字符串赋值给一个变量:


String cmower = "沉默王二,一个不止写程序的全栈工程师";


关键点:


1)得到你的人却得不到你的心;来看这么一段代码:


int i = 520, j = 521;
// 此时的i和j非常恩爱
System.out.println("i=" + i + ",j=" + j);
// 输出:i=520,j=521
// 就当他俩结婚了
i = j;
// 然而i却疯了
i = 250;
// 但j却不为所动
System.out.println("i=" + i + ",j=" + j);
// 输出:i=250,j=521


怎么解释上面这段代码呢?答案是:


基本数据类型在赋值(生动而又不恰当的说法就是结婚吧)的时候,其实是把右值复制给了左值;但在左值发生改变的时候,右值却不会改变。这样的说法其实很绕,简单点的说法是基本类型的赋值是不会相互影响的,和对象引用的赋值是完全不同的;对象引用的赋值是会相互影响的。


2)你若不爱,我便不爱;来看这么一段代码:

class Lover {
    int level;
}
public class OperationalCharacter {

    public static void main(String[] args) {
        testTrueLove();
    }

    public static void testTrueLove() {
        Lover boy = new Lover();
        boy.level = 520;

        Lover girl = new Lover();
        girl.level = 521;

        // 此时的男孩和女孩非常恩爱
        System.out.println("boy.level=" + boy.level + ",girl.level=" + girl.level);
        // boy.level=520,girl.level=521

        // 就当他俩结婚了
        boy = girl;
        // 女孩不爱了
        girl.level = 582;

        // 男孩也不爱了
        System.out.println("boy.level=" + boy.level + ",girl.level=" + girl.level);
        // boy.level=582,girl.level=582
    }

}


怎么解释上面这段代码呢?答案是:


对象引用在赋值的时候,其实改变的是引用的地址;boy = girl;使boy也指向了girl的那个地址。因此,当girl.level改变的时候,boy.level也发生了变化。


3)有钱之后还能保持自我吗?来看这么一段代码:

class Money {
    int coin;
}
public class OperationalCharacter {

    public static void main(String[] args) {
        // 穷光蛋a
        int a = 0;
        
        // 穷光蛋b
        Money b = new Money();
        b.coin = 0;
        
        testQuality(a, b);
        System.out.println("a=" + a + ",b.coin=" + b.coin);
        // 输出:a=0,b.coin=10000000
    }
    
    public static void testQuality(int a, Money b) {
        // 有钱了
        a = 10000000;
        b.coin = 10000000;
    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8611 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26529 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2827 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
2281 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10442 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11930 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4568 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
3723 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载