GVKun编程网logo

4、Java的运算符(java中运算符)

23

想了解4、Java的运算符的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java中运算符的相关问题,此外,我们还将为您介绍关于14、Java的异常、2、Java运算符、6、Java运算符、

想了解4、Java的运算符的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java中运算符的相关问题,此外,我们还将为您介绍关于14、Java的异常、2、Java运算符、6、Java运算符、8. Java的运算符的新知识。

本文目录一览:

4、Java的运算符(java中运算符)

4、Java的运算符(java中运算符)

运算符:进行特定操作的符号,例如:+,-,*,/,==,>=等等

下面对运算符进行分类:

算数运算符:1、+ 加法

                  2、- 减法

                  3、* 乘法

                  4、/ 除法

                  5、% 取模(取余数)

                  6、++ 自加

                  7、-- 自减

注意:运算当中有不同类型的数据,那么结果将会是数据类型范围大的那种,涉及数据类型的自动转换。

加法“+”常见的三种用法:1、对于数值来说,那就是数学加法

                                   2、对于字符char类型来说,在计算之前,先转换成int再进行计算

                                   3、对于字符串String来说,加法代表字符串连接。

public class Demo {
    public static void main(String [] args){
        String str = "hello";
        int num1 = 10;
        int num2 = 20;
        char c =''a'';
        System.out.println(str+num1);//hello10
        System.out.println(num1+num2);//30
        System.out.println(num1+c);//107

    }
}

自加,自减运算符:

基本用法:变量值自身加1,或自身减1

使用格式:写在变量名称之前,或者写在变量名称之后,,例如:++num,num++

使用方法:1、单独使用:不和其他任何操作混合,自己独立成为一个语句

               2、混合使用:和其他操作混合,例如:a + b++;

注意:在混合使用的时候,如果是++num ,先自加1,再使用;如果是num++先使用,后自加1。自减同理。

public class Demo {
    public static void main(String [] args){
        int num1 =10;
        int num2;
        num2=num1++;
        System.out.println(num2);//10
        num2=++num1;
        System.out.println(num2);//12
    }
}

赋值运算符:1、= 赋值,将右边的值赋值给左边

                  2、+= ,将左边的值加上右边的值,赋值给左边 例如:a += 1 等价与 a=a+1

                  3、-=, 将左边的值减去右边的值,赋值给左边 

                  4、*=, 将左边的值乘与右边的值,赋值给左边

                  5、/=, 将左边的值除与右边的值,赋值给左边

                  6、%=,将左边的值取模右边的值,赋值给左边

注意:赋值运算符内部自带强制类型转换,例如 short a +=5;得到的结果还是short 类型

public class Demo {
    public static void main(String [] args){
        int num1 =10;
        int num2=0;
        num2 +=num1;
        System.out.println(num2);//10
        short num3 =0;
        num3 +=num1;
        System.out.println(num3);//10

    }
}

比较运算符:1、== ,等于

                  2、> ,大于

                  3、< , 小于

                  4、>=,大于等于

                  5、<=,小于等于

                  6、!= ,不等于

注意:比较之后的结果返回一个boolean值。不允许进行多次比较,例如 -1 < x < 1。

public class Demo {
    public static void main(String [] args){
        int num1 =10;
        int num2=0;
        System.out.println(num1>num2);//true

    }
}

逻辑运算符:1、&& ,与,一假即假 例如 3>4 && 6>7

                  2、|| ,或,一真即真

                  3、!,非,取反

注意:逻辑运算符具有短路效果,如果根据左边能判断出最终结果,那么右边的代码将不会执行。

public class Demo {
    public static void main(String [] args){
        int num1 =10;
        int num2=0;
        int num3=20;
        System.out.println(num1>num2&&num1<num3);//true

    }
}

运算符还能分类为:1、一元运算符,只需要一个数据就可以进行操作的运算符,例如 :!,++,--

                           2、二元运算符,需要两个数据才可以进行操作的运算符,例如:+,-,*,等等

                           3、三元运算符,需要三个数据才能进行操作的运算符,例如:?

三元运算符使用: 数据类型 变量名称= 条件判断?表达式A :表达式B

首先判断条件是否成立:如果成立,将表达式A的值赋值给变量,否则将表达式B的值赋值给变量。

注意:必须同时保证表达式A和表达式B符合左侧数据类型的要求,且三元运算符的结果必须被使用。

public class Demo {
    public static void main(String [] args){
        int num1 =10;
        int num2=0;
        int num3;
        num3 =num1>num2?num1:num2;
        System.out.println(num3);//10
    }
}

14、Java的异常

14、Java的异常

异常:指的是程序在执行过程中,出现非正常的情况,最终会导致JVM的非正常停止。

当出现异常时:JVM会做两件事:1、JVM会根据异常产生的原因创建一个异常对象,这个异常对象包含了异常产生的原因(内容,原因,位置)

                                             2、没有异常处理的逻辑,那么JVM就会把异常对象抛出给方法的调用者来处理这个异常。

                                             3、如果调用方法也没有异常的处理逻辑,把异常抛给JVM处理

                                             4、JVM接收到这个异常对象,做两件事:把异常对象(内容,原因,位置)以红色的字体打印在控制台,并且终止执行程序

异常处理的五个关键字:try,catch,finally,throw,throws

 

throw:可以使用throw关键字在指定的方法中抛出指定的异常

使用格式:throw new XXXException(“异常产生的原因”);

注意:1、throw关键字必须写在方法的内部

         2、throw关键字后边new的对象必须是Exception或者Exception的子类对象

         3、throw关键字抛出指定的异常对象,我们就必须处理这个异常对象

                    throw关键字后边创建的是运行期异常,我们可以不处理,交给JVM处理(打印异常,中断程序)

                    throw关键字后边创建的是编译期异常,我们必须处理这个异常,要么throws或者try....catch

示例代码:

public class Demo {
    public static void main(String[] args) {
        int [] arr=new int[10];
        System.out.println(arr.length);
        System.out.println(getElement(arr,2));
    }

    public static int getElement(int[] arr,int index){
        if (arr==null){
            throw new NullPointerException("数组为空");
        }

        if (index<0||index>(arr.length-1)){
            throw new ArrayIndexOutOfBoundsException("索引超出");
        }

        return arr[index];
    }
}

throws:异常处理的第一种方式,交给别人处理,可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,交给别人处理),最终交给JVM处理,,中断程序

throws的使用格式:修饰符 返回值类型 方法名(参数列表)throws AAAexception,BBBException{

                                throw new AAAException (“产生原因”);

                                throw new BBBException ("产生原因");

}

注意:1、throws关键字必须写在方法的声明处

         2、throws关键字后边声明的异常必须是Exception或者是Exception的子类

         3、方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常

                       如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可

         4、调用了一个声明抛出异常的方法,我们就必须的处理声明的异常

                        要么继续使用throws声明抛出,交给调用者处理,最终交给JVM

                        要么try....catch自己处理异常

public class Demo {
    public static void main(String[] args)throws NullPointerException,ArrayIndexOutOfBoundsException {
        int [] arr=new int[10];
        System.out.println(arr.length);
        System.out.println(getElement(arr,11));
    }

    public static int getElement(int[] arr,int index) throws NullPointerException,ArrayIndexOutOfBoundsException{
        if (arr==null){
            throw new NullPointerException("数组为空");
        }

        if (index<0||index>(arr.length-1)){
            throw new ArrayIndexOutOfBoundsException("索引超出");
        }

        return arr[index];
    }
}

try...catch:异常处理的第二中方式,捕获异常,自己处理异常

格式:

try{

                可能产生异常的代码

}catch(异常变量){

                异常处理的逻辑,一般在工作中,会把异常的信息记录到一个日志中

}catch(异常变量){}

注意:1、try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常

         2、如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码

         3、如果try中没有产生异常,那么就不会执行catch中的异常的处理逻辑,执行完try中的代码,继续执行try...catch之后的代码

直接对上面的代码的主函数做下面修改:

     

public class Demo {
    public static void main(String[] args){
        int [] arr=new int[10];
        System.out.println(arr.length);
        getElement(arr,11);
    }

