一篇文章读懂Java语言运算符(即操作符)

计算机的最基本用途之一就是执行数学运算。在最底层,JAVA中的数据是通过使用操作符来操作的。

将操作符以功能为区分进行分组:

  • 算术运算符(执行加减乘除,自增、自减)
  • 关系运算符(判断值与值的关系为真或为假 例如1>2为false)
  • 位运算符(进行按位运算)
  • 逻辑运算符(&&、|| 与 ! 参与逻辑运算)
  • 赋值运算符(赋值予变量)
  • 其他运算符(三元操作符;instance of判断等等)

操作符应用范围

操作符操作一个或多个参数,并产生一个新的参数。在JAVA语言中,   +、-、*、/、=    (加减乘除和等于)的用法与其他语言类似。

操作符一般只能操作“基本类型”,例外是    ①、"=" "==" "!=" 可以操作所有对象    ②、String类型支持"+"和"+="

优先级

①、先乘除后加减。

②、括号优先

赋值

赋值使用操作符“=”,意思是“将右边的值复制给左边”,赋值的条件是左边必须为一个明确,已命名的变量。必须有一个物理空间以存储右边变量的值。

package javaThinking_03;

class Tank{
    int level;
}
public class Assignment {
    public static void main(String[] args) {
        Tank t1 = new Tank();
        Tank t2 = new Tank();
        t1.level = 1;
        t2.level = 2;
        System.out.println("t1:"+t1.level+" t2:"+t2.level);
        t1 = t2; //将t2的引用赋予t1,此时t1的引用将和t2的引用指向同一个对象
        System.out.println("t1:"+t1.level+" t2:"+t2.level);
        t2.level = 3; //将t2指向的对象中的level属性改成3
        System.out.println("t1:"+t1.level+" t2:"+t2.level);
    }
}

输出:

t1:1 t2:2
t1:2 t2:2
t1:3 t2:3

原因在代码注释中已经说明。 这个现象被称为“别名问题”,解决方案是将t1=t2修改为t1.level=t2.level,直接复制右边的值给左边。

自动递增与递减

package javaThinking_03;

public class AutoInc {
    /**
     * 作为操作符++指的是对数据的操作,而i是存储数据的变量;
     * i++指先运行程序,再进行i=i+1操作;
     * ++i指先进行i=i+1操作,再运行程序;
     */
    public static void main(String[] args) {
        int i = 1;
        System.out.println("i++:" + i++);
        System.out.println("++i:" + ++i);
        System.out.println("i:  " + i);
        System.out.println("i--:" + i--);
        System.out.println("--i:" + --i);
        System.out.println("i:  " + i);
    }
}

输出结果:

i++:1
++i:3
i: 3
i--:3
--i:1
i: 1

关系操作符

主要应用于测试对象的等价性。

①、使用==或!=比较对象的引用;

②、使用equals()同样比较对象的引用;

Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);
System.out.println(n1!=n2);
//输出结果:  false true

即使对象n1与n2存储的内容是相同的int类型数据47,但操作符“==”比较的是对象的引用。                

 * equals()方法同样默认比较对象的引用,通过重写equals()也可以达到比较对象内容的效果。                

                                                         

逻辑操作符

逻辑操作符“与”(&&)、“或”(||)、“非”(!)能根据参数的逻辑关系生成一个布尔值。

概念比较简单,其中需要重视的有“短路”的概念,即一旦能够准确无误地确定整个表达式的值,则不再计算表达式余下部分了。短路操作也就是我们常用的"&&" "||"等等,而非短路操作则是对应的"&" "|"等等,非短路条件操作符即使是已经能确定结果也会执行完毕逻辑运算。

那么什么时候用短路操作符,什么时候用非短路操作符呢?为了获得潜在的性能提升,我们在逻辑表达式可能有一部分不必计算的时候推荐使用短路操作符。

移位操作符(小数点移位操作)

①、作用。移位操作符只可用于操作int类型,左移位操作符(<<)能够按操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0),右移位操作符(>>)则按指定的位数将操作符左边的操作数向右移动。

②、作用范围。char,short,byte等类型进行移位处理时,在移位进行之前,它们会先转化为int类型。

三元操作符(一种代码简化写法)

当我们书写if-else表达式的时候,有时候要花费多行的录入,而只是完成简单的判断和择值操作,那么我们如何简化这个过程?

三元操作符的表达式:boolean-exp ? value0:value1  最终得到的结果,仍旧是一个值。

它的逻辑:如布尔值为真,则选择左边的值value0,如布尔值为假,则选择右边的值value1。但是,如果不够熟悉,使用它仍旧可能引起令代码难以理解的问题,请考虑后予以使用。

类型转换操作符

在适当的时候,java会将一种数据类型自动转换为另一种。加入我们为一个float变量赋予一个1的整数值,编译器会将int自动转换为float。Java允许我们把任何基本数据类型转化为其他基本数据类型,但布尔值不允许转换。

①、截尾和摄入

java.lang是所有类默认的导包,调用时不需要额外导入。我们在做四舍五入的时候,只需要调用java.lang.Math中的round()方法:

//四舍五入测试
public class mathRound(){
    public static void main(){
         double b1=0.7,b2=0.4;
         float f1=0.7f,f2=0.4f;            
         System.out.print(Math.round(b1)+" "+Math.round(b2));
         System.out.printf(Math.round(f1)+" "+Math.round(f2));
    }
}

打印结果:

1,0 

1,0

②、基本数据类型操作提升

高精度与相对低精度类型执行算数运算,则最生成结果为高精度类型。比如int值与float值做运算,最终生成的结果为float。float值与double值做运算,得出结果为double

总结:Java语言的操作符其实与C语言很类似,是实现一门编程语言数学运算的令箭。通过在用途上理解,在实际工作中会经常用到,当我们熟悉使用后,应该总结的下一步是,如果在应用操作符解决问题时取得最优解?

猜你喜欢

转载自www.cnblogs.com/Levierx/p/9913732.html