复习
1.Java有多少种数据类型,数据类型的分类?
2.Java的工作机制?
3.自定类型转换与强制类型转换的规则?
4.什么是变量,如何定义变量?
5.整型从小到大排序并且说出大小?
6.数据类型的默认值?
7.整型与浮点型的默认数据类型是什么?
8.基本数据类型的包装类型分别是什么?
9.如何定义一个常量?
10.JDK&JRE&JVM分别是什么以及他们的关系?
前文链接
1.偏头痛杨的Java入门教学系列之认识Java篇
2.偏头痛杨的Java入门教学系列之变量&数据类型篇
前戏
Java中包含了许多的运算符、标识符、关键字、表达式等知识点,
正是由于这些基础的知识点才有可能允许让我们编写出“绚烂”的程序。
运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较。
用于操作一个或多个参数以得出结果。
算术运算符
符号 | 含义 | 备注 |
+ | 加法 | a+b |
- | 减法 | a-b |
* | 乘法 | a*b |
/ | 除法 | a/b 两个整数相除,只保留整数部分。 有小数参与,则保留小数。 0除以任何数都等于0,任何数除以0会造成不同的错误 (整数会报异常,浮点数会出正无穷和负无穷)。 |
% | 取余 | a%b 取余数,例如6%4=2 |
++ | 自增 | 操作数的值增加1 ++放在变量前或后是有区别的 ++变量名:变量在参与其他操作前先将自己加1 变量名++:先用原来的值参与其他操作后,再将自己加1 |
-- | 自减 | 操作数的值减少1,其余同上 |
+ | 字符串连接 | 当操作数中只要有一个是String类型, 系统会自动将另一个操作数转换成字符串类型, 然后进行连接。 注意:如果String是在后面做的连接,则前面先进行整数计算。 2+3 + "你好"->5你好 "你好"+2+3->你好23 |
int x,y,z;
x = 18;
y = x++;//++运算符放在变量后面表示后加1,先把18赋值给y,然后x再加1,此时x=19,y=18
z = ++x;//++运算符放在变量前面表示先加1,x加1后为20,然后x再赋值给z,此时x=20,y=18,z=20
int d = 5%3; //输出2
int e = -5%3;//输出-2
int f = 5/2;//输出2
double g = 5.0/2;//输出2.5
比较运算符&关系运算符
符号 | 含义 | 备注 |
== | 相等于 | 检查如果两个操作数的值是否相等,如果相等则条件为真。 会返回一个true或false,注意不要写成"="。 对于基本数据类型比较的是值; 对于引用数据类型比较的是内存地址; |
!= | 不等于 | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 |
< | 小于 | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 |
> | 大于 | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 |
<= | 小于等于(不大于) | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 |
>= | 大于等于(不小于) | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 |
boolean a = true;
boolean b = false;
System.out.println(a==b);//输出false
System.out.println(a!=b);//输出true
int c = 10;
int d = 8;
System.out.println(c>d);//输出true
int a = 10;
int b = 10;
System.out.println(a==b);//输出true
String a = new String("123");
String b = new String("123");
System.out.println(a==b);//输出false
逻辑运算符(逻辑运算符两端的操作数必须是布尔类型的值)
符号 | 含义 | 备注 |
&& | 逻辑与 | 当且仅当两个操作数都为真,条件才为真。 相当于“且”,如果用&&连接表达式时,如果左面的表达式为false, 则将不会计算其右边的表达式,又称"短路逻辑与"。 |
|| | 逻辑或 | 如果任何两个操作数任何一个为真,条件为真。 相当于“或”,如果左面的表达式为true,则将不会计算其右边的表达式, 又称"短路逻辑或"。 |
! | 逻辑非 | 用来反转操作数的逻辑状态。如果条件为true, 则逻辑非运算符将得到false。 |
boolean a = true;
boolean b = false;
System.out.println(a&&b); //输出false
System.out.println(a||b); //输出true
System.out.println(!(a&&b)); //输出true
int c = 2;
int d = 1;
boolean e = (c!=2 && d==d++);//猜猜e,d输出什么?
boolean f = (c==2 && d==d++);//猜猜f,d输出什么?
int x = 5;
boolean y = (x<4)&&(x++<10);
System.out.println(y); //输出false,因为短路了
System.out.println(x);//输出5
位运算符
位运算符只对byte、short、char、int、long有效,涉及到二进制编程&位运算,新手PASS。
符号 | 含义 | 备注 |
& | 按位“与” | 相当于“且”,如果用&连接表达式时,无论左面的表达式为true还是false, 都会计算其右边的表达式,即左右两边都需要进行计算。 位运算:如果相对应位都是1,则结果为1,否则为0 |
| | 按位“或” | 相当于“或”,如果用&连接表达式时,无论左面的表达式为true还是false, 都会计算其右边的表达式,即左右两边都需要进行计算。 位运算: 如果相对应位都是0,则结果为0,否则为1 |
^ | 异或 | 所组合的两个布尔表达式有相反的值时,才会产生true。 如果两边都是true或都是false,则返回false。 位运算:如果相对应位值相同,则结果为0,否则为1 |
~ | 翻转 | 位运算:按位补运算符翻转操作数的每一位,即0变成1,1变成0。 |
<< | 左移 | a<<b,将a的二进制数据左移b位,右边移空的部分补0。 左移运算相当于实现整数乘以2的n次方。 位移后不会改变操作数本身的结果。 |
>> | 右移 | a>>b,将a的二进制数据右移b位,如果最高位是0,则左边移空的部分补0, 如果最高位是1,则左边移空的部分补1。 右移运算相当于实现整数除以2的n次方。 |
>>> | 无符号右移 | 不管最高位是0或1,左边移空部分都补0。 |
(新手可以暂时忽略左移、右移、无符号右移等位运算部分,因为涉及到二进制编程。)
A = 0011 1100
B = 0000 1101
A&b = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A = 1100 0011
boolean c = true;
boolean d = false;
System.out.println(c^d);
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
System.out.println("a & b = " + c ); //输出12
c = a | b; /* 61 = 0011 1101 */
System.out.println("a | b = " + c ); //输出61
c = a ^ b; /* 49 = 0011 0001 */
System.out.println("a ^ b = " + c ); //输出49
c = ~a; /*-61 = 1100 0011 */
System.out.println("~a = " + c ); //输出-61
c = a << 2; /* 240 = 1111 0000 */
System.out.println("a << 2 = " + c ); //输出240
c = a >> 2; /* 15 = 1111 */
System.out.println("a >> 2 = " + c ); //输出15
c = a >>> 2; /* 15 = 0000 1111 */
System.out.println("a >>> 2 = " + c ); //输出15
赋值运算符
符号 | 含义 | 备注 |
= | x=y; | 将右操作数的值赋给左侧操作数,把变量y的值赋给x |
+= | x+=y; | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 |
-= | x-=y; | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 |
*= | x*=y; | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 |
/= | x/=y; | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 |
%= | x%=y; | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 |
<<= | x<<=y | 左移位赋值运算符 |
>>= | x>>=y | 右移位赋值运算符 |
&= | x&=y | 按位与赋值运算符 |
^= | x^=y | 按位异或赋值操作符 |
|= | x|=y | 按位或赋值操作符 |
int a = 10;
int b = 20;
int c = 0;
c = a + b;
System.out.println(c); //输出30
c += a ;
System.out.println(c); //输出40
c -= a ;
System.out.println(c); //输出30
c *= a ;
System.out.println(c); //输出300
a = 10;
c = 15;
c /= a ;
System.out.println(c); //输出1
a = 10;
c = 15;
c %= a ;
System.out.println(c); //输出5
c <<= 2 ;
System.out.println(c); //输出20
c >>= 2 ;
c >>= 2 ;
System.out.println(c); //输出1
c &= a ;
System.out.println(c); //输出0
c ^= a ;
System.out.println(c); //输出10
c |= a ;
System.out.println(c);//输出10
String x = "alex";
String y = "jack";
x = y;
System.out.println(x); //猜猜看输出什么?
System.out.println(y);//猜猜看输出什么?
条件运算符
条件运算符很独特,因为它是用三个操作数组成表达式的三元运算符(也叫三目运算符)。
所谓三元运算符,是对三个表达式进行的集中比较,表达式1的结果为true时,就为第二个表达式,
如果为false时,就为第三个表达式。它可以替代某种类型的 if-else语句。
语法是: 表达式1?表达式2:表达式3
boolean a = (4 < 3) ? true : false;//a=false
instance of运算符(新手PASS)
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
格式:( Object reference variable ) instanceof (class/interface type)
如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,
那么结果为真。
String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真
运算符的优先级
在下面的表达式中,经常会出现一堆运算符同时出现的情况,那么哪个先执行哪个后执行呢?
顺序 | 运算符 |
1 | 括号 |
2 | 一元运算符,如 -、++、- -和 ! |
3 | 算术运算符,如 *、/、%、+ 和 - |
4 | 关系运算符,如 >、>=、<、<=、== 和 != |
5 | 逻辑运算符,如 &、^、|、&&、|| |
6 | 条件运算符和赋值运算符,如 ? :、=、*=、/=、+= 和 -= |
表达式
表达式是符合一定语法规则的运算符和运算数的序列。
表达式名称 | 表达式形式 |
算术表达式 | (x+y-12)*100 |
关系表达式 | x>y x>=y x!=y x==y |
逻辑表达式 | x&&y x||y||z (!x)&&(!y) |
赋值表达式 | x=y x+=y |
Java语句分为两种:
1.声明语句:int i;
2.表达式语句:只有下面这几种表达式能够在末尾加上分号变成语句:
~含有=或者某个赋值表达式
~自加或自减表达式
~方法调用
~使用new来创建对象,即对象创建表达式
标识符
Java所有的组成部分都需要名字。
类名、对象名、变量名、接口名、数组名以及方法名等等都被称为标识符。
注意:
~只能由英文字母(A-Z或a-z)、数字(0-9)、下划线符号(_)组成;
~必须以英文字母、“_”或“$”开头,即不能以数字开头;
~除“_”和“$”以外,不能包含其它任何特殊字符,比如(@,#);
~不能与关键字(保留字)冲突;
~不能带有空格和数学符号;
~严格区分大小写;
合法标识符举例:age、$salary、_value、__1_value
非法标识符举例:123abc、-salary
Java关键字
所谓的关键字就是指在java中有特殊含义的词,所有的关键字均为小写,
你起名的时候不可以用这些词,goto与const作为保留关键字,在Java中并没有使用。
本列表按a-z的排列方式展现,红字必须背会。
关键字 | 含义 |
abstract | 抽象类或方法 |
assert | 用来查找内部程序错误 |
boolean | 基本数据类型:8位布尔类型(因为java中没有1位这个单位) |
break | 跳出一个switch或循环 |
byte | 基本数据类型:8位整数类型 |
char | 基本数据类型:16位字符类型 |
case | switch的一个分支 |
catch | 捕获异常的try块子句 |
class | 定义一个类类型 |
continue | 在循环末尾继续 |
default | switch的缺省语句 |
do | do/while循环最前面的语句 |
double | 基本数据类型:64位双精度浮点数类型 |
else | if语句的else子句 |
enum | 枚举类型 |
extends | 继承一个父类 |
final | 一个常量,或不能覆盖的一个类或方法 |
finally | try块中总会执行的部分 |
float | 基本数据类型:32位单精度浮点数类型 |
for | 一个循环类型 |
false | 逻辑假 |
if | 一个条件语句 |
implements | 定义一个类实现的接口 |
import | 导入一个包 |
instanceof | 测试一个对象是否是某个类的实例 |
int | 基本数据类型:32位整型数 |
interface | 接口,一种抽象类型,仅有方法和常量的定义 |
long | 基本数据类型:64位长整数型 |
native | 由宿主系统实现的一个方法 |
new | 分配新的类实例,用于创建对象 |
null | 一个空引用 |
package | 包含类的一个包 |
private | 表示私有字段,或者方法等,只能从类内部访问 |
protected | 表示保护类型字段 |
public | 表示共有属性或者方法 |
return | 从一个方法中返回 |
short | 基本数据类型:16位整数类型 |
strictfp | 对浮点数计算使用严格的规则 |
switch | 选择语句 |
static | 修饰静态变量,静态代码块 |
super | 超类对象或构造函数 |
synchronized | 多线程同步机制,添加synchronized锁,修饰方法和块 |
throw | 抛出一个异常 |
this | 当前类的一个方法或构造函数的隐含参数 |
transient | 标志非永久性的数据 |
throws | 一个方法可能抛出的异常 |
try | 捕获异常的代码块 |
true | 逻辑真 |
void | 标记方法不返回任何值 |
volatile | 标记字段可能会被多个线程同时访问,而不做同步 |
while | 一种循环 |
总结
今天我们学习了Java里的大量基本语法,为后面的编程打基础。
作业
int a = 1;
int b = 2;
int c = 3;
System.out.println(b+=c--/++a);//输出什么?复习上面的运算符优先级
int x = 2;
System.out.println(x++/3);//输出什么?++在后面先操作再加1,相当于2/3,取整型
int y = 3;
System.out.println(x>=y);//输出什么?x为什么是3而不是2呢?
y = 10;
System.out.println(x>=y);//输出什么?