基础二:操作符

简介: 基础二:操作符

使用Java操作符


操作符接受一个或者多个参数,并生成一个新值。

操作符用于操作数,生成一个新值。 另外有些操作符可能会改变操作数自身的值,这被称为“副作用”。

这些能改变操作数的操作符最普遍的作用就是产生副作用。

几乎所有的操作符都只能操作“基本类型”。 例外的操作符是 = == 和 != 。

这些操作符能操作所有的对象。 除此之外,String类支持 + 和 +=.


优先级


当一个表达式中存在多个操作符时,操作符的优先级决定了各个部分的计算顺序。 最简单的规则就是先乘除后加减。另外也要明确括号的作用。


赋值


赋值使用操作符 “=” 。

它的意思是 取右边的值 ,把它赋值给左边。


右边可以是任意数、变量或者表达式(只要能生成一个值就行),左边必须是一个明确的已命名的变量。 也就是说,必须有一个物理空间可以存储等号右边的值。

比如 :

a = 4 ;


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

对于基本数据类型的赋值:

基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复


20160508212354001.png

但是在为对象赋值的时候,情况却发生了变化:

对一个对象进行操作时,我们真正操作的是对象的引用。 所以倘若“将一个对象赋值给另外一个


20160508213624677.png


Tank类有两个实例 t1和t2, 分别对level域赋不同的值,然后将t2赋给t1,紧接着又修改t1.


由于赋值操作的是一个对象的引用,所有修改t1的同时,也改变了t2. 这是由于t1和t2包含的是相同的引用,他们指向相同的对象(原来t1包含的对对象的引用,是指向一个值为9的对象,在对t1赋值的时候,这个引用被覆盖了,也就是丢失了;而那个不再被引用的对象会有垃圾回收器自动清理)。


这种特使的现象被称为“别名现象”,是java操作对象的一种基本方式,如何避免的?可以这样写

t1.level = t2.level ;


这样便可以保持两个对象彼此独立,而不是将t1和t2绑定到相同的对象上。


算数操作符


+ - * / 加减乘除 以及取模操作符 %

要将x+4,并将结果赋值给x ,可以写成 x +=4 ;

通过Random类的对象,程序可以生成许多不同类型的随机数字,只需要调用


20160508215641880.png

传递给netxtInt()的参数设置了所产生随机数的上线,而其下限为0 。 但是这个下限并不是我们所想要的,可以对结果进行+1操作。


自动递增和递减

++ –

举个例子 假设 a是一个int值,++a 就能等价于 a = a +1 ;

递增和递减操作符不仅改变了变量,并且以变量值作为生成的结果。


这两个操作符各有两种使用方式,通常称为前缀式和后缀式。


前缀递增: 表示 ++操作符位于变量或者表达式的前面,反之 后缀递增 ++操作符位于变量或者表达式的后面。


类似的,前缀递增递减 一样的..


**对于前缀形式:执行完运算后才得到值。

对于后缀形式:在运算之前就得到值**。


他们是除了那些设计赋值的操作符以外,唯一就有“副作用”的操作符。 也就是说,他们会改变操作数,而不仅仅是使用自己的值。

    int i = 1;
        System.out.println("i:" + i); // 1
        System.out.println("=======================");
        System.out.println("++i:" + ++i); // 2    先执行运算 i首先加1,此时i为2,并以变量(即i=2)的值作为结果
        System.out.println("i:" + i); // 2
        System.out.println("i++:" + i++); // 2  先给变量i赋值(i=2)因为是以变量的的值作为结果,所以 i++ 的值为2,在执行运算,运算后 i+1变为3
        System.out.println("i:" + i); // 3
        System.out.println("=======================");
        System.out.println("--i:" + --i); // 2   先运算,运算后3-1后 i为2 ,再赋值,此时i 为2
        System.out.println("i:" + i); // 2
        System.out.println("i--:" + i--); // 2
        System.out.println("i:" + i); // 1

20160508232041031.png


关系操作符

关系操作符生成的是一个boolean结果。

真实则为true,反之false。

主要包括一下符号:

< 、 > 、<=、>= 、 == 以及 !=

测试对象的等价性


20160508232628284.png

尽管对象的内容相同,但是对象的引用确实不同的,而 ==和 != 比较的是对象的引用。

如果相比较两个对象的实际内容是否相同,需要使用 equals().



20160508232923645.png


假设我们创建了自己的类,就像下面那样


20160508233545262.png


what the fuck ? 又是false了…..

这是因为 equals()的默认行为是比较引用, 所以除非在自己的新类中覆盖equals方法,否则不可能表现出我们希望的行为。

20160508233909344.png


大多是java库都实现了equals方法,以便用来比较对象的内容,而非对象的引用。


逻辑操作符

与 && 或 || 非 ! ,返回一个布尔值。

直接常量

直接常量后面的后缀字符标识了它的类型。

若为 大写或者小写的L,代表long

F ,代表float

D,代表都变了

十六进制适用于所有整数数据类型,以前缀 0x或者0X,后面跟随0~9或者大写(或小写)的a~f来表示。

八进制数由前缀0以及后续的0~7的数字来表示。


按位操作符

用来操作二进制

&= 按位与赋值

|= 按位或赋值

^= 按位非赋值

移位操作符


也是用来操作二进制

= 右移赋值

= 无符号右移赋值

<<= 赋值左移


三目表达式

boolean-exp ? value0 : value1

boolean-exp 为true,则计算 value0 ,反之计算 value1 .


字符串操作符 + 和 +=

这个操作符在java中有一项特殊的用途: 连接不同的字符串

相关文章
|
3月前
|
C++
【C++基础】运算符详解
这篇文章详细解释了C++中运算符的用法,包括算术运算符、赋值运算符、比较运算符和逻辑运算符,以及它们在表达式中的作用和示例。
30 2
|
6月前
|
编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
50 3
|
6月前
|
存储 编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)一
42 1
|
7月前
|
C语言
条件操作符和逻辑操作符(C语言零基础教程)
条件操作符和逻辑操作符(C语言零基础教程)
|
C语言 索引
操作符详解(2)(上)
操作符详解(2)(上)
操作符详解(1)(下)
操作符详解(1)(下)
|
7月前
|
存储 C语言
C learning_12 操作符前篇(算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符)
C learning_12 操作符前篇(算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符)
|
7月前
第二章:数据类型、运算符和表达式
第二章:数据类型、运算符和表达式
59 0
|
索引
操作符之关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用操作符,函数调用操作符,访问结构体成员操作符
操作符之关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用操作符,函数调用操作符,访问结构体成员操作符
|
编译器 C语言
操作符的属性,C语言中运算符的优先性和结合性,常见的问题表达式
操作符的属性,C语言中运算符的优先性和结合性,常见的问题表达式