1 Java运算符

Java世界中的运算其实就是数学运算,而运算符就是其中的媒介。

算术运算符

操作符 描述
+ 加法,对符号两边的数值相加
- 减法,符号左边的数减去右边的数
* 乘法,符号两边的数值相乘
/ 除法,符号左边的数除以右边的数
% 取模,符号左边的数除以右边的数所得的余数
++ 自增,操作数的值加1
-- 自减,操作数的值减1

下面简单的例子演示算术运算符:

  1. public class MyFirst {
  2.  
  3. public static void main(String[] args) {
  4. int a = 10;
  5. int b = 5;
  6. int c = 12;
  7. int d = 12;
  8. int e = 20;
  9. int f = 20;
  10.  
  11. int r1 = a + b;// 10加5,r1输出 15
  12. System.out.println(r1);
  13.  
  14. int r2 = a - b;// 10减5,r2输出 5
  15. System.out.println(r2);
  16.  
  17. int r3 = a * b;// 10乘以5,r3输出 50
  18. System.out.println(r3);
  19.  
  20. int r4 = a / b;// 10除以5,r4输出 2
  21. System.out.println(r4);
  22.  
  23. int r5 = c % b;// 12除以5求余,r5输出 2
  24. System.out.println(r5);
  25.  
  26. int r6 = ++c;// 自增符号在数字前面,则先自增后赋值,r6输出 13
  27. int r7 = d++;// 自增符号在数字后面,则先赋值后自增,r7输出 12
  28. System.out.println(r6);
  29. System.out.println(r7);
  30.  
  31. int r8 = --e;// 自减符号在数字前面,则先自减后赋值,r6输出 19
  32. int r9 = f--;// 自减符号在数字后面,则先赋值后自减,r7输出 20
  33. System.out.println(r8);
  34. System.out.println(r9);
  35. }
  36.  
  37. }

关系运算符

运算符 描述
== 检查左右两边的操作数是否相等
!= 检查左右两边的操作数是否不相等
> 检查左边操作数是否大于右边操作数
< 检查左边操作数是否小于右边操作数
>= 检查左边操作数是否大于或等于右边操作数
<= 检查左边操作数是否小于或等于右边操作数

下面简单的例子演示关系运算符:

  1. public class MyFirst {
  2.  
  3. public static void main(String[] args) {
  4. int a = 5;
  5. int b = 5;
  6. int c = 12;
  7. int d = 20;
  8.  
  9. System.out.println(a == b);// 若a和b相等则表示真(true),输出 true
  10.  
  11. System.out.println(a != b);// 若a和b不相等则表示真(true),输出 false
  12.  
  13. System.out.println(c > d);// 若c大于d则表示真(true),输出 false
  14.  
  15. System.out.println(c < d);// 若c小于d则表示真(true),输出 true
  16.  
  17. System.out.println(a >= b);// 若a大于或等于b则表示真(true),输出 true
  18.  
  19. System.out.println(a <= c);// 若a小于或等于c则表示真(true),输出 true
  20. }
  21.  
  22. }

位运算符

Java定义的位运算符,主要应用于整数型(int)、长整数型(long)、短整数型(short)、字符型(char)和字节型(byte)。现在跟大家复习下位运算的一些基础知识,位运算符是作用在其二进制的所有位上,并且按位运算。

计算机的符号数有三种表示方法,分别是原码、反码和补码。

原码,符号位加上真值的绝对值,即用第一位表示符号位(0为正数,1为负数),其余位表示值。

如8位二进制数, +1 = 0000 0001 , -1 = 1000 0001 。原码是人脑最容易理解和计算的表示方式。

反码,正数的反码是其本身,而负数的反码是在其原码的基础上,符号位不变,其他位取反。

如8位二进制数, +1 = 0000 0001(原码)= 0000 0001(反码) , -1 = 1000 0001(原码) = 1111 1110(反码) 。如此可见,负数的反码是人脑无法直观的看出它们的数值的,需要先转回原码才能计算。

补码,正数的补码是其本身,而负数的补码是在其原码的基础上,符号位不变,其他位取反,最后+1,即在其反码的基础上+1。

如8位二进制数, +1 = 0000 0001(原码)= 0000 0001(反码) = 0000 0001(补码) , -1 = 1000 0001(原码) = 1111 1110(反码) = 1111 1111(补码) 。如此可见,负数的补码也是人脑无法直观的计算的它们数值的,需要先转为反码再转为原码计算。

操作符 描述
& 如果相对应位都是1,则结果为1,否则为0。
| 如果相对应位都是0,则结果为0,否则为1。
^ 如果相对应位值相同,则结果为0,否则为1。
~ 按位补运算符翻转操作数的每一位,即0变成1,1变成0。
<< 按位左移运算符,左操作数按位左移右操作数指定的位数。
>> 按位右移运算符,左操作数按位右移右操作数指定的位数。
>>> 按位右移补零操作符,左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。

例如, a = 50 , b = 15 它们的二进制格式如下所示:

a的二进制格式用A表示,A = 0011 0010;而b的二进制格式用B表示,B = 0000 1111。

那么A和B的位运算如下所示:

A&B = 0000 0010

A | B = 0011 1111

A ^ B = 0011 1101

~ A = 1100 1101

这里需要特别说明的是位补运算 ,注意下面的首位均为符号位,但是在做加减运算时需要忽略此符号位:

  • 正数的位补运算 a = 50, ~a=? ,a的二进制数是 0011 0010 ,各位取反后得 1100 1101 首位1表示符号负数,故需要对其进行反补码运算,即是谁的补码运算后得到这个数 1100 1101 ; 1100 1101 反补码运算,先减1得 1100 1100 ,然后反码运算得 1011 0011 ,故得到最后的二进制数为 1011 0011 ,十进制数为 -51 。负数的整个位补运算,先各位取反,再减1,最后反码运算得出结果,即补码运算后的各位取反的反运算。
  • 负数的位补运算 a = -51, ~a=? ,a的二进制数是 1011 0011 ,各位取反后得 0100 1100 ,然后加1得 0100 1101 ,最后做一次反码运算得 0011 0010 ,故得到的二进制数为 0011 0010 ,十进制数为 +50 。正数的整个位补运算,先各位取反,再加1,最后反码运算得出结果,即补码运算后的各位取反。
  • 总结,位补运算的前后是互通的,都是负数补码运算后的各位取反操作的正反逻辑而已。

以Java代码来进行位运算的程序,如下所示。

  1. public class Test {
  2.  
  3. public static void main(String[] args) {
  4. int a = 50;// a的二进制格式 0011 0010
  5. int b = 15;// b的二进制格式 0000 1111
  6. int c = 0;
  7.  
  8. c = a & b;// c的二进制格式 0000 0010,十进制格式 2
  9. System.out.println(c);// 输出 2
  10.  
  11. c = a | b;// c的二进制格式 0011 1111,十进制格式 63
  12. System.out.println(c);// 输出 63
  13.  
  14. c = a ^ b;// c的二进制格式 0011 1101,十进制格式 61
  15. System.out.println(c);// 输出 61
  16.  
  17. c = ~a;// c的二进制格式 1011 0011,十进制格式 -51
  18. System.out.println(c);// 输出 -51
  19.  
  20. c = a << 2;// a向左移2位,结果 1100 1000,十进制格式 200
  21. System.out.println(c);// 输出 200
  22.  
  23. c = a >> 2;// a向右移2位,结果 1100,十进制格式 12
  24. System.out.println(c);// 输出 12
  25.  
  26. c = a >>> 2;// a向右移2位,并移动得到的空位补零,结果 0000 1100,十进制格式 12
  27. System.out.println(c);// 输出 12
  28. }
  29.  
  30. }

