美文网首页
Java操作符

Java操作符

作者: Karma1026 | 来源:发表于2017-03-25 17:08 被阅读55次

在最底层,Java中的数据是通过使用操作符来操作的。Java是建立在C++基础上的,所以C和C++程序员应该非常熟悉Java的大多数操作符。当然,Java也做了也一些改进和简化

1)简单的打印语句

System.out.println("Hello java world!");

2)使用Java操作符

操作符接受一个或多个参数,并生成一个新的值。参数的形式与普通的方法调用不同,但效果是相同的。加号和一元的正号(+)、减号和一元的负号(-)、乘号(*)、除号(/)以及赋值号(=)的用法和其他编程语言类似。

操作符作用于操作数,生成一个新的值。另外,有些操作符可能会改变操作数自身的值,这些被称为“副作用”。那些能改变其操作数的操作符,最普遍的用途就是用来产生副作用;但要记住,使用此类操作符生成的值,与使用没有副作用的操作符生成的值,没有什么区别

几乎所有的操作符都只能操作基本类型,但是也有例外的地方。例外的操作符是“=”、“==”、“!=”,这些操作符能操作所有对象(这个也是对象令人难以理解的地方)。除此之外,String类支持“+”和“+=”操作符

3)优先级

当一个表达式中存在多个操作符的时候,就会存在谁优先执行的问题了。操作符的优先级就决定了各部分的计算顺序。Java对计算顺序做了特别的规定。其中,最简单的规则就是先乘除后加减。如果会忘记其他优先级规则,可以直接用括号明确规定计算顺序。例如以下代码中的(1)和(2):

public class Test {
    public static void main(String[] args) {
        int x = 1;
        int y = 2;
        int z = 3;
        int a = x + y - 2 / 2 + z;//(1)语句
        int b = x + (y - 2) / (2 + z);//(2)语句
        System.out.print("a = " + a + "; b = " + b);
    }
}

输出结果:a=5;b=1

上面两个语句看起来好像没有什么区别,但是从输出结果就可以看出他们是具有不同的含义,而正是使用括号的结果。

请注意:System.out.print()语句中包含“+”操作符。在这种上下文环境中,“+”意味着“字符串连接”,并且如果必要,它还要执行“字符串转换”。当编译器观察到一个String后面紧跟着一个“+”操作符,而这个“+”的后面又紧跟一个非String类型的元素时候,就会尝试着将这个非String类型的元素转换为String。正如输出结果那样,它成功地将a和b从int转换成String了。

4)赋值

赋值使用操作符“=”。它的意思是“取右边的值(即右值),把它复制给左边的值(即左值)”。右值可以是任何常数、变量或者表达式(只要它能生成一个值就行了)。但是左值必须是一个明确的、已经命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。举例来说,可以将一个常数赋给一个变量:a = 4;

但是不能把任何东西赋给一个常数,常数不能作为左值(比如不能说4 = a;)。

对基本数据类型赋值是很简单的。基本类型存储了实际的数值,而非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另外一个地方。例如,对基本数据类型使用a = b;,那么b的内容就复制给a了。若接着又修改了a,而b根本不会受这种修改的影响。

但是在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时候,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另外一个对象”,实际上是将“引用”从一个地方复制到另外一个地方。这意味着假若对对象使用c = d;,那么c和d都指向原本只有d指向的那个对象。我们下面撸一个例子来验证一下:

public class Test {

    public static void main(String[] args) {
        tank1.level=9;
        tank2.level=47;

        System.out.println("1: tank1.level = "+tank1.level+" ;tank2.level = "+tank2.level);

        tank1=tank2;
        System.out.println("2: tank1.level = "+tank1.level+" ;tank2.level = "+tank2.level);

        tank1.level=27;
        System.out.println("3: tank1.level = "+tank1.level+" ;tank2.level = "+tank2.level);
    }
     static class Tank {
        int level;
    }
}

输出结果:

1: tank1.level = 9 ;tank2.level = 47
2: tank1.level = 47 ;tank2.level = 47
3: tank1.level = 27 ;tank2.level = 27

Tank类非常简单,它的两个实例(t1t2)分别在main()里创建,对每个Tank类对象的level域都赋予了一个不同的值,然后,将t2赋给t1,接着又修改了t1。在许多编程语言中,我们可能会期望t1t2总是相互独立的。但由于赋值操作的是一个对象的引用,所以修改t1的同时也改变了t2!这是由于t1t2包含的是相同的引用,它们指向相同的对象。(原本t1包含的对对象的引用,是指向一个值为9的对象。在对t1赋值的时候,这个引用被覆盖了,也就是丢失了;而那个不在被引用的对象会由“垃圾回收器”自动清理。)

相关文章

网友评论

      本文标题:Java操作符

      本文链接:https://www.haomeiwen.com/subject/usdcottx.html