    public static void getElement(int[] arr,int index) {
        try{
            System.out.println(arr[index]);
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

throwable:异常的超类,三种处理异常的方法:1、String getMessage(),异常的简单描述

                                                              2、String toString(),异常的详细描述

                                                              3、void printStackTrace(),JVM打印异常对象默认调用此方法,最详细

 

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到,而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的

格式:在try...catch后面添加finally 

public class Demo {
    public static void main(String[] args){
        int [] arr=new int[10];
        System.out.println(arr.length);
        getElement(arr,11);
    }

    public static void getElement(int[] arr,int index) {
        try{
            System.out.println(arr[index]);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("我一定有");
        }

    }
}

多个异常捕获处理方式:1、多个异常分别处理,一个try对应一个catch

                                 2、多个异常一次捕获,多次处理,一个try对应多个catch,如果异常变量存在子父类关系,子类必须在上边

                                 3、多个异常一次捕获,一次处理,只有一个try对应一个catch,catch里的异常变量是所有异常的父类

 

 

2、Java运算符

2、Java运算符

一、算术运算符

+:加法运算符

-:减法运算符

*:乘法运算符

/:除法运算符

说明两点:(1)如果除法运算符两个操作数都是整数类型,则计算结果也是整数。当被除数位为整数时,此时除数不能为0,否则会引起异常。

1 jshell> 19/7
2 $1 ==> 2
3 
4 jshell> 4/0
5 |  异常错误 java.lang.ArithmeticException:/ by zero
6 |        at (#2:1)

(2)如果出发运算的两个操作数有一个为浮点数时。则计算结果也是浮点数(自动转换)。此时除数可以为0或0.0,得到的结果为无穷大。

 1 jshell> 5/2
 2 $1 ==> 2
 3 
 4 jshell> 5.0/2
 5 $2 ==> 2.5
 6 
 7 jshell> 5.0/0
 8 $3 ==> Infinity
 9 
10 jshell> 0.0/0
11 $4 ==> NaN
12 
13 jshell> 0.0/0.0
14 $5 ==> NaN
15 
16 jshell>

%求余运算符

它的计算结果是使用第一个操作数除以第二个操作数,得到一个整数的结果后剩下的值就是余数。求余运算符的第二个操作数不能为0,若是求余运算符的两个操作数有一个为浮点数时,则允许第二个操作数为0或0.0,只是求余的结果是非数。

 1 jshell> 4%3
 2 $1 ==> 1
 3 
 4 jshell> 5.2%2
 5 $2 ==> 1.2000000000000002
 6 
 7 jshell> 2.0%0
 8 $3 ==> NaN
 9 
10 jshell>

++:自加/--:自减

注意:(1)自加/自减放在变量前后会有区别;

 1 class 自加自减 
 2 {
 3     public static void main(String[] args) 
 4     {
 5         int a=10;
 6         System.out.println(a++);//,先输出,后自加,输出为10
 7         int b=20;
 8         System.out.println(--b);//先自减,后输出,输出为19
 9     }
10 }

(2)自加和自减只能操作变量,不能用于操作数值的直接量、常量和表达式。例如:5++、6--等用法错误

二、位运算符

一般来说,位操作符只能操作整数类型(默认为int类型变量 32位)的变量或值

2.1 位逻辑运算符

运算符 含义 单目/双目运算符 实例 & 双目运算符 4&5=4 | 双目运算符 4|5=5 ^ 异或 双目运算符 4^5=1 ~ 单目运算符 ~4=-5

 

 

 

 

 

 

 1 class  位逻辑运算符
 2 {
 3     public static void main(String[] args) 
 4     {
 5         System.out.println(5&4);
 6         System.out.println(5|4);
 7         System.out.println(5^4);
 8         System.out.println(~4);
 9     }
10 }

 

 2.2 位移运算符

运算符 含义 << 将操作数的二进制码整体左移指定位数,左移后右边空出来的位以0填充 >> 将操作数的二进制码整体右移指定位数,右移后右边空出来的位以符号位填充。即如果第一个操作数是正数,则左边补0;如果第一个操作数为负数,则左边补1 >>> 无符号右移,他把第一个操作数二进制码右移指定位数,左边空出来的位总是以0补充

 

 

 

 

 

  

左移运算符

1 System.out.println(-8<<2);//输出为-32

-8的原码:1000_0000_0000_0000_0000_0000_0000_1000

-8的反码:1111_1111_1111_1111_1111_1111_1111_0111

-8的补码:1111_1111_1111_1111_1111_1111_1111_1000

左移两位:1111_1111_1111_1111_1111_1111_1110_0000

左移两位的反码:1111_1111_1111_1111_1111_1111_1101_1111

左移两位的原码:1000_0000_0000_0000_0000_0000_0010_0000   结果为-32

无符号右移运算符和有符号右移运算符

1 jshell> -5>>2
2 $1 ==> -2
3 
4 jshell> -5>>>2
5 $2 ==> 1073741822
6 
7 jshell>

-5的原码:1000_0000_0000_0000_0000_0000_0000_0101

-5的反码:1111_1111_1111_1111_1111_1111_1111_1010

-5的补码:1111_1111_1111_1111_1111_1111_1111_1011

-5>>2过程:

-5>>2: 1111_1111_1111_1111_1111_1111_1111_1110

-5>>2的反码:1111_1111_1111_1111_1111_1111_1111_1101

-5>>2的原码:1000_0000_0000_0000_0000_0000_0000_0010    结果位-2

-5>>>2过程:

-5>>>2:0011_1111_1111_1111_1111_1111_1111_1110  

1 jshell> int a=0b0011_1111_1111_1111_1111_1111_1111_1110
2 a ==> 1073741822

三、赋值运算符和复合后的赋值运算符

 赋值运算符为变量指定变量的值,通常用赋值运算符将一个直接量赋值给变量。与python、C语言相通,这里不多做解释。

所有的二进制位运算符都有一种将赋值与位运算组合在一起的简写形式。复合位赋值运算符由赋值运算符与位逻辑运算符和位移运算符组合而成。

复合赋值运算符 含义 复合赋值运算符 含义 += 对于x+=y,即对应与x=x+y &= 对于x&=y,即对应与x=x&y -= 对于x-=y,即对应与x=x-y |= 对于x|=y,即对应与x=x|y *= 对于x*=y,即对应与x=x*y ^= 对于x^=y,即对应与x=x^y /= 对于x/=y,即对应与x=x/y <<= 对于x<<=y,即对应与x=x<<y %= 对于x%=y,即对应与x=x%y >>= 对于x>>=y,即对应与x=x>>y     >>>= 对于x>>>=y,即对应与x=x>>>y

 

 

 

 

 

 

只要能够使用复合运算符,通常推荐使用它们:

class 复合运算符 
{
    public static void main(String[] args) 
    {
        byte a=2;
        /*
         *下面的语句将出错————不兼容的类型: 从int转换到byte可能会有损失
         *因为5是int类型,a+5将进行自动类型转换
         *把一个int型变量赋值给byte类型的变量,将出错
         */
         //a=a+5;

         //下面的用法不会报错
         byte b=a;
         b+=5;
         System.out.println(b);
    }
}

虽然a=a+5与b+=5虽然运行结果相同,但是底层运行机制还是存在一定的差异。所以可以使用这种复合运算符,则推荐使用它们。

四、比较运算符

比较运算符 含义 > 大于,只支持左右两边的操作数是数值类型。如果第一个操作数大于第二个操作数,则返回true >= 大于等于,只支持左右两边的操作数是数值类型。如果第一个操作数大于等于第二个操作数,则返回true < 大于,只支持左右两边的操作数是数值类型。如果第一个操作数小于第二个操作数,则返回true <= 小于等于,只支持左右两边的操作数是数值类型。如果第一个操作数小于等于第二个操作数,则返回true ==

等于,(1)对于两个操作数都是数值类型,如果它们的值相等,则返回true

(2)对于两个操作数都是引用类型,那么只有两个引用变量具有父子关系,且两个引用必须指向同一个对象才会返回true

(3)也支持两个boolean类型的值进行比较,例如:false==true将返回false

!=

不等于,(1)对于两个操作数都是数值类型,如果它们的值不相等,则返回true

(2)对于两个操作数都是引用类型,那么只有两个引用变量具有父子关系,且两个引用不指向同一个对象才会返回true

(3)也支持两个boolean类型的值进行比较,例如:false==true将返回true

 

 

 

 

 

 

 

 

 

 

 

 

实例:

 1 class 比较运算符 
 2 {
 3     public static void main(String[] args) 
 4     {
 5         System.out.println("5大于4:"+(5>4));
 6         System.out.println("97等于a:"+(97==''a''));
 7         System.out.println("ture不等与false:"+(true!=false));
 8 
 9         //创建2个比较运算符对象
10         var t1=new 比较运算符 ();
11         var t2=new 比较运算符 ();
12         //t1,t2是同一个类的两个实例引用,所以可以比较
13         //但t1和t2引用不同的对象,所以返回false
14         System.out.println("t1等于t2:"+(t1==t2));
15 
16         //定义t3=t1,即t1,t2来自同一类的两个实例且指向同一对象
17         var t3=t1;
18         System.out.println("t3等于t1:"+(t1==t3));
19     }
20 }

执行结果:

 五、逻辑运算符

逻辑运算符 含义 &&  与 ;&& 与  前后两个操作数必须都是true才返回true,否则返回false 不短路与 ; & 不短路与 表达式都会执行到 || 或; || 或 只要两个操作数中有一个是true,就返回true,否则返回false | 不短路或 ;| 不短路 或 表达式都会执行到 非;! 非 ,如果操作数为true,返回false,否则,返回true ^ 异或;^ 异或 ,当两个操作数不相同时返回true,返回false

 

 

 

 

 

 

实例:

 1 class 逻辑运算符
 2 {
 3     public static void main(String[] args) 
 4     {
 5         var a=10;
 6         var b=5;
 7 
 8         //短路与&& 当第一个条件不满足时,不会判断第二个条件
 9         if(a>15&&a++>2)
10         {
11         }
12         System.out.println("a的值为:"+a);
13 
14         //不短路与& 当第一个条件不满足时,人然会判断第二个条件
15         if(b>6&b++>2)
16         {
17         }
18         System.out.println("b的值为:"+b);
19     }
---------- 运行Java ----------
a的值为:10
b的值为:6

输出完成 (耗时 0 秒) - 正常终止

  六、三目运算符

三目运算符只有一个:?:,三目运算符的语法格式如下:

1 (expression)? if-true-statement:if-false-statement;
class 三目运算符 
{
    public static void main(String[] args) 
    {
        String str=5>3?"5大于3":"5小于3";
        System.out.println(str);

        //三目运算符和if else功能相当

        String str1=null;
        if(5>3)
        {
            str1="5大于3";
        }
        else
        {
            str1="5小于或等于3";
        }
        System.out.println(str1);
    }
}
---------- 运行Java ----------
5大于3
5大于3

输出完成 (耗时 0 秒) - 正常终止

6、Java运算符

6、Java运算符

运算符的分类

算数运算符

二元运算符

算术运算符中 = - * / % 属于二元运算符,二元运算符指的是需要两个操作数才能完成的运算的运算术。 整数运算规则

1、如果两个操作数有一个为Long,则结果也为Long。 2、如果没有Long,结果则为int,即使操作数为short、byte,结果也为int。

    int a =1;
    long b = 2;
    //int c = a + b; //报错 因为有一个为Long,则结果也为Long
    
    byte a1 = 1;
    short a2 = 1;
    int d = a1 + a2; //正确 因为如果没有Long,结果则为int

浮点运算规则

1、如果两个操作数有一个为double,则结果为double。 2、只有两个操作数都为float,结果才为float。

    double a = 1.1;
    //float b = a + 2.2f; //报错,因为操作数有一个为double,则结果为double

取模运算:其操作数可以为浮点数,一般使用整数,结果是余数,余数符号和左边操作数相同。

一元运算符

一元运算符是该类运算只需要一个操作数的时候,比如:++,--

    int a = 2;
    int b = a++; //先是执行,b = 3,然后运算完以后再给a自增。
    System.out.println("a=" + a + "\tb=" + b);
    //运行结果:a=3	b=2
    
    a = 2;
    b = ++a; //先是执行a的自增,然后再赋值给b
    System.out.println("a=" + a + "\tb=" + b);
    //运行结果:a=3	b=3

赋值运算符

    int a = 2;
    int b = 3;
    a+=b;       //这个相当于a = a + b;
    System.out.println("a=" + a);
    //结果为:a = 5
    
    a = 2;
    a *= b + 3;     //这个相当于 a = a * (b + 3)
    //是先运算后面的,再运算前面的
    System.out.println("a=" + a);
    //结果为:a = 12;

关系运算符

关系运算符号是用来比较的,所以返回值只会是boolean,只有true/false

    int a = 2;
    int b = 3;
    boolean c = b > a;
    System.out.println("c="+c);
    //结果为:c=true

注意事项:

  • == 和 != 是所有类型,引用和基本数据类型都可以用的。
  • .>、<、>=、<=只是针对于数值类型,还有char可以使用。

逻辑运算符

Java中逻辑运算符的操作数和结果都是boolean类型的。

    boolean a = true;
    boolean b = false;
    //逻辑与 &
    //只有同时为true的时候才返回true,只要有一个为false,返回false
    boolean c = a & b;
    System.out.println("c=" + c);
    //结果为:c=false;

    //逻辑或 |
    //只要有一个值为true,结果就为true
    c = a | b;
    System.out.println("c=" + c);
    //结果为:c=true

    //逻辑非
    //取a的相返的值,如果a为true,c则为false,如果a为false,c则为true
    c = !a;
    System.out.println("c=" + c);
    //结果为:c=false;

    //逻辑异或
    //两个值相同的时候为false,不同的时候为true
    c = a ^ b;
    System.out.println("c=" + c);
    //结果为:true

    //短路或
    //因为逻辑或只要有一个值为true,结果就为true,但是还是为验证第二个值
    //短路或不一样,只要第一个值为true,第二个值就不验证了,直接返回true,这样做是为了提高效率。
    c = a || b;
    System.out.println("c=" + c);
    //结果为:c=true

    //短路与
    //因为逻辑与必须两个都为true,结果才为true,只要有一个为false结果就为false
    //短路与不一样,只要第一个值为false,结果就为false,第二个值就不验证了,这样做是为了提高效率。
    c = b && a;
    System.out.println("c=" + c);
    //结果为:false

位运算符

位运算符是进行二进制运算的。

    int a = 3;
    int b = 4;

    //取返操作
    System.out.println("~a=" + ~a);
    //结果为:~a=-4

    //按位与
    System.out.println("a&b=" + (a&b));
    //3的后四位二进制为 0011
    //4的后四位二进制为 0100
    //与 运算符是相同的为 1 不同的为 0 所以最后的结果为 0000
    //结果为:a&b = 0

    //按位或
    System.out.println("a|b=" + (a|b));
    //3的后四位二进制为 0011
    //4的后四位二进制为 0100
    //或 运算符是只要有一个为1,就为1 所以结果为 0111
    //结果为:a|b = 7

    //按位异或
    System.out.println("a^b=" + (a^b));
    //3的后四位二进制为 0011
    //4的后四位二进制为 0100
    //异或 运算符是不同的为1,相同的为0 所以最后结果为 0111
    //结果为:a^b = 7

    //左移运算符 <<
    //这个运算符的右边是要移运的位数,左边才是要运算的值
    System.out.println("a<<1=" + (a << 1));
    //向左边移动一位数是把a乘以2 , 所以结果是 3 * 2
    //结果为:6

    //右移运算符 <<
    //这个运算符的右边是要移运的位数,左边才是要运算的值
    System.out.println("a>>1=" + (a >> 1));
    //向右边移动一位数是把a除以2 , 所以结果是 3 / 2
    //结果为应该为1.5的,但是因为是整数运算,算动取整,所以才为1
    //结果为:a>>1=1
    System.out.println("b>>1=" + (b >> 1));
    //结果为:b>>1=2

& 、| 、^ 运算符:如果运算符,如果运算两边是boolean类型的值,那么这三个运算符就是逻辑运算符,如果是数值类型的,就是位运算符号。

字符串连接符

在我们前面的例子中,我们使用了 + 号,但是有的地方的 + 号不参与运算,是因为,这个时候, + 号变成了一个连接符号了,它变成连接符号的条件是 左右两边只要有一个String 类型的字符串,就会变成连接符号。

    int a = 2;
    //这里的3为字符串,由双引号引起来的都是字符串
    System.out.println(a + "3");
    //结果为:23

条件运算符

条件运算符号也叫三目条件运算符号。格式为:

x ? y : z

  这个运算表达式,有三个参数,x只能为boolean,另外两个参数可以为任意类型。

    boolean a = true;
    boolean b = false;
    System.out.println("第一个参数为true="+(a?"输出为true":"输出为false"));
    System.out.println("第一个参数为false="+(b?"输出为true":"输出为false"));
    //结果为:
    //第一个参数为true=输出为true
    //第一个参数为false=输出为false

这个三目运算符可以做一些小的判断,但是如果是情况复杂的最好还是用if else来进行计算。

运算符优先问题

  运算符的优先级不用特地的记,只要看看就可以了,因为工作的时候,复杂的运算符号,都会有小括号来进行组织的。不会全都按照运算符号优先级来进行设计。

<br> <hr> <center>

细节决定成败! 个人愚见,如有不对,恳请扶正!

</center>

8. Java的运算符

8. Java的运算符

计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。

我们把运算符具体分为:算数运算符,比较运算符,逻辑运算符,位运算符,赋值运算符,条件运算符,instanceof 运算符。

1. 算数运算符

算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。

操作符 名称 描述
+ 加法 相加运算符两侧的值
减法 左操作数减去右操作数
* 乘法 相乘操作符两侧的值
/ 除法 左操作数除以右操作数
% 取余 左操作数除以右操作数的余数
++ 自增 操作数的值增加1
自减 操作数的值减少1

以下代码:

public static void main(String[] args) { int a = 5; int b = 10; System.out.println("“+” 运算:"+(a+b)); System.out.println("“-” 运算:"+(a-b)); System.out.println("“*” 运算:"+(a*b)); System.out.println("“/” 运算:"+(a/b)); System.out.println("“%” 运算:"+(a%b)); System.out.println("“++” 运算:"+(a++)); System.out.println("“--” 运算:"+(a--)); } 

输出结果:
“+” 运算:15
“-” 运算:-5
“*” 运算:50
“/” 运算:0
“%” 运算:5
“++” 运算:5
“–” 运算:6

另外,进行除法运算时,若两个操作数是整型的,结果也会是整型的,舍弃掉小数部分;如果有一个数是浮点数,结果将自动转型为浮点型。进行取余运算时,若两个操作数是整型的,结果也会是整型的,如果有一个数是浮点数,结果将自动转型为浮点型

**其中,自加和自减运算符针对一个数值本身的运算;且前缀自增自减(++a,–a)是先进行自增或者自减运算,再进行表达式运算。后缀自增自减(a++,a–)是先进行表达式运算,再进行自增或者自减运算。我们给出例子:

 public static void main(String[] args) { int a = 5; int b1 = 10; int b2 = 10; int c1 = 10; int c2 = 10; System.out.println("前缀自增b1参与表达式计算后值为:"+(a*++b1)); System.out.println("后缀自增b2参与表达式计算后值为:"+(a*b2++)); System.out.println("前缀自减b1参与表达式计算后值为:"+(a*--c1)); System.out.println("后缀自减b2参与表达式计算后值为:"+(a*c2--)); } 

2. 比较运算符

比较运算符的结果一定是boolean类型,也叫关系运算符

操作符 名称 描述
> 大于 相加运算符两侧的值
< 小于 左操作数减去右操作数
== 等于 相乘操作符两侧的值
>= 大于等于 左操作数除以右操作数
<= 小于等于 左操作数除以右操作数的余数
!= 不等于 操作数的值增加1

如,

 public static void main(String[] args) { int a = 5; int b = 10; System.out.println(a > b ); System.out.println(a < b ); System.out.println(a == b ); System.out.println(a >= b );**** System.out.println(a <= b); System.out.println(a != b ); } 

输出结果:
false
true
false
false
true
true
注意,比较运算符“==”用来比较基本数据类型是比较的是值是否相等,比较引用数据类型是比较的是引用是否相等,引用数据类型用equals()来比较字面量是否相等。

3. 逻辑运算符

操作符 名称 描述
&& 短路与 当且仅当两个操作数都为真,条件才为真。
& 逻辑与 当且仅当两个操作数都为真,条件才为真。
| | 短路或 如果任何两个操作数任何一个为真,条件为真。
| 逻辑或 如果任何两个操作数任何一个为真,条件为真。
! 逻辑非 用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false

逻辑运算符中,“与”运算符和“或”运算符都有两个,“&&”我们称之为短路与。“||”我们称之为短路或,短语与“&&”从左到右一次判断,遇到false则停止判断,得出结果未false;逻辑与“&”从左到右一次判断,直至结束。短语或“||”从左到右一次判断,遇到true则停止判断,得出结果未true;逻辑或“|”从左到右一次判断,直至结束。我们给出例子:

 public static void main(String[] args) { int a = 5; int b = 10; //短路与,前一个表达式的值为false,不在判断下一个表达式,故a++不执行 System.out.print((a>b)&&(a++ == 1)); System.out.println(" a的值:"+ a); //逻辑与,前一个表达式的值为false,仍依次判断下一个表达式 System.out.print((a>b)& (a++ == 1)); System.out.println(" a的值:"+ a ); //短路或,前一个表达式的值为true,不在判断下一个表达式,故a++不执行 System.out.print((a<b)|| (b++ == 1)); System.out.println(" b的值:"+ b ); //逻辑或,前一个表达式的值为true,仍依次判断下一个表达式 System.out.print((a<b)| (b++ == 1)); System.out.println(" b的值:"+ b ); //非运算符 System.out.print(!(a<b)); } 

4. 位运算符

Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算符作用在所有的位上,并且按位运算。

操作符 名称 描述
& 按位& 如果相对应位都是1,则结果为1,否则为0
| 按位或 如果相对应位都是0,则结果为0,否则为1。
^ 异或 如果相对应位值相同,则结果为0,否则为1
~ 按位取反 翻转操作数的每一位,即0变成1,1变成0。结果为: -(X+1)
<<   按位左移 |通常格式为:value << num,value按位左移num位
>> 有符号按位右移 通常格式为:value >> num,value按位右移num位。
>>> 无符号按位右移 通常格式为:value >> num,value按右移num位,移动得到的空位以零填充。

我们给出例子:

public static void main(String[] args) { int a= 10; int b = 20; //a转化成二进制表示为:1010;b转化为二进制表示为:10100 //按位运算时,我们把a表示为:01010 System.out.println(a&b); //按位与运算,有零则为零,都为1则表示为1,与的结果为:00000,即十进制的0 System.out.println(a|b); //按位或运算,有1则为1,都为0则表示为0,或的结果为:11110,即十进制的30 System.out.println(a^b); //按位或运算,对应位置相同则为0,否则为1,取反的结果为:11110,即十进制30 } 

运行结果:
0
30
30

下面,我们来说一下按位取反,计算机内部都是以补码的形式在做数学运的,而我们所用的编码规则,例如原码、反码则是我们自定义的,用来方便和计算机中的补码来形成转化。故而,我们在进行按位取反是要把原码或者反码转化成补码的形式。正数的反码和补码与原码相等; 负数的反码是符号位不变,其余按位取反,补码为反码+1。负数的最高符号位为1。
如,

  public static void main(String[] args) { int a= 10; int b= -10; System.out.println(~a); System.out.println(~b); } 

运行结果为:-11,9。 分析如下: a为正数,其补码形式与原码相同,表示为:00001010,按位取反后为11110101,注意,此时为补码形式,转化为反码表示为,11110100,再转化为原码表示为:10001011,即十进制的-11.同样的,b为负数,其补码表示为:11110110,按位取反后为00001001,此时依然为补码形式,转化为原码即其本身00001001,即十进制的9。故,按位取反后的结果可表示为-(X+1)

接下来,我们给出例子来看一下位移运算符

public static void main(String[] args) { int a= 10; int b = -10; //int为4个字节,也就是32位,为了简化a表示为:00001010, // b为负数我们表示为:1000 0000 0000 0000 0000 0000 0000 1010 //b的补码形式为 1111 1111 1111 1111 1111 1111 1111 0110 System.out.println( a<<1 ); //按位左移,原则舍弃高位,低位补零表示为:00010100,即20 System.out.println(a>>1); //按位右移,原则舍弃低位,高位补零表示为:00000101,即5 System.out.println(a>>1); //按位右移,原则舍弃低位,高位补零表示为:10000101,即5 System.out.println(a>>>1); //按位右移,原则舍弃低位,高位补零表示为:0000010,即5 System.out.println(b>>1); //有符号按位右移,原则舍弃低位,符号位不变,其余高位补零原码表示为: // 1000 0000 0000 0000 0000 0000 0000 0101,即-5 System.out.println(b>>>1); //无符号按位右移,原则舍弃低位,高位补零(补码=原码)表示为: // 0111 1111 1111 1111 1111 1111 1111 011,即十进制的,2147483643 } 

输出结果:
20
5
5
5
-5
2147483643
总结一下,原则上,按位左移时,原则舍弃高位,低位补零;有符号按位右移,原则舍弃低位,符号位不变,其余高位补零;无符号按位右移,原则舍弃低位,高位补零。再次强调,做位移运算时,是按补码来进行运算的

5. 赋值运算符

操作符 名称 描述
= 赋值 右操作数的值赋给左侧操作数
+= 加和赋值 左操作数和右操作数相加赋值给左操作数 (a+=b 等同于 a = a+b)
-= 减和赋值 左操作数和右操作数相减赋值给左操作数 (a-=b 等同于 a = a-b)
*= 乘和赋值 左操作数和右操作数相乘赋值给左操作数 (a*=b 等同于 a = a*b)
\/= 除和赋值 左操作数和右操作数相除赋值给左操作数 (a/=b 等同于 a = a/b)
(%)= 取模和赋值 左操作数和右操作数取模后赋值给左操作数 (a%=b 等同于 a = a%b)
<< = 左移位赋值 左移位赋值运算符 (a<<=b 等同于 a = a<<b)
>> = 右移和赋值 右移位赋值运算符 (a>>=b 等同于 a = a>>b)
^ = 除和赋值 按位与赋值运算符 (a^=b 等同于 a = a^b)
&= 除和赋值 按位异或赋值操作符 (a&=b 等同于 a = a&b)
| = 除和赋值 按位或赋值操作符 (a|=b 等同于a = a|b)

基本的赋值运算符是“=”。他的优先级别低于其他的运算符,所以对该运算符往往最后读取,他不是“等于”,它的作用是将一个表达式的值赋给一个左值。所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量,以上其他是复合的赋值运算符又称为带有运算的赋值运算符,也叫赋值缩写。等同与先按运算符运算后再把运算结果付给左值(见表格)。具体运算方法上边儿已经罗列,此处不再赘述

6. 条件运算符

条件运算符也叫三目运算符

语法:

(条件) ? 结果一 : 结果二; 

当条件成立,执行结果一,否则执行结果二。“?”前的值必须是true或flase
我们给出例子:

if(a<b) min=a; else min=b; 可以用下面的三目运算符来处理 min = a<b ? a : b; 

7. instanceof 运算符

instanceof运算符可以确定对象是否属于一个特定的类.该运算符是二目运算符,左边的操作元是一个对象,右边是一个类,当左边的对象是右边的类或子类创建的对象时,该运算符运算的结果是true,否则是false。,使用格式:( Object reference variable ) instanceof (class/interface type)

我们给出例子:

public static void main(String[] args) { String a = "name"; System.out.println(a instanceof String); System.out.println(a instanceof Object); } 

输出结果:true,true

8. 运算符优先级

在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的运算顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。相同优先级中,按结合顺序计算。

通常优先级由高到底的顺序依次是:
1. 括号级别最高,逗号级别最低;
2. 单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。
3. 除了单目运算符、赋值运算符和条件运算符,其他的运算符都是从左到右结合的。

今天关于4、Java的运算符java中运算符的分享就到这里,希望大家有所收获,若想了解更多关于14、Java的异常、2、Java运算符、6、Java运算符、8. Java的运算符等相关知识,可以在本站进行查询。

本文标签: