一.初识java
1. 初识Java的main方法
main方法示例
public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello,world"); } }如上展示的就是最简单的一个Java程序,
通过上述代码,我们可以看到一个完整的Java程序的结构,Java程序的结构由如下三个部分组成:
1.源文件(扩展名为*.java):源文件带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个类。类的内容必须包含在花括号里面。
2.类:类中带有一个或多个方法。方法必须在类的内部声明。
3.方法:在方法的花括号中编写方法应该执行的语句。
总结一下:类存在于源文件里面;方法存在于类中;语句存在于方法中。
注意:在一个源文件中只能有一个public修饰的类,而且源文件名字必须与public修饰的类名字相同。
2 运行Java程序
Java是一门半编译型、半解释型语言。先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节
码组成的平台无关、面向JVM的文件。最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够
理解的形式来运行。
注意:在运行Java程序前,必须先安装好JDK(Java Development Kit即Java开发工具包),JDK里面就包含了javac和
java工具,Java程序最终是在JVM(Java虚拟机)中运行的。
【面试题】JDK、JRE、JVM之间的关系?
JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译
器javac与自带的调试工具Jconsole、jstack等。
JRE(Java Runtime Environment):Java运行时环境,包含了JVM,Java基础类库。是使用Java语言编写程
序运行的所需环境。
JVM:Java虚拟机,运行Java代码
3. 注释
Java中的注释主要分为以下三种
单行注释:// 注释内容(用的最多)
多行注释:/* 注释内容*/(不推荐)
文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可以被javadoc工具解析,生成一套以网页文件形式体现的程序说明文档
注意:
1. 多行注释不能嵌套使用
2. 不论是单行还是多行注释,都不参与编译,即编译之后生成的.class文件中不包含注释信息。
4. 标识符
在上述程序中,HelloWorld称为类名,main称为方法名,也可以将其称为标识符,即:在程序中由用户给类名、方法名或 者变量所取的名字。
【硬性规则】
标识符中可以包含:字母、数字以及 下划线和 $ 符号等等。
注意:标识符不能以数字开头,也不能是关键字,且严格区分大小写。
【软性建议】
类名:每个单词的首字母大写(大驼峰)
方法名:首字母小写,后面每个单词的首字母大写(小驼峰)
变量名:与方法名规则相同
一个大型的工程,是由多名工程师协同开发的,如果每个人都按照自己的方式随意取名,比如:person、PERSON、Person、_person,将会使程序非常混乱。如果大家在取名时能够遵守一定的约束(即规范),那多人写除的代码仿佛一个人写的。
下面那些标识符是合法的?
A:class B:HelloWorld C:main D:123abc E:ARRAY_SIZE F: $name G: name:jim
答:BCEF(F合法但不建议)
5. 关键字
Java关键字是事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。
关键字
含义
abstract
表明类或者成员方法具有抽象属性
assert
断言,用来进行程序调试
boolean
基本数据类型之一,声明布尔类型的关键字
break
提前跳出一个块
byte
基本数据类型之一,字节类型
case
用在switch语句之中,表示其中的一个分支
catch
用在异常处理中,用来捕捉异常
char
基本数据类型之一,字符类型
class
声明一个类
const
保留关键字,没有具体含义
continue
回到一个块的开始处
default
默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现
do
用在do-while循环结构中
double
基本数据类型之一,双精度浮点数类型
else
用在条件语句中,表明当条件不成立时的分支
enum
枚举
extends
表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口
final
用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
finally
用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
float
基本数据类型之一,单精度浮点数类型
for
一种循环结构的引导词
goto
保留关键字,没有具体含义
if
条件语句的引导词
implements
表明一个类实现了给定的接口
import
表明要访问指定的类或包
instanceof
用来测试一个对象是否是指定类型的实例对象
int
基本数据类型之一,整数类型
interface
接口
long
基本数据类型之一,长整数类型
native
用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new
用来创建新实例对象
package
包
private
一种访问控制方式:私用模式
protected
一种访问控制方式:保护模式
public
一种访问控制方式:共用模式
return
从成员方法中返回数据
short
基本数据类型之一,短整数类型
static
表明具有静态属性
strictfp
用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
super
表明当前对象的父类型的引用或者父类型的构造方法
switch
分支语句结构的引导词
synchronized
表明一段代码需要同步执行
this
指向当前实例对象的引用
throw
抛出一个异常
throws
声明在当前定义的成员方法中所有需要抛出的异常
transient
声明不用序列化的成员域
try
尝试一个可能抛出异常的程序块
void
声明当前成员方法没有返回值
volatile
表明两个或者多个变量必须同步地发生变化
while
用在循环结构中
二. 数据类型与变量
1. 字面常量
System.Out.println("Hello World"); 语句,不论程序何时运行,输出的都是Hello World,其实"Hello World"就是字面常量。
常量即程序运行期间,固定不变的量称为常量
命名规范:单词用纯大写字母表示,多个字母用下划线隔开
int AGE = 10;
int CLASS_ID = 1;
比如:一个礼拜七天,一年12个月等。
其中:100、3.14、‘A’、true/false都是常量,将其称为字面常量。
字面常量的分类:
1. 字符串常量:由""括起来的,比如“12345”、“hello”、“你好”。
2. 整形常量:程序中直接写的数字(注意没有小数点),比如:100、1000
3. 浮点数常量:程序中直接写的小数,比如:3.14、0.49
4. 字符常量:由 单引号 括起来的当个字符,比如:‘A’、‘1’
5. 布尔常量:只有两种true和false
6. 空常量:null
注意:字符串、整形、浮点型、字符型以及布尔型,在Java中都称为数据类型。
2. 数据类型
在Java中数据类型主要分为两类:基本数据类型和引用数据类型。
基本数据类型有四类八种:
1. 四类:整型、浮点型、字符型以及布尔型
2. 八种:
注意:
不论是在16位系统还是32位系统,int都占用4个字节,long都占8个字节
整形和浮点型都是带有符号的
整型默认为int型,浮点型默认为double
字符串属于引用类型。
//const在java中属于保留字,也是关键字(没有具体含义)//被final修饰的变量不可修改final int c = 30;// 常量无法修改// c = 40;System.out.println(c);静态变量static 必须定义在类中,不能定义在任何方法中。
什么是字节?
字节是计算机中表示空间大小的基本单位.
计算机使用二进制表示数据. 我们认为 8 个二进制位(bit) 为一个字节(Byte).
我们平时的计算机为 8GB 内存, 意思是 8G 个字节.
int d =10;// 正数按位取反得到的是负数// |d| = 10 -> 加符号位-10 -> -1 -> -11 System.out.println(~d); int e = -10;// 负数按位取反的得到的是正数// |e| = 10 -> 加符号位 10 -> -1 -> 9 System.out.println(~e);a = Integer.MAX_VALUE; System.out.println(a);// 整型最小值 -2147483648 int b; b = Integer.MIN_VALUE; System.out.println(b);// 溢出问题 System.out.println("1.超出整型的保存范围,编译只保留前32位");// 最大值加1变成最小值 System.out.println(a+1);//-2147483648// 最小值减一变成最大值 System.out.println(b-1);//2147483647// 字面量数值超出整型的范围时,编译报错// int c =40000000000;//默认是int型变量,超出范围报错3. 变量
3.1 变量概念
在程序中,除了有始终不变的常量外,有些内容可能会经常改变,比如:人的年龄、身高、成绩分数、数学函数的
计算结果等,对于这些经常改变的内容,在Java程序中,称为变量。而数据类型就是用来定义不同种类变量的。
3.2 语法格式
定义变量的语法格式为:
比如:
数据类型 变量名 = 初始值;
int a = 10; // 定义整形变量a,a是变量名也称为标识符,该变量中放置的值为10double d = 3.14;char c = 'A';boolean b = true;System.Out.println(a);System.Out.println(d);System.Out.println(c);System.Out.println(b);a = 100; // a是变量,a中的值是可以修改的,注意:= 在java中表示赋值,即将100交给a,a中保存的值就是100System.Out.println(a);// 注意:在一行可以定义多个相同类型的变量int a1 = 10, a2 = 20, a3 = 30;System.Out.println(a1);System.Out.println(a2);System.Out.println(a3);3.3 整型变量
3.3.1 整型变量
// 方式一:在定义时给出初始值int a = 10;System.Out.println(a);// 方式二:在定义时没有给初始值,但使用前必须设置初值int b;b = 10;System.Out.println(b);// 使用方式二定义后,在使用前如果没有赋值,则编译期间会报错int c;System.Out.println(c);c = 100;// int型变量所能表示的范围:System.Out.println(Integer.MIN_VALUE);System.Out.println(Integer.MAX_VALUE);// 注意:在定义int性变量时,所赋值不能超过int的范围int d = 12345678901234; // 编译时报错,初值超过了int的范围注意事项:
1. int不论在何种系统下都是4个字节
2. 推荐使用方式一定义,如果没有合适的初始值,可以设置为0
3. 在给变量设置初始值时,值不能超过int的表示范围,否则会导致溢出
4. 变量在使用之前必须要赋初值,否则编译报错
5. int的包装类型为 Integer
整型的最大最小值为一个常量,保存在int的包装类中(Integer),
Integer.MAX_VALUE最大值,Integer.MIN_VALUE最小值
其余数据类型同理。
数据是有范围的,当数据类型的变量保存不下某个数值时,就会发生溢出。此时需要更换数据类型。
3.3.2 长整型变量
2^63bit
当整型存放不下时,更换为长整型来保存。
// 声明一个长整型 long a = 10; //直接写出来的整数是int型// 声明一个长整型字面量,在整数后面加l或L(推荐) long b =400000000000L; System.out.println(b);// 最大最小值包装在包装类Long中 System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE);3.3.3 短整型变量
short在任何系统下都占2个字节
short的表示范围为:-32768 ~ 32767
3.3.4 字节型变量
注意事项:
1. byte在任何系统下都占1个字节
2. byte的范围是:-128 ~ 127
3. 字节的包装类型为Byte
3.4 浮点型变量
3.4.1 双精度浮点型
解决:使用JDK提供的BigDecimal类
BigDecimal b1 = BigDecimal.valueOf(1.1);BigDecimal b2 = BigDecimal.valueOf(1.1);System.out.println(b1.multiply(b2));b1.add(b2);//加b1.subtract(b2);//减b1.multiply(b2);//乘b1.divide(b2);//除注意事项:
1. double在任何系统下都占8个字节
2. 浮点数与整数在内存中的存储方式不同,不能单纯使用 2的n次方 的形式来计算
3. double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。
3.4.2 单精度浮点型
flfloat 类型在 Java 中占四个字节, 同样遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数 都优先考虑 double, 不太推荐使用 flfloat. flfloat的包装类型为Float。
3.5 字符型变量
// 采用Unicode编码,支持全球语言 全部两字节char c3 = '哈';System.out.println(c3);//不推荐// int 变量1 = 10;// int 变量2 = 20;// int 计算结果 = 变量1 + 变量2;// System.out.println(计算结果);注意事项:
1. Java 中使用 单引号 + 单个字母 的形式表示字符字面值。
2. 计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此 一个字符占用两个字节, 表示的字符种类更多, 包括中文。
3.6 布尔型变量
表示真就是true,假就是false,不存在0和1的转换。
Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,boolean占一个字节。
3.7 类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验.
在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。
3.7.1 自动类型转换(隐式)
自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。
特点:数据范围小的转为数 据范围大的时会自动进行。
// 隐式// int a = 10;// long b = 100;//int字面量->long//// 赋值// long c = a;//int变量->longint a = 100;long b = 10L;b = a; // a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值a = b; // 编译报错,long的范围比int范围大,会有数据丢失,不安全// int a = 1;// int b = 2;// double c = a/b;//int/int=int c的取值等运算后得到的数值提升为double// System.out.println(c);//0.0int a = Integer.MAX_VALUE;long b = a+1;//相当于将一个已经溢出的数赋值给long blong c = a+1L;//小类型和大类型共同参与运算,先将小类型转换成大类型再运算。System.out.println(b);//-2147483648 和上面同理System.out.println(c);//21474836483.7.2 强制类型转换(显式)
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。
特点:数据范围大的到数据范围小的。
int a = 10;long b = 100L;b = a; // int-->long,数据范围由小到大,隐式转换a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败float f = 3.14F;double d = 5.12;d = f; // float-->double,数据范围由小到大,隐式转换f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败a = d; // 报错,类型不兼容a = (int)d; // int没有double表示的数据范围大,需要强转,小数点之后全部丢弃byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显式转换,否则报错boolean flag = true;a = flag; // 编译失败:类型不兼容flag = a; // 编译失败:类型不兼容注意事项:
1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型
2. 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失
3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查
4. 强制类型转换不一定能成功,不相干的类型不能互相转换
3.8 类型提升
不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
1. int与long之间:int会被提升为long
int a = 10;long b = 20;int c = a + b; // 编译出错: a + b-->int + long--> long + long 赋值给int时会丢失数据long d = a + b; // 编译成功:a + b-->int + long-->long + long 赋值给long2. byte与byte的运算
byte a = 10;byte b = 20;byte c = a + b;System.out.println(c);// 编译报错Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失byte c = a + b;结论: byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误.
由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte short
这种低于 4 个字节的类型, 会先提升成 int, 再参与计算。
正确的写法:
byte a = 10;byte b = 20;byte c = (byte)(a + b);System.out.println(c);【类型提升小结:】
1. 不同类型的数据混合运算, 范围小的会提升成范围大的.
2. 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算。
4. 字符串类型
在Java中使用String类定义字符串类型,比如:
public static void main(String[] args) {String s1 = "hello";String s2 = " world";System.out.println(s1);System.out.println(s2);System.out.println(s1+s2); // s1+s2表示:将s1和s2进行拼接}在有些情况下,需要将字符串和整形数字之间进行转换:
1. int 转成 String
int num = 10;// 方法1String str1 = num + ""; // 方法2String str2 = String.valueOf(num);2. String 转成 int
String str = "100";int num = Integer.parseInt(str);三. 运算符
1.算术运算符
(1) 基本四则运算符:加减乘除模(+ - * / %)
int a = 10;int b = 20;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);// Exception in thread "main" java.lang.ArithmeticException: / by zero// System.out.println(10 / 0);模运算相当于数学中除法的余数
做除法和取模时,右操作数不能为0(除数不能为0)
int / int 结果还是int类型,而且会向下取整
int a = 10;int b = 20;// 在数学中应该是0.5 但是在Java中输出结果为0 会向下取整,即小数点之后全部舍弃掉了System.out.println(a / b);// 如果要得到数学中的结果,可以使用如下方式double c = a*1.0 / b;System.out.println(c);(2)增量运算符: += -= *= %=
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
int a = 1; a += 2;//3 System.out.println(a); a -= 1;//2 System.out.println(a); a *= 3;//6 System.out.println(a); a /= 3;//2 System.out.println(a); a %=3;//2 System.out.println(a);注意:只有变量才能使用该运算符,常量不能使用。
(3) 自增/自减运算符 ++ --
++是给变量的值+1,--是给变量的值-1
int a = 1;// 后置++是先使用变量原来值,表示式结束时给变量+1,( 先取值再运算)System.out.println(a++);//输出1// 前置++是先给变量+1,然后使用变量中的值,( 先++再取值)System.out.println(++a);//输出3// --操作符给操作-1,与++含义类似注意:
如果单独使用,++a 和 a++ 没有任何区别
如果混合使用,++a先+1,然后使用变量+1之后的值,a++ 先使用变量原来的值,表达式
结束时给变量+1
只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
2. 关系运算符
关系运算符主要有六个: == != < > <= >= ,其计算结果是 true 或者 false 。
// 一行中定义多个变量int a =10,b = 20;// = 是数学赋值运算 ,== 是关系运算符判断a和b是否相等System.out.println(a == b);//falseSystem.out.println(a != b);//trueSystem.out.println(a < b);//trueSystem.out.println(a > b);//falseSystem.out.println(a <= b); // trueSystem.out.println(a >= b); // false// 不能连着写// 正确: 3 < a && a < 5// System.out.println(3 < a < 5);3. 逻辑运算符 (重要)
逻辑运算符主要有三个: && ||
! ,运算结果都是 boolean类型。
(1) 逻辑与 &&
语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。
相当于现实生活中的且,比如:如果是学生,并且 带有学生证 才可以享受半票。
两个表达式都为真,结果才是真,只要有一个是假,结果就是假。
(2)逻辑或 ||
语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果。 相当于现实生活中的或。
(3)逻辑非 !
语法规则:! 表达式
真变假,假变真
(4) 短路求值
&& 和 || 遵守短路求值的规则.
注意:
对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式.
对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式.
& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值.
int a = 10;int b = 20;// //true// System.out.println(a == 10 && b == 20);// //false// System.out.println(a == 10 && b > 20);// 连着判断一个条件,需要关系运算符和逻辑运算符搭配使用// System.out.println(a >= 5 && a <= 15);// 短路操作// 表达式1直接返回了flase,表达式2不再判断(不执行表达式2)System.out.println(a >= 20 && a / 0 == 0);// trueSystem.out.println(a == 10 || b / 0 == 0);// trueSystem.out.println(a != 10 || b == 20 );// falseSystem.out.println(a != 10 || b != 20);4. 位运算符
Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。
位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位 的每一位依次进行计算.
(1) 按位与 &: 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.
(2) 按位或 |: 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
(3) 按位取反 ~: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0.
(4) 按位异或 ^: 如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.
int a = 10;//01010int b = 20;//10100// 与 或 非 异或 运算 System.out.println(a & b);//二进制的 00000 System.out.println(a | b);//二进制的 11110 System.out.println(a ^ b);//二进制的 11110 System.out.println(~a);//二进制的 10101进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 10100
注意:
当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.
5. 移位运算(了解)
移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。
1. 左移 <<: 最左侧位不要了, 最右侧补 0.
注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数
2. 右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
3. 无符号右移 >>>: 最右侧位不要了, 最左侧补 0.
左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
移动负数位或者移位位数过大都没有意义.
6. 条件运算符
布尔表达式 ? 表达式2 :表达式3
布尔表达式 真 取表达式2,假 取表达式3
是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.
// 三目运算符// 布尔表达式 ? 表达式2 :表达式3 真 取表达式2,假 取表达式3int max = a > b ? a : b;System.out.println(max);// 当表达式2和表达式3类型不一致,会发生隐式的类型提升,提升为最大类型然后赋值double c = true ? 1 : 2.0;System.out.println(c);//出错// int ret =true ? 1 : 2.0;// System.out.println(ret);注意:
表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
表达式不能单独存在,其产生的结果必须要被使用
7. 运算符的优先级
在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 + 和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。
具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可.
// 运算符优先级(优先运算加括号就好)// 求a和b平均值int d = a + ((b - a)>>1);System.out.println(d);