8.常量、常量、运算符
Java中的包、类、方法、参数和变量的名称总称为标识符 下面代码中红字为标识符:
- com.neuedu.ch01:包名
- FirstTest:类名
- main:方法名
- args:参数和变量名称
标识符的命名规则
- 必须以字母、下划线(_)或美元符号($)开头;
- 余下的字符可以是下划线、美元符号或任何的字母或数字,长度不限;
- 标识符中不能有空格;
- 不能使用Java中的关键字或者保留字做为标识符;
命名规范是一种约定,也是程序员之间良好沟通的桥梁。
- Pascal 规则:组成标识符的每个单词的首字母大写,其余字母小写的书 写约定。对于缩写的双字母单词,要求全部大写。
- Camel 规则:标识符的首字母小写,每个后面连接的单词的首字母大写 ,其余字母小写的书写约定。对于缩写的双字母单词,要求它们出现在 标识符首部时全部小写,否则全部大写。
元素 | 规范 | 示例 |
---|---|---|
类名 | Pascal规则 | Person StudentDemo |
变量名 | Camel规则 | age height avgValue |
方法名 | Camel规则 | getAge setUserName |
包名 | 全部小写 | com.neusoft |
常量名 | 全部大写 | MAX_VALUE |
8.1 Java中的常量
常量指程序里持续不变的值,在整个程序运行过程中它是不可改变的 在Java中,必须指定数据类型 常见的常量类型有:
- 整型常量,如:123,067,0X1D,123L
- 浮点数常量,如:123.4,.18,1.8e1,1.2D,1.2F
- 布尔型常量,如:true,false
- 字符常量,如:’a’,’8’,‘\n’,‘\u123f’
- 字符串常量,如:“a”,“hello”
- 引用类型常量,:null
8.2 变量
变量是指在程序的运行过程中随时可以发生变化的量
变量是程序中数据的临时存放场所
保存程序运行时用户输入的数据
特定的运算结果等
8.2.1 变量的声明
变量类型 变量名字 [ = 初始值];
8.2.2 数据类型及分类
在Java中,数据类型分为两大类:
基本数据类型:4类8种基本数据类型
引用数据类型: 类、接口、数组
整形:整数类型包含:byte、short、int(默认)、long
javabyte b1 = 127; short s1 = 100; int i1 = 100; long l1 = 100L; System.out.println("b1:"+b1); System.out.println("s1:"+s1); System.out.println("i1:"+i1); System.out.println("l1:"+l1);
浮点型
javadouble d1 = 3.14; float f1 = 6.55f; System.out.println("d1:"+d1); System.out.println("f1:"+f1);
布尔类型
布尔类型 — boolean boolean类型适于逻辑运算,一般用于表示真或假 boolean 数据类型只有两个值:true 和 false
javaboolean bool1 = true; boolean bool2 = false; System.out.println("bool1:"+bool1); System.out.println("bool2:"+bool2);
字符类型
字符类型包含:char Java中的字符类型的值通常用英文单引号括起来,代表单个字符 Java字符类型有固定的长度为:16位,是一个16位无符号整数。 最小值:0, 最大值:65535 = 2^16-1 '0'与'\u0000'不是同一个字符 字符通常为:英文字母、中文字、其他国家文字、数字、转义序列、特殊字符等,例如:
Java中的字符也可用十六进制编码形式表示,例如:
转义字符:使用”\”把其转化成字符的本身输出,那么使用”\”的字符称作为转义字符。 需求:使用输出语句,打印出带引号的信息如输出:你好”中国”编写代码为:System.out.println(“你好”中国“”);编译是无法正常通过的。语法有错误,编译器读到第二个引号就认为是字符串的结束,剩余的不知道怎么处理。如何解决这个问题:java中使用转义字符来表示特殊的字符。一个转义字符以反斜杠(\)开始。例如:
8.3 运算符和表达式
运算符(操作符)
是一种特殊的符号,用以表示数据的运算、赋值和比较
运算符的种类:
赋值运算符:=、+=、﹣=、=、/=、%=**
算术运算符: +、﹣、*、/、%、++、 --
比较运算符:>、<、>=、 <=、= =、!=、instanceof
逻辑运算符:!、&&、||
位运算符: &、|、^ 、 ~、>>、<<、>>>
条件运算符: ?: 条件运算符很独特,因为它是用三个操作数组成的三元运算符。
8.3.1 赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
public class Operator1 {
/**
* 赋值操作符
* @param args
*/
public static void main(String[] args) {
//将右侧算完的值,赋值给左侧
int num = 10 + 20;
int numb = 10;
numb += 5; //numb = numb + 5;
System.out.println("num : \t"+num);
System.out.println("numb : \t"+numb);
}
}
8.3.2算术运算符
算数运算符操作数必须是数值类型 分为一元运算符和二元运算符: 一元运算符,只有一个操作数; 二元运算符有两个操作数,运算符在两个操作数之间
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 - 相乘操作符两侧的值 | A * B等于200 |
/ | 除法 - 左操作数除以右操作数 | B / A等于2 |
% | 取余 - 左操作数除以右操作数的余数 | B%A等于0 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21(区别详见下文) |
-- | 自减: 操作数的值减少1 | B-- 或 --B 等于 19(区别详见下文) |
8.3.2.1 一元运算符
正‘+’,负‘-’,自加‘++’,自减‘--‘这四个。
正负号(+,-):在数值前,表示正数还是负数
自增、自减运算符: ++, --
自增、自减运算符可以用于数值变量之前或者之后
i++, 后++, 先将i的值作为整个表达的值, 然后将i增加1.
++i, 先++, 先将i增加1, 然后将i的值作为整个表达的值.
i--, 后--, 先将i的值作为整个表达的值, 然后将i减少1.
--i, 先--, 先将i减少1, 然后将i的值作为整个表达的值.
8.3.2.2 二元运算符
二元运算符:加'+',减'-',乘'',除'/',求余'%'。
在算数运算符中,”+“,”-“,”“,”/“完成加减乘除四则运算,%是求两个操作数相除后的余数。
运算规则和数学运算基本相同,在算数运算中,计算时按照从左向右的顺序计算,乘除和求余优先于加减,不同的是,程序中的乘运算符不可省略,在数学中可写为”y=2x“而程序中必须写为”y=2*x“。
public class Operator2 {
/**
*
* @param args
*/
public static void main(String[] args) {
/*
* 算数运算符
*/
//一元运算 +、-、++、--
int num = 10;
int numb = 10;
System.out.println("-num:\t"+(-num));
//++ 放后面
System.out.println("num++"+(num++)); // 10
//++放前面,优先计算++
System.out.println("++numb"+(++numb)); //11
System.out.println("num"+(num)); // 11
System.out.println("numb"+(numb)); //11
//二元算数运算符
num = 10;
numb = 4;
double d1 = 3.0;
double d2 = 6.0;
System.out.println("d1+d2 \t"+(d1+d2));
System.out.println("num+d1 \t"+(num+d1));
System.out.println("d1*num \t"+(num*d1));
System.out.println("d2/d1 \t"+(d2/d1));
//乘除法
System.out.println("num*numb \t"+(num*numb)); // 40
//整形除以整形 还是整形
System.out.println("num/numb \t"+(num/numb)); //2
//取模
System.out.println("num%numb \t"+(num%numb)); //2
}
}
8.3.3 关系运算符(比较运算符)
运算符 | 描述 | 例子 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
public class Operator3 {
/**
* 关系运算,比较运算
* @param args
*/
public static void main(String[] args) {
int numa = 100;
int numb = 100;
int numc = 102;
//关系运算的返回值,boolean true 真的, 反之false
System.out.println("numa > numb\t:"+(numa > numb)); //false
System.out.println("numa < numc\t:"+(numa < numc)); //true
System.out.println("numa >= numb\t:"+(numa >= numb)); //true
System.out.println("numa <= numb\t:"+(numa <= numb)); //true
System.out.println("numa != numb\t:"+(numa != numb)); //false
}
}
8.3.4逻辑运算符(布尔运算符)
操作符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
| | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
public class Operator4 {
/**
* 逻辑运算符
* @param args
*/
public static void main(String[] args) {
int numa = 100;
int numb = 100;
int numc = 102;
boolean success = numa>=numb && numb<=numc;
System.out.println("numa>=numb && numb<=numc :"+(numa>=numb && numb<=numc));
System.out.println("numa>=numb && numb<=numc :"+( true && true));
//&&
System.out.println("true && true: "+(true && true)); // true
System.out.println("true && false: "+(true && false)); // false
System.out.println("false && false: "+(false && false)); //false
// ||
System.out.println("true || true: "+(true || true)); //true
System.out.println("true || false: "+(true || false)); //true
System.out.println("false || false: "+(false || false)); //false
// ! 取反
System.out.println("!true \t"+(!true));
System.out.println("!false \t"+(!false));
}
}
8.3.5位运算
只对byte、short、char、int、long有效
操作符 | 描述 | 例子 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
public class Operator5 {
/**
* 位运算
* @param args
*/
public static void main(String[] args) {
int numa = 4;
int numb = 5;
System.out.println("numa & numb:"+(numa&numb));
System.out.println("numa | numb:"+(numa|numb));
System.out.println("numa>>1: \t"+(numa>>1));
System.out.println("numa<<1: \t"+(numa<<1));
System.out.println("1>>>1\t"+(1>>>1));
System.out.println("-1>>>1\t"+(-1>>>1));
}
}
8.3.6 条件运算符(?:)
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
variable x = (expression) ? value if true : value if false
int age = 61;
boolean success = age > 60 ? true: (age++)>60;
System.out.println(success);
System.out.println("age:"+age);
8.4 逻辑运算符和位运算符区别
逻辑与或同按位与或是有一定区别的:
相同点是:都能参与逻辑运算,按位与或完全可以代替逻辑与或;
区别是:按位与或可以参与位运算
,逻辑与或只能参与逻辑运算
,逻辑与或可以“短路”
,按位与或不能“短路”
。
短路运算
作用运算符:逻辑与&&,逻辑或||。
如(1):逻辑表达式:a>b && c>d
假设a>b 为false,c>d为true,那么整个表达式结果为false;
假设a>b 为false,c>d为false,那么整个表达式结果还为false;
可见,a>b的结果已经决定了整个表达式的结果,而后面的c>d并不影响表达式的结果,可以说后半部分被“短路”了。
如(2):逻辑表达式: a>b || c>d
假设a>b 为true,那么后半部分表达式将被“短路”;
int age = 60;
boolean success = true || (age++)>60;
System.out.println("success:"+success);
System.out.println("age:"+age);
8.3.7 instanceof 运算符
public class Operator6 {
/**
* instanceof
* @param args
*/
public static void main(String[] args) {
String name = "jshand";
System.out.println(name instanceof String); //true
}
}
8.5 运算符优先级
当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。
例如,(1+3)+(3+2)*2,这个表达式如果按加号最优先计算,答案就是 18,如果按照乘号最优先,答案则是 14。
再如,x = 7 + 3 * 2;这里x得到13,而不是20,因为乘法运算符比加法运算符有较高的优先级,所以先计算3 * 2得到6,然后再加7。
下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | expr++ expr-- | 从左到右 |
一元 | ++expr --expr + - ~ ! | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |
8.6 表达式
表达式是符合一定语法规则的运算符和运算数的序列。
算术表达式
(x+y-12)*100
关系表达式
x>y x>=y x!=y x==y
逻辑表达式
x&&y x||y||z (!x)&&(!y)
赋值表达式
x=y x+=y
表达式的值和类型
对表达式中操作数进行运算得到的结果称为表达式的值
表达式值的数据类型即为表达式的类型
表达式的运算顺序
应按照运算符的优先级从高到低的顺序进行
优先级相同的运算符按照事先约定的结合方向进行,例如:
从左向右(大部分): 2+3+4+5+6
从右向左:int a = 10;
8.7 数据类型转换规则
Java中可以进行不同数据类型的加减乘除运算。Java会将按照规则转换参与运算的数据类型。
自动类型转换(隐式类型转换)
满足两个条件: ①两种类型彼此兼容 ②目标类型的取值范围要大于源类型
强制类型转换(显示类型转换)
当两种类型彼此不兼容, 或目标类型取值范围小于源类型
byte b = 10;
//数据类型的转换,从小范围数据向大范围类型放,可以直接转换,自动转换 自动转型
int i = b;
//大数据类型向小类型转换,可能损失数据,直接赋值不可以,可以强制转换
double d1 = 3.14;
i = (int)d1;
System.out.println("I:"+i);
8.9 练习
1、已知a,b均是整型变量,写出将a,b两个变量中的值互换的程序。(知识点:变量和运算符综合应用)
2、给定一个0~1000的整数,求各位数的和,例如345的结果是3+4+5=12注:分解数字既可以先除后模也可以先模后除(知识点:变量和运算符综合应用)
3、华氏温度和摄氏温度互相转换,从华氏度变成摄氏度你只要减去32,乘以5再除以9就行了,将摄氏度转成华氏度,直接乘以9,除以5,再加上32即行。
4、给定一个任意的大写字母A~Z,转换为小写字母。 (知识点:变量和运算符)
答案:
