1 Java运算符

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

算术运算符

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

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

public class MyFirst {

    public static void main(String[] args) {
int a = 10;
int b = 5;
int c = 12;
int d = 12;
int e = 20;
int f = 20; int r1 = a + b;// 10加5,r1输出 15
System.out.println(r1); int r2 = a - b;// 10减5,r2输出 5
System.out.println(r2); int r3 = a * b;// 10乘以5,r3输出 50
System.out.println(r3); int r4 = a / b;// 10除以5,r4输出 2
System.out.println(r4); int r5 = c % b;// 12除以5求余,r5输出 2
System.out.println(r5); int r6 = ++c;// 自增符号在数字前面,则先自增后赋值,r6输出 13
int r7 = d++;// 自增符号在数字后面,则先赋值后自增,r7输出 12
System.out.println(r6);
System.out.println(r7); int r8 = --e;// 自减符号在数字前面,则先自减后赋值,r6输出 19
int r9 = f--;// 自减符号在数字后面,则先赋值后自减,r7输出 20
System.out.println(r8);
System.out.println(r9);
} }

关系运算符

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

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

public class MyFirst {

    public static void main(String[] args) {
int a = 5;
int b = 5;
int c = 12;
int d = 20; System.out.println(a == b);// 若a和b相等则表示真(true),输出 true System.out.println(a != b);// 若a和b不相等则表示真(true),输出 false System.out.println(c > d);// 若c大于d则表示真(true),输出 false System.out.println(c < d);// 若c小于d则表示真(true),输出 true System.out.println(a >= b);// 若a大于或等于b则表示真(true),输出 true System.out.println(a <= c);// 若a小于或等于c则表示真(true),输出 true
} }

位运算符

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代码来进行位运算的程序,如下所示。

public class Test {

    public static void main(String[] args) {
int a = 50;// a的二进制格式 0011 0010
int b = 15;// b的二进制格式 0000 1111
int c = 0; c = a & b;// c的二进制格式 0000 0010,十进制格式 2
System.out.println(c);// 输出 2 c = a | b;// c的二进制格式 0011 1111,十进制格式 63
System.out.println(c);// 输出 63 c = a ^ b;// c的二进制格式 0011 1101,十进制格式 61
System.out.println(c);// 输出 61 c = ~a;// c的二进制格式 1011 0011,十进制格式 -51
System.out.println(c);// 输出 -51 c = a << 2;// a向左移2位,结果 1100 1000,十进制格式 200
System.out.println(c);// 输出 200 c = a >> 2;// a向右移2位,结果 1100,十进制格式 12
System.out.println(c);// 输出 12 c = a >>> 2;// a向右移2位,并移动得到的空位补零,结果 0000 1100,十进制格式 12
System.out.println(c);// 输出 12
} }

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

逻辑运算符

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

实例演示:

public class MyFirst {

    public static void main(String[] args) {
boolean a = true;
boolean b = false; System.out.println(a&&b);// 逻辑与运算,因a和b中,有其中一个为false,故结果为false
System.out.println(a||b);// 逻辑或运算,因a和b中,有其中一个为true,故结果为true
System.out.println(!b);// 逻辑非运算,因b为false,故其相反就为true
} }

赋值运算符

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

实例演示:

public class MyFirst {