PS:左移动1位表示乘以2,左移动2位表示乘以2的平方。

逻辑运算符

操作符 描述
&& 逻辑与运算符,当且仅当左右两边的操作数都为真时,条件才为真。
|| 逻辑或运算符,只要左右两边的操作数任意一个为真,条件就为真。
! 逻辑非运算符,用来反转操作数的逻辑状态。若操作数为true,则逻辑非运算后得到false。

实例演示:

  1. public class MyFirst {
  2.  
  3. public static void main(String[] args) {
  4. boolean a = true;
  5. boolean b = false;
  6.  
  7. System.out.println(a&&b);// 逻辑与运算,因a和b中,有其中一个为false,故结果为false
  8. System.out.println(a||b);// 逻辑或运算,因a和b中,有其中一个为true,故结果为true
  9. System.out.println(!b);// 逻辑非运算,因b为false,故其相反就为true
  10. }
  11.  
  12. }

赋值运算符

操作符 描述
= 简单的赋值运算符,将右操作数赋值给左操作数。
+= 加和赋值运算符,将左操作数和右操作数相加,并赋值给左操作数。
-= 减和赋值运算符,左操作数减去右操作数,并赋值给左操作数。
*= 乘和赋值运算符,将左操作数和右操作数相乘,并赋值给左操作数。
/= 除和赋值运算符,左操作数除以右操作数,并赋值给左操作数。
(%)= 取模和赋值运算符,左操作数取模右操作数,并赋值给左操作数。
<<= 左移位和赋值运算符,左操作数向左移右操作数位,并赋值给左操作数。
>>= 右移位和赋值运算符,左操作数向右移右操作数位,并赋值给左操作数。
&= 按位与和赋值运算符,将左操作数和右操作数按位与运算,并赋值给左操作数。
^= 按位异或和赋值运算符,将左操作数和右操作数按位异或运算,并赋值给左操作数。
|= 按位或和赋值运算符,将左操作数和右操作数按位或运算,并赋值给左操作数。

实例演示:

  1. public class MyFirst {
  2.  
  3. public static void main(String[] args) {
  4. int a = 5;
  5. int b = 3;
  6. int c = 0;
  7.  
  8. c = a;// 简单的赋值运算符,将a赋值给c。
  9. System.out.println(c);// 输出 5
  10.  
  11. c += a;// 加和赋值运算符,将c和a相加,并赋值给c。
  12. System.out.println(c);// 输出 10
  13.  
  14. c -= a;// 减和赋值运算符,c减去a,并赋值给c。
  15. System.out.println(c);// 输出 5
  16.  
  17. c *= a;// 乘和赋值运算符,将c和a乘,并赋值给c。
  18. System.out.println(c);// 输出 25
  19.  
  20. c /= a;// 除和赋值运算符,c除以a,并赋值给c。
  21. System.out.println(c);// 输出 5
  22.  
  23. c %= b;// 取模和赋值运算符,将c取模b,并赋值给c。
  24. System.out.println(c);// 输出 2
  25.  
  26. c <<= b;// 左移位和赋值运算符,将c的二进制数 0000 0010 左移b位数,并赋值给c。
  27. System.out.println(c);// 二进制数为 0001 0000,输出 16
  28.  
  29. c >>= b;// 右移位和赋值运算符,将c的二进制数 0001 0000 右移b位数,并赋值给c。
  30. System.out.println(c);// 二进制数为 0000 0010,输出 2
  31.  
  32. c &= b;// 按位与和赋值运算符,将c的二进制数0000 0010和b的二进制数0000 0011按位与,并赋值给c。
  33. System.out.println(c);// 二进制数为 0000 0010,输出 2
  34.  
  35. c ^= b;// 按位异或和赋值运算符,将c的二进制数0000 0010和b的二进制数0000 0011按位异或,并赋值给c。
  36. System.out.println(c);// 二进制数为0000 0001,输出 1
  37.  
  38. c |= b;// 按位或和赋值运算符,将c的二进制数0000 0001和b的二进制数0000 0011按位或,并赋值给c。
  39. System.out.println(c);// 二进制数为 0000 0011,输出 3
  40.  
  41. }
  42.  
  43. }

