变量
对于任何一种编程语言,对于变量进行操作都是不可避免的,操作变量是编程语言的重要功能之一。变量用于存储内容,比如"Hello World"
字符串,对于这个变量而言,它是有自己的存储地址的,我们如果想复用它的存储地址,就需要给它一个存储名称,不然计算机也无法找到这个地址。
现在可以了解到两个重要信息:
-
变量是解决内容复用的
-
变量是有名称的
由于Java是一个面向对象的语言,Java 把一切内容(字符串、数字、布尔、日期、时间)都用对象来表示,在Java中,变量内容即是对象。
在Java中,每个变量都有一个类型(type),在声明变量时,变量的类型位于变量名之前。例:
double salary; int vacationDays; long earthPopulation; boolean done;
变量命名规则:
变量名必须是一个以字母开头或数字构成的序列。
变量名中所有的字符都是有意义的,并且大小写敏感。变量名的长度基本上没有限制。
与大多数程序设计语言相比,Java中“字母”和数字的范围更大。字母包括'A'~'Z','a'~'z','_'、'$'或在某种语言中表示字母的任何Unicode字符。例如:
德国的用户可以在变量名中使用字母'ä';
希腊人可以用π。
同样,数字包括’0'~'9’和在某种语言中表示数字的任何Unicode字符。但'+'和空格不能出现在变量名中。
注:
① 要想知道哪些Unicode属于”字母“,可以使用character类的isJavaIdentifierStart和isJavaIdentifierPart方法来检查。
② 尽管$是一个合法的Java字符,但不要在自己代码中使用这个字符。它只用在Java编译器或其他工具生成的名字中。
不能使用Java保留字作为变量名
变量的声明
创建变量的时候,如果我们想要存储一个字符串,可以声明一个新的字符串变量。
String saySomething;
声明的格式 : 数据类型 变量名; 在对于变量进行完声明后,即可以对其进行初始化。
变量初始化
声明一个变量之后,必须用赋值语句对变量进行显示初始化,千万不要使用未初始化的变量。例如,Java编译器认为下面的语句序列时错误的:
int vacationDays; System.out.println(vacationDays); //ERROR--variable not initialized
变量名 = 值 的方式对于已经声明过的变量进行赋值。
也可以将变量的声明与初始化放在同一行
int vacationDays = 12;
在Java中,可以将声明放在代码中的任何地方。例如下面是合法的:
double salary = 65000.0; System.out.println(salary); int vacationDays = 12; //OK to declare a variable here在Java中,变量的声明尽可能地接近变量第一次使用的地方,这是一种良好的程序编写风格。
变量的重复赋值
String say = "Hello"; say = "Hello u" // 现在字符串变量say的内容就变为了 Hello u
注 Java保留字
虽然变量名可以任意设定,但是 Java 保留了一些名称,这些名称是不允许我们来声明的,这就是关键字。一般来说在编辑器中关键字也会高亮显示的。
abstract , assert(用来查找内部程序错误) , boolean , break , byte , case , catch , char , class , const , continue , default , do , double , else , enum , extends , final , finally , float , for , goto , if , implements , import , instanceof , int , interface , long , native , new , null , package , private , protected , public , return , short , static , strictfp , super , switch , synchronized(对线程来说是原子的方法或代码块) , this , throw , throws , transient(标志非永久的数据) , try , void , volatile(确保一个字段可以由多个线程访问) , while.
数据类型
在所有的编程语言里,基本上都包含三种基础数据类型,那就是:
字符串
数字
布尔
Java是一种强类型语言:这就意味着必须为每一个变量声明一种类型。
在Java中一共有 8 种基本类型(primitive type),其中有4种整形、2种浮点型、1种用于表示Unicode编码的字符单元的字符类型char和一种用于表示真值的boolean类型。
字符串
字符串我们在前面已经运用过多次了,基本上任意的字符、文本之类的内容都可以用字符串来表示,在 Java 中字符串类型就是 String
,它的值需要使用" "
包围。
在后面还会继续了解字符串的高级用法。
数字
数字类型稍微多一些知识点,因为数字有几个类型
-
小整数
-
大整数
-
浮点数
Java 关于这三种数字有多个类型去匹配,我们这里暂时只记住三个就可以,以后我们再来深入学习,分别是
-
小整数 int
-
大整数 long
-
浮点数 double
小整数和大整数的区别在于存储的数据大小不一样,我们一般接触的数字都是小整数,所以用大部分时候 int 就可以了。
int 和 long 的区别是(这里先有个概念即可)
int
最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)
最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)
long
最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)
最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)
注意 long 类型赋值的时候要在数字最后面跟上一个小写的 l
(注意是字母 L 不要看错),比如
long num = 78900000123l;
整型
类型 | 存储需求 | 取值范围 |
---|---|---|
int | 4字节 | -2147483648~2147483647 (正好超过20亿) |
short | 2字节 | -32768~32767 |
long | 8字节 | -9223732036854775808~-9223732036854775807 |
byte | 1字节 | -128~127 |
在Java中,整型的范围与运行Java代码的机器无关。
在Java中,所有的数值类型所占的字节数量与平台无关。
浮点类型
float 类型数值有一个后缀F或f(如3.14F),没有后缀F的浮点数值(3.14) 默认为double类型,当然也可以在浮点数值后面添加后缀D或d。
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 大约 +- 3.40282347E+38F(有效位数为6~7位) |
double | 8字节 | 大约 +- 1.79769313486231770F(有效位数为15位) |
char 类型
char 类型原本用于表示单个字符。不过,现在情况已经有所变化。如今,有些Unicode字符可以用一个char 值描述,并外一些Unicode 字符则需要两个char 值。
char类型的字面量值要用单引号括起来 如:’A’ 位65所对应的字符常量,它与”A” 不同,”A”是包含一个字符’A’的字符串。
char 类型的值可以为十六进制值,其范围从\u0000 到 \Uffff 例如:\u2122 表示注册符号(TM),\u03C0表示希腊字母π。
转义序列:
转义序列 名称 Unicode值 \b 退格tab \u0008 \t 制表 \u0009 \n 换行 \u000a \r 回车 \u000d \” 双引号 \u0022 \’ 单引号 \u0027 \\ 反斜杠 \u005c
Unicode 类型和 char类型
要想弄清char类型,就必须了解Unicode编码机制。Unicode打破了传统字符编码机制的限制。在Unicode出现之前,已经有许多种不同的标准:美国的ASCII、西欧语言中的ISO 8859-1、俄罗斯的KOI-8、中国的GB 18030和BIG-5等。这样就产生了下面两个问题:一个是对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母;二是采用大字符集的语言其编码长度有可能不同。例如,有些常用的字符采用单字节编码,而另一些字符则需要两个或更多个字节。 设计Unicode编码的目的就是要解决这些问题。
从Java SE 5.0 开始:
码点(code point)是指与一个编码表中的某个字符对应的代码值。在Unicode标准中,码点采用十六进制书写,并加上前缀U+,例如U+0041就是拉丁字母A的码点。Unicode的码点可以分成17个代码级别(code plane)。第一个代码级别称为基本的多语言级别(basic multilingual plane),码点从U+0000到U+FFFF,其中包括经典的Unicode代码;其余的16个级别码点从U+10000到U+10FFFF,其中包括一些辅助字符
UTF-16编码采用不同长度的编码表示所有Unicode码点。
在Java中,char类型描述了UTF-16编码中的一个代码单元。 我们强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理。
布尔
比如说
// 是否允许 boolean isAllow = true;
运算符
基础运算符
学习了变量的赋值和基础类型之后,现在我们可以玩一点有意思的内容了,大家都知道计算机最早被设计的原因是因为人肉的数学计算太慢了。看一小段历史
世界上第一台电子计算机是个庞然大物:重 30 余吨,占地约 170 平方米,肚子里装有 18000 只电子管。它是 1946 年 2 月 14 日,在美国宾夕法尼亚大学诞生的。 在第二次世界大战中,敌对双方都使用了飞机和火炮,猛烈轰炸对方军事目标。要想打得准,必须精确计算并绘制出”射击图表”。经查表确定炮口的角度,才能使射出去的炮弹正中飞行目标。但是,每一个数都要做几千次的四则运算才能得出来,十几个人用手摇机械计算机算几个月,才能完成一份”图表”。针对这种情况,人们开始研究把电子管作为”电子开关”来提高计算机的运算速度。许多科学家都参加了实验和研究,终于制成了世界上第一台电子计算机,起名为”埃尼阿克”。
所以对于编程首要解决的是用计算机做数学运算,从最基本的加减乘除开始,在编程语言中加减乘除这些数学符号称为:运算符
-
加法运算符 +
-
减法运算符 -
-
乘法运算符 *
-
除法运算符 /
-
取模运算符 %
我们可以同时使用变量+数字
来完成计算表达式,比如
// 1小时= 60 分钟,1分钟 = 60s,那么1小时= ?秒 int second = 1*60*60; System.out.println(second);
我们还可以把上面的代码再修改一下,改成用变量的方式来完成计算
int unit = 60; int hour = 1; int second = hour*unit*unit; System.out.println(second);
现在我们再看一个计算平均分的例子
int total = 0; int u1 = 80; total=total+u1; int u2 = 90; total=total+u2; int u3 = 50; total=total+u3; int u4 = 65; total=total+u4; int average = total/4; System.out.println(average);
关于 Java 计算还有一个比较隐晦的逻辑,大家可以猜一下下面代码的结果是?
int now = 59; System.out.println(now/60);
你会发现结果居然是 0,而不是 0.9833333333333333,为什么呢?
Java 执行的是整除除法,也就是说当两个操作数都是整数时,结果也会自动变成整数(直接去掉了小数点的值)
所以如果想计算百分比这种需求的话
int now = 59; System.out.println(100*now/60);
如果我们想计算浮点类型的话,那就需要使用 double
double now = 59; double result = now/60; System.out.println(result);
多介绍一下,除了数字类型数据可以进行加减乘除,字符串也可以利用 +
字符串使用
+
可以让多个字符串链接在一起,如果字符串+数字也会变成字符串
public static void main(String[] args) { String name = "杺羽"; System.out.println("姓名:"+name+" 年龄:"+18); }
结合赋值和运算符
x += 4; //等价于 x = x+4;
自增自减运算符
在代码中,加一建议是数值变量最常见的操作。分为前缀后缀两种形式:
int m = 7; int n = 7; int a = 2* ++m; //now a is 16 , m is 8; int b = 2* m++; //now b is 14 , n is 8;
关系和boolean运算符
要检测相等性,可以使用两个等号==。例如3=7; //result false
,另外可以使用 !=
检测不相等 3 != 7; //result true
==用于基本数据类型的直接比较,直接比较两个数据的地址来判断两个数据是否相等,比较两个引用数据类型的属性值用equals方法。在Object类中定义了equals方法来比较两个对象是否相等,例如在String对象中重写的equals方法用来比较两个字符串是否相等。
运算符 | 用法 | 含义 | 说明 |
---|---|---|---|
&& | a&&b | 短路与 | ab 全为 true 时,计算结果为 true,否则为 false |
|| | a||b | 短路或 | ab 全为 false 时,计算结果为 false,否则为 true |
! | !a | 逻辑非 | a 为 true 时,值为 false,a 为 false 时,值为 true |
| | a|b | 逻辑或 | ab 全为 false 时,计算结果为 false,否则为 true |
& | a&b | 逻辑与 | ab 全为 true 时,计算结果为 true,否则为 false |
短路运算符中,当表达式a能够确定结果的真值的时候,程序将不再判断表达式b。
短路与(&&)和短路或(||)能够采用最优化的计算方式,从而提高效率。在实际编程时,应该优先考虑使用短路与和短路或。
&& 与 & 区别:如果 a 为 false,则不计算 b(因为不论 b 为何值,结果都为 false)
|| 与 | 区别:如果 a 为 true,则不计算 b(因为不论 b 为何值,结果都为 true)
Java 也支持三目运算:
condition ? expression1 : expression2;
如果条件condition为true , 则为第一个表达式的值,否则为第二个。
位运算符
处理整型类型时,可以直接对组成整型数值的各个位完成操作。这意味着可以使用掩码技术得到整数中的各个位。
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 全为1,结果为1 |
| | 或 | 全为0,结果为0 |
^ | 异或 | 相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进制位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进制位全部右移若干位,0补高位,低位移除 |
>>> | 无符号右移 | 各二进制位全部右移若干位,符号位补高位,低位移除 |
>>和<<运算符将位模式左移或右移。需要建立位模式来完成掩码时,这两个运算符会很方便.
>>>会用0填充高位,这与>>不同,它用符号位填充高位。不存在<<<。
括号与运算符级别:
同一级别的运算符按照从左到右到次序进行计算:
运算优先级:
运算符的优先级从上到下递减
运算符 | 结合性 |
---|---|
[].() (方法调用) | 从左往右 |
! ~ == – + - ()(强转) new | 从右往左 |
*/% | 从左往右 |
<< >> >>> | 从左往右 |
< <= > >= instanceof | 从左往右 |
== != | 从左往右 |
& | 从左往右 |
^ | 从左往右 |
| | 从左往右 |
?: | 从右往左 |
= += -= *= /= %= &= |= ^= <<= >>= >>>= | 从右往左 |
结合性:
a && b || c 等价于 (a && b) || c -------------------> 从左往右
a +=b += c 等价于a+=(b+=c) -------------------> 从右往左