    public static void main(String[] args) {
int a = 5;
int b = 3;
int c = 0; c = a;// 简单的赋值运算符,将a赋值给c。
System.out.println(c);// 输出 5 c += a;// 加和赋值运算符,将c和a相加,并赋值给c。
System.out.println(c);// 输出 10 c -= a;// 减和赋值运算符,c减去a,并赋值给c。
System.out.println(c);// 输出 5 c *= a;// 乘和赋值运算符,将c和a乘,并赋值给c。
System.out.println(c);// 输出 25 c /= a;// 除和赋值运算符,c除以a,并赋值给c。
System.out.println(c);// 输出 5 c %= b;// 取模和赋值运算符,将c取模b,并赋值给c。
System.out.println(c);// 输出 2 c <<= b;// 左移位和赋值运算符,将c的二进制数 0000 0010 左移b位数,并赋值给c。
System.out.println(c);// 二进制数为 0001 0000,输出 16 c >>= b;// 右移位和赋值运算符,将c的二进制数 0001 0000 右移b位数,并赋值给c。
System.out.println(c);// 二进制数为 0000 0010,输出 2 c &= b;// 按位与和赋值运算符,将c的二进制数0000 0010和b的二进制数0000 0011按位与,并赋值给c。
System.out.println(c);// 二进制数为 0000 0010,输出 2 c ^= b;// 按位异或和赋值运算符,将c的二进制数0000 0010和b的二进制数0000 0011按位异或,并赋值给c。
System.out.println(c);// 二进制数为0000 0001,输出 1 c |= b;// 按位或和赋值运算符,将c的二进制数0000 0001和b的二进制数0000 0011按位或,并赋值给c。
System.out.println(c);// 二进制数为 0000 0011,输出 3 } }

条件运算符

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

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

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

实例演示:

public class MyFirst {

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

instanceof运算符

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

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

实例演示:

public class MyFirst {

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

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";

注意:

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

局部变量

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

实例演示:

public class MyFirst {

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

成员变量

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

public class MyFirst {

    int age = 11;

    /**
* age是声明在类中、方法外的成员变量,故在方法中可以直接使用
*/
public void myAge() {
System.out.println("小米的年龄:" + age);
} public static void main(String[] args) {
MyFirst myfirst = new MyFirst();
myfirst.myAge();
} }

静态变量

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

注意:

  • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝,可以直接以 ClassName.VariableName 的方式访问,即 类名.静态变量名 。
  • 静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量,常量初始化后不可再被改变。如 public final static String NAME = "test_name";
public class MyFirst {

    public final static String NAME = "test_name";

    /**
* 常量NAME不管哪里都可以直接调用
*/
public void myName() {
System.out.println("小米的名称:" + MyFirst.NAME);
} public static void main(String[] args) {
MyFirst myfirst = new MyFirst();
myfirst.myName();
System.out.println("小明的名称:" + MyFirst.NAME);
} }

变量命名规范

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

  • 成员变量:首字母小写和驼峰原则,如 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. c#编写的基于Socket的异步通信系统--SanNiuSignal.DLL已开源

    自从推出了SanNiuSignal.DLL,用户反映还是满好的;为了更好的服务于大家,我已经修复了很多BUG,同时把这个DLL开源;下面就先来介绍下 使用这个DLL开发出的简单的通信系统;如图: 想使 ...

  2. vs2008在win7系统中安装不问题

    据说是office软件冲突问题. 解决方案是卸载了office软件,不管是2007还是其它版本,先安装vs2008,再安装其它的.

  3. Delphi类与方法(几十篇)

    http://www.cnblogs.com/del/category/114896.html

  4. ASP.NET Web API 直到我膝盖中了一箭【1】基础篇

    蓦然回首,那些年,我竟然一直很二. 小时候,读武侠小说的时候,看到那些猪脚,常常会产生一种代入感,幻想自己也会遭遇某种奇遇,遇到悬崖跳下去是不是有本“武林秘笈”在等着?长大以后也是一样,多少人梦着醒着 ...

  5. linux:清空文件内容与批量kill 指定程序名的进程

    1.常规的清空文件内容方法 1)使用 cat命令显示 /dev/null 的内容然后重定向输出到某个文件,来清空 $ cat /dev/null > filename 2)清空一个文件可以通过 ...

  6. solr 重要的知识点

    1 solr 查询参数说明 常用 ) q - 查询字符串,必须的. ) fl - 指定返回那些字段内容,用逗号或空格分隔多个. ) start - 返回第一条记录在完整找到结果中的偏移位置, 开始,一 ...

  7. python多线程爬取图片实例

    今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题.网址还是那个网址https://www.quanjing.com/category/1286521/1. ...

  8. Web Scraper 翻页——控制链接批量抓取数据

    ![](https://image-1255652541.cos.ap-shanghai.myqcloud.com/images/20190708214014.png) 这是简易数据分析系列的第 5 ...

  9. 56. Merge Interval

    56. Merge Interval 0. 参考文献 序号 文献 1 花花酱 LeetCode 56. Merge Intervals 2 [LeetCode] Merge Intervals 合并区 ...

  10. 02(b)多元无约束优化问题-最速下降法

    此部分内容接02(a)多元无约束优化问题的内容! 第一类:最速下降法(Steepest descent method) \[f({{\mathbf{x}}_{k}}+\mathbf{\delta }) ...