条件运算符

条件运算符(?:),也称为三元运算符。

语法形式:布尔表达式 ? 表达式1 :表达式2。

运算过程:如果布尔表达式的值为 true ,则返回 表达式1 的值,否则返回 表达式2 的值。

实例演示:

  1. public class MyFirst {
  2.  
  3. public static void main(String[] args) {
  4. int a = 5;
  5.  
  6. int b = a==1?10:20;// 若a等于1为真,则返回10,即将10赋值给b;否则返回20。很明显此处的5和1是不相等的,故b被赋值为20
  7. System.out.println(b);// 输出 20
  8. }
  9.  
  10. }

instanceof运算符

instanceof运算符,用于操作对象实例,判断该对象是否属于某个特定的类型(类类型或接口类型)。

语法形式:A instanceof B,A为对象实例,B为某一类类型,若A属于B类型,则返回true,否则返回false。

实例演示:

  1. public class MyFirst {
  2.  
  3. public static void main(String[] args) {
  4. Object a = 10;// 此处可以知道数字10的真正类型是Integer,由于Object是所有Java类型的父类,故可以以Object声明变量a
  5. System.out.println(a instanceof Boolean);// 输出 false
  6. System.out.println(a instanceof Integer);// 输出 true
  7. }
  8.  
  9. }

Java运算符优先级

Java表达式可能存在多个运算符,运算符之间存在优先级的关系,级别高的运算符先执行运算,级别低的运算符后执行运算。在一个多运算符的表达式中,运算符优先级的不同会导致最后得出的结果大不相同。例如, a = 5 + 7 * 2 结果a是19,而不是24。Java中的加减乘除和括号等操作符的优先级,其实就跟数学中的一致,括号优先,再则乘除,然后加减,最后等于。

下表列出了Java运算符优先级排列,由高到低依次向下排列:

优先级 操作符 关联性
1 ()、[]、. 从左到右
2 !、+(正)、-(负)、~、++、-- 从右到左
3 *、/、% 从左到右
4 +(加)、-(减) 从左到右
5 <<、>>、>>> 从左到右
6 <、<=、>、>= 从左到右
7 ==、!= 从左到右
8 & 从左到右
9 ^ 从左到右
10 | 从左到右
11 && 从左到右
12 || 从左到右
13 ?: 从右到左
14 =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= 从右到左

2 Java变量

变量,就是用来操纵存储空间的数据的,Java变量是程序中最基本的存储单元,其要素包括了变量名、变量类型和作用域。Java变量可以分为局部变量、成员变量和静态变量。

Java是一种强类型语言,每个变量都必须声明其类型,即变量在使用前必须对其声明,有且只有在变量声明后才能为其分配相应长度的存储空间。

声明格式:type identifier [ = value][, identifier [= value] ...] ;

其中type为Java数据类型。identifier是变量名。可以使用逗号隔开来声明多个同类型变量。

示例: String aa = "test and test", bb = "test bb";

注意:

  • 每个变量都有其类型,类型可以是基本类型,也可以是引用类型。
  • 变量名必须是合法的标识符。
  • 变量声明是一条完整的语句,因此每一个声明都必须以分号结束。

局部变量

局部变量,是方法或语句块内部定义的变量,生命周期是从声明位置开始到方法或语句块结束为止。局部变量没有默认值,故局部变量必须先声明和初始化后才能被使用。

实例演示:

  1. public class MyFirst {
  2.  
  3. /**
  4. * 方法中的go变量只在方法中声明和初始化,然后被使用。
  5. * 但是,它的作用域也就是在此方法中,若此方法运行结束了,则go变量的生命也到尽头了。
  6. */
  7. public void go() {
  8. String go = "走起,回家去!";
  9. System.out.println(go);
  10. }
  11.  
  12. public static void main(String[] args) {
  13. MyFirst myfirst = new MyFirst();
  14. myfirst.go();
  15. }
  16.  
  17. }

成员变量

成员变量,也被称为实例变量,在方法外部、类的内部定义的变量。成员变量是从属于对象的,生命周期伴随对象的始终,从对象被声明创建到被回收为止。如果不自行初始化,他会自动初始化成该类型的默认初始值,如数值型变量的默认初始值为0或0.0,字符型变量的默认初始值为16位的0,布尔型变量的默认初始值为false。

  1. public class MyFirst {
  2.  
  3. int age = 11;
  4.  
  5. /**
  6. * age是声明在类中、方法外的成员变量,故在方法中可以直接使用
  7. */
  8. public void myAge() {
  9. System.out.println("小米的年龄:" + age);
  10. }
  11.  
  12. public static void main(String[] args) {
  13. MyFirst myfirst = new MyFirst();
  14. myfirst.myAge();
  15. }
  16.  
  17. }

静态变量

静态变量,又称为类变量,以关键字 static 在类中、方法外声明的变量。静态变量是从属于类的,生命周期伴随类的始终,从类的加载到卸载为止。如果不自行初始化,他会自动初始化成该类型的默认初始值,如数值型变量的默认初始值为0或0.0,字符型变量的默认初始值为16位的0,布尔型变量的默认初始值为false。

注意:

  • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝,可以直接以 ClassName.VariableName 的方式访问,即 类名.静态变量名 。
  • 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量,常量初始化后不可再被改变。如 public final static String NAME = "test_name";
  1. public class MyFirst {
  2.  
  3. public final static String NAME = "test_name";
  4.  
  5. /**
  6. * 常量NAME不管哪里都可以直接调用
  7. */
  8. public void myName() {
  9. System.out.println("小米的名称:" + MyFirst.NAME);
  10. }
  11.  
  12. public static void main(String[] args) {
  13. MyFirst myfirst = new MyFirst();
  14. myfirst.myName();
  15. System.out.println("小明的名称:" + MyFirst.NAME);
  16. }
  17.  
  18. }

变量命名规范

我们对于变量的命名一般有如下几种,方便我们见其名而知其意。但是需要注意的是,命名规范并不代表规定。

  • 成员变量:首字母小写和驼峰原则,如 myName 。
  • 局部变量:与成员变量一样,首字母小写和驼峰原则。
  • 常量:大写字母和下划线,如 MAX_VALUE 。
  • 类名:首字母大写和驼峰原则,如 MyFirst 。
  • 方法名:首字母小写和驼峰原则,如 goHome() 。

基础篇-1.2Java世界的规章制度(下)的更多相关文章

  1. 基础篇-1.2Java世界的规章制度(上)

    1 Java标识符 在Java语言中,有类.对象.方法.变量.接口和自定义数据类型等等,他们的名字并不是确定的,需要我们自己命名.而Java标识符就是用来给类.对象.方法.变量.接口和自定义数据类型命 ...

  2. Bootstrap框架(基础篇)之按钮,网格,导航栏,下拉菜单

    一,按钮 注意:虽然在Bootstrap框架中使用任何标签元素都可以实现按钮风格,但个人并不建议这样使用,为了避免浏览器兼容性问题,个人强烈建议使用button或a标签来制作按钮. 框架中提供了基础按 ...

  3. 一、基础篇--1.2Java集合-HashMap和ConcurrentHashMap的区别【转】

    http://www.importnew.com/28263.html 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了多少时间的,不 ...

  4. 一、基础篇--1.2Java集合-HashMap死循环问题

    为什么HashMap会出现死循环 首先,我们知道java的HashMap不是线程安全的.多线程下应该使用ConcurrentHashMap. HashMap底层是基于动态数组和单向链表(JDK1.7, ...

  5. 一、基础篇--1.2Java集合-HashMap源码解析

    https://www.cnblogs.com/chengxiao/p/6059914.html  散列表 哈希表是根据关键码值而直接进行访问的数据结构.也就是说,它能通过把关键码值映射到表中的一个位 ...

  6. 一、基础篇--1.2Java集合-HashMap和HashSet的区别

     HashMap和HashSet的区别 1.HashMap实现的是Map接口,HashSet实现的是Set接口 2.结构不一样,一个存储的是键值对,一个存储的是对象 3.HashMap存储的值可能相同 ...

  7. 一、基础篇--1.2Java集合-HashMap和HashTable的区别

    HashMap和HashTable的区别 1.继承的父类不同,HashMap继承的是AbstractMap类,HashTable继承的是Dictionary类,不过都实现了Map.Clone.Seri ...

  8. 一、基础篇--1.2Java集合-ArrayList和Vector的区别

     ArrayList和Vector的区别 ArrayList和Vector都是基于动态数组实现的.  区别 ArrayList是非线程安全的,Vector是线程安全的. Vector的方法都加了同步锁 ...

  9. 一、基础篇--1.2Java集合-Arraylist 与 LinkedList 区别

     Arraylist 与 LinkedList 区别  结构上的区别 ArrayList底层实现基于动态数组,LinkedList底层实现基于双向链表.  性能上区别 ArrayList查询快,增删慢 ...

随机推荐

  1. Qt官方开发环境生成的exe发布方式--使用windeployqt

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...

  2. Windows下搭建go语言开发环境 以及 开发IDE (附下载链接)

    1.下载 并且 安装 Go安装包   =========================================================== 在CSDN上传了我的版本,供大家下载: = ...

  3. GTest翻译词汇表

    版本号:v_0.1 词汇表 Assertion: 断言. Bug: 不翻译. Caveat: 警告. Error bound: 误差范围. Exception: 异常. Flag: 标志位. Floa ...

  4. python中的基本数据类型之 int bool str

    一.基本数据类型 1. int  ==>  整数.主要用来进行数学运算. 2.str  ==>  字符串.可以保存少量的数据,并进行相应的操作. 3.bool  =>  布尔值.判断 ...

  5. js&jq遇到的问题(不断更新中)

    1.普通事件和事件绑定: 代码: 普通事件: var btn=document.getElementById('btn'); btn.onclick=function(){ alert("c ...

  6. WebP 大战 JPEG,谁才是真正的王者?

    目前在互联网上,图片流量仍占据较大的一部分.因此,在保证图片质量不变的情况下,节省流量带宽是大家一直需要去解决的问题.传统的图片格式,如 JPEG,PNG,GIF 等格式图片已经没有太多的优化空间.因 ...

  7. 关于linux网卡消失的问题

    首先我也是一名学生,在学习的过程Linux的过程中,因为老师要求配置hadoop集群所以就匆匆忙忙的上手了,但是在配置网络的问题时遇到了网卡消失的问题 我在网上询问了许多的人,但是还是没有找到一个很好 ...

  8. 找不到’geckodriver’ 的环境path问题“ Message: 'geckodriver' executable needs to be in PATH. ”

    运行测试脚本报找不到’geckodriver’ 的环境path  的错误 selenium3.x webdriver/firefox/webdriver.py的init中,executable_pat ...

  9. 用ASP.NET Core重写了一款网络考试培训的免费软件

    在IT圈混迹了近十年,今已正当而立之年却仍一事无成,心中倍感惶恐惭愧.面对竟争如此激列的环境,该如何应对?却也知不能让自已闲着,得转起来,动起来.于是,便想着利用最新技术栈将自已原来的收费产品重写一次 ...

  10. 32| 无实例无真相:基于LoadRunner实现企业级服务器端性能测试的实践(上)