javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(5)-- 运算符
2017-04-29 15:14
615 查看
运算符:
现在你已经学会了如何声明和初始化变量,你可能想知道如何利用他们做些什么。学习Java编程语言的运算符是开始的好地方。运算符是对一个,两个或三个操作数执行特定操作的特殊符号,然后返回结果。 当我们探索Java编程语言的运算符时,可能有助于您提前知道哪些运算符具有最高优先级。下表中的运算符按照优先顺序列出。操作员出现的表格越靠近,其优先级越高。具有较高优先级的运算符在具有较低优先级的运算符之前进行运算。同一行的运算符具有同等的优先权。当相同优先级的运算符出现在相同的表达式中时,规则必须对首先被运算的规则进行管理。除赋值运算符之外的所有二进制运算符都从左到右进行运算 ; 赋值运算符从左到右进行运算。在通用编程中,某些运算符往往比其他运算符更频繁出现 ; 例如,赋值运算符“=”远比无符号右移运算符“>>>”更常见。考虑到这一点,以下讨论首先侧重于您最有可能定期使用的运算符,并将重点放在那些较不常见的运算符。每个讨论都附有可以编译和运行的示例代码。研究其产出将有助于巩固您刚学到的知识。
赋值运算符
您将遇到的最常见的运算符之一是简单的赋值运算符“=”。你在自行车课上看到这个操作员它将其右侧的值分配给左侧的操作数:int cadence = 0; int speed = 0; int gear = 1;
此操作符也可用于对象分配对象引用,如创建对象中所述
算术运算符
Java编程语言提供执行加法,减法,乘法和除法的操作符。有一个很好的机会,你会认识到他们的基础数学的同行。可能看起来很新的唯一符号是“%”,它将一个操作数除以另一个,并返回剩余部分作为结果。以下是一个测试算术运算符的小程序,ArtithmeticDemo
class ArithmeticDemo { public static void main (String[] args) { int result = 1 + 2; // result is now 3 System.out.println("1 + 2 = " + result); int original_result = result; result = result - 1; // result is now 2 System.out.println(original_result + " - 1 = " + result); original_result = result; result = result * 2; // result is now 4 System.out.println(original_result + " * 2 = " + result); original_result = result; result = result / 2; // result is now 2 System.out.println(original_result + " / 2 = " + result); original_result = result; result = result + 8; // result is now 10 System.out.println(original_result + " + 8 = " + result); original_result = result; result = result % 7; // result is now 3 System.out.println(original_result + " % 7 = " + result); } }
程序的输出结果如下所示:
1 + 2 = 3 3 - 1 = 2 2 * 2 = 4 4 / 2 = 2 2 + 8 = 10 10 % 7 = 3
您还可以将算术运算符与简单赋值运算符组合以创建复合分配。例如,x + = 1; x = x + 1;都将x的值增加1。
注意:
+ 运算符也可以用于将两个字符串连接(连接)在一起,如下面的ConcatDemo程序所示:
class ConcatDemo { public static void main(String[] args){ String firstString = "This is"; String secondString = " a concatenated string."; String thirdString = firstString+secondString; System.out.println(thirdString); } }
在该程序结束时,变量thirdString包含“这是一个连接的字符串”,它被打印到标准输出。
一元运算符
一元运算符只需要一个操作数;它们执行各种操作,例如将值递增/递减1,否定表达式或反转布尔值。测试一元运算符的UnaryDemo
class UnaryDemo { public static void main(String[] args) { int result = +1; // result is now 1 System.out.println(result); result--; // result is now 0 System.out.println(result); result++; // result is now 1 System.out.println(result); result = -result; // result is now -1 System.out.println(result); boolean success = false; // false System.out.println(success); // true System.out.println(!success); } }
递增/递减运算符(也称为自增、自减),可以应用在前缀(前缀)之前或之后(后缀)操作数。代码result++; 和++result ; 都是将result的结果增加 1。唯一的区别是前缀版本(++ result)评估为递增值,而postfix版本(result ++)计算为原始值。如果您只是执行一个简单的递增/递减,那么选择哪个版本并不重要。但是,如果您在较大的表达式中使用该运算符,那么您选择的运算符可能会有显着差异。下面的代码,PrePostDemo向您展示了两者的差异。
class PrePostDemo { public static void main(String[] args){ int i = 3; i++; // prints 4 System.out.println(i); ++i; // prints 5 System.out.println(i); // prints 6 System.out.println(++i); // prints 6 System.out.println(i++); // prints 7 System.out.println(i); } }
关系运算符
相等和关系运算符确定一个操作数是否大于,小于,等于或不等于另一个操作数。大多数这些操作员也可能看起来很熟悉。请记住,当测试两个原始值是否相等时,您必须使用“==”,而不是“=”。== equal to(等于) != not equal to(不等于) > greater than(大于) >= greater than or equal to(大于或等于) < less than(小于) <= less than or equal to(小于或等于)
如以下代码所示:
class ComparisonDemo { public static void main(String[] args){ int value1 = 1; int value2 = 2; if(value1 == value2) System.out.println("value1 == value2"); if(value1 != value2) System.out.println("value1 != value2"); if(value1 > value2) System.out.println("value1 > value2"); if(value1 < value2) System.out.println("value1 < value2"); if(value1 <= value2) System.out.println("value1 <= value2"); }
输出的结果:
value1 != value2 value1 < value2 value1 <= value2
条件运算符
&& 和 || 运算符对两个布尔表达式执行Conditional-AND和Conditional-OR运算。这些操作符表现出“短路”的行为,这意味着只有在需要的时候才对第二个操作数进行评估。以下的demo展示了这两个运算符的区别
class ConditionalDemo1 { public static void main(String[] args){ int value1 = 1; int value2 = 2; if((value1 == 1) && (value2 == 2)) System.out.println("value1 is 1 AND value2 is 2"); if((value1 == 1) || (value2 == 1)) System.out.println("value1 is 1 OR value2 is 1"); } }
另一个条件运算符是?:,可以被认为是if-then-else语句的简写(在本课程的“控制流语句”部分中讨论)。该运算符也称为三目运算符,因为它使用三个操作数。在下面的例子中,该运算符应该被读为:“如果someCondition为true,则将value1的值赋值给result,否则,将value2的值分配给result。如下demo所示:
class ConditionalDemo2 { public static void main(String[] args){ int value1 = 1; int value2 = 2; int result; boolean someCondition = true; result = someCondition ? value1 : value2; System.out.println(result); } }
因为someCondition是真的,这个程序打印“1”到屏幕。如果你想要使你的代码更可读,则使用?:运算符,而不是if-then-else语句。
类型比较运算符
instanceof运算符将对象与指定的类型进行比较。您可以使用它来测试对象是否是类的实例,子类的实例或实现特定接口的类的实例。以下程序InstanceofDemo定义了一个父类(名为Parent),一个简单的接口(名为MyInterface)和一个从父级继承并实现接口的子类(名为Child)
class InstanceofDemo { public static void main(String[] args) { Parent obj1 = new Parent(); Parent obj2 = new Child(); System.out.println("obj1 instanceof Parent: " + (obj1 instanceof Parent)); System.out.println("obj1 instanceof Child: " + (obj1 instanceof Child)); System.out.println("obj1 instanceof MyInterface: " + (obj1 instanceof MyInterface)); System.out.println("obj2 instanceof Parent: " + (obj2 instanceof Parent)); System.out.println("obj2 instanceof Child: " + (obj2 instanceof Child)); System.out.println("obj2 instanceof MyInterface: " + (obj2 instanceof MyInterface)); } } class Parent {} class Child extends Parent implements MyInterface {} interface MyInterface {}
输出结果:
obj1 instanceof Parent: true obj1 instanceof Child: false obj1 instanceof MyInterface: false obj2 instanceof Parent: true obj2 instanceof Child: true obj2 instanceof MyInterface: true
注意:当使用instanceof运算符时,请记住,null不是任何东西的实例。
位运算符和位移运算符
Java编程语言还提供对整型类型执行逐位和位移操作的操作符。本节讨论的运算符较少使用。所以他们的报道很简短 ; 意图只是让你意识到这些操作符存在。一元位补码运算符“〜”反转位模式 ; 它可以应用于任何积分类型,使得“0”为“1”,每“1”为“0”。例如,一个字节包含8位;将该运算符应用于位模式为“00000000”的值将其模式更改为“11111111”。 带符号的左移位运算符“<<”将位模式向左移位,而带符号的右移位运算符“>>”向右移位位模式。位模式由左手操作数和右移操作数移位的位数。无符号右移操作符“>>>”将零移到最左边的位置,而“>>”后最左边的位置取决于符号扩展名。
按位运算符 & 执行按位AND运算。
按位运算符 ^ 执行按位异或运算。
按位运算符 | 执行按位包含或运算。
以下程序BitDemo使用按位AND运算符将数字“2”打印到标准输出。
class BitDemo { public static void main(String[] args) { int bitmask = 0x000F; int val = 0x2222; // prints "2" System.out.println(val & bitmask); } }
相关文章推荐
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(2)-- 变量和常用数据类型
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(4)-- 变量和数组
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(6)-- 表达式、语句、块
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(3)-- 基本数据类型的默认值
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(1)-- 变量
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(7)-- 流程控制语句
- javaSE_8系列博客——Java语言的特性(四)--注解--(1)--基础知识
- JavaSE_8系列博客——Java语言的特性(六)--泛型(1)--宏观把控
- javaSE_8系列博客——Java语言的特性(五)--接口和继承(2)--定义接口
- JavaSE_8系列博客——Java语言的特性(五)--接口和继承(5)--深入理解,并优化接口
- JavaSE_8系列博客——Java语言的特性(五)--接口和继承(6)--默认方法的使用场景
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(2)--对象
- javaSE_8系列博客——Java语言的特性(三)--类和对象(17)--嵌套类(本地/局部类)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(6)--为你的类提供构造函数
- javaSE_8系列博客——Java语言的特性(三)--类和对象(16)--嵌套类(内部类的示例)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(3)--类的声明
- javaSE_8系列博客——Java语言的特性(三)--类和对象(9)--对象的创建
- javaSE_8系列博客——Java语言的特性(四)--注解--(2)-- 声明一个注解
- JavaSE_8系列博客——Java语言的特性(六)--泛型(2)--何时何地使用泛型?