Java基础语法学习感悟(2)
变量、常量
概念
如果某⼀个标识符表示的数据,在程序运⾏的过程中是可以发⽣改变的,这样的数据称为变量。
如果某⼀个标识符表示的数据,在程序运⾏的过程中是不能发⽣改变的,这样的数据称为常量。
变量常量的定义方式
//语法 :数据类型 标识符;
int age;
age = 30;//后赋值
//语法:数据类型 标识符 = 初始值;
int height = 175; //定义变量的同时给他赋一个初始值
//语法:数据类型 标识符1 ,标识符2, ...;
int a,b,c,d;//可以同时定义多个变量
int x,y = 20,z;//可以同时定义多个相同类型的变量,并对其中某些变量进行初始化赋值
常量的定义
//常量需要用关键字 final修饰
final int birthday = 2000; //定义一个常量,一旦赋值完成,值不能修改
//常量,也可以先声明,后赋值
final int day;
day = 30;
注释
注释,就是对某⼀段程序的解释、备注。注释的内容是为了提示程序员某段代码的功能的,注释部分的内容不会被
编译器编译运⾏。
在Java中,注释分为三种:
- 单行注释:顾名思义,就是注释一行的内容,用两个//表示
- 多行注释:注释多行的内容, /* 作为开头,以 */ 作为结尾
- ⽂档注释:常⽤于类、接⼝、⽅法前⾯。以 /** 作为开头,以 */ 作为结尾。
数据类型转换
⼀个变量声明完成后,已经在内存上开辟好了空间,此时这个空间⼤⼩是不允许改变的。也就是说⼀个变量的类型是不允许改变的。数据类型转换,其实就是定义⼀个新的指定类型的变量,然后将原来的变量的值给这个新的变量进⾏赋值。赋值完成后,新的变量和原来的变量值基本相同,并且类型也发⽣了改变,因此,这个过程就被称为数据类型转换。
在数据类型转换中,分为两种转型:⾃动类型转换 和 强制类型转换
自动类型转换
其实,就是⼀个直接的赋值操作,不需要进⾏任何额外的操作。常⻅于取值范围⼩的数据类型转型为取值范围⼤的数据类型。例如:byte转型为int
int、short、char类型的变量,在进⾏计算的时候,结果会⾃动的转型为int类型
强制类型转换
在进⾏赋值的时候,需要额外的操作来辅助完成。常⻅于取值范围⼤的数据类型向取值范围⼩的数据类型转型。
double a = 10.0;
int b = (int)a;//b=10;
int c = (int)(a+b);//a是double b是int a+b要先括起来
注意事项:
强制类型转换,可能会出现值溢出的问题。
在强制类型转换的时候,⾮常有可能出现的情况是两个类型的字节数不⼀样。如果出现这样的问题,取最后的指定的字节数的数据为新的变量赋值。
⾃动类型转换,由于不需要任何的额外操作,因此被称为 -- 隐式转换
强制类型转换,由于需要强制转换的操作,因此被称为 -- 显式转换
字符类型
字符类型的存储
任意的数据在计算机底层存储都是⼆进制数字,字符型也不例外。每⼀个字符在计算机底层存储的时候,都是以⼀个数字来存储的。每⼀个字符与数字的对应关系,需要在⼀个类似于字典的⽂件中存储,这样的存储了每⼀个字符与数字的对应关系的⽂件,被称为是 -- 字符集。
常⻅的字符集:ASCII、GB2312 。
世界上每⼀个国家都有⾃⼰的字符集,来存储⾃⼰国家的⽂字。为了将每⼀个国家的字符集统⼀起来,发明了unicode字符集。unicode被称为万国码,为了统⼀每⼀个国家的字符集,统⼀规定给每⼀个字符都分配两个字节的空间。这样会有⼀个问题:如果⼀个⽂本中所有的字符都可以⽤⼀个字节来表示,那么这个⽂本的体积翻倍了。
因此,肯·汤普森 在unicode的基础上,发明出了 utf-8(万国码、统一码) 的字符集。这个字符集也叫作万国码。但是这个字符集会针对每⼀个字符动态的分配空间⼤⼩。
字符类型与整型的相互转换
在Java中,字符类型可以和整型直接相互转换。
int x = 'a';
System.out.println(x);
char y = 97;
System.out.println(y);
转义字符
转义字符,就是⼀个 **\ **,常⽤于字符或者字符串中。可以将某些具有特殊含义的字符变成普通字符,不再具备特殊的含义。反斜线是⼀个转义字符,只会对后⾯的⼀个字符⽣效,使其转义。如果在⼀个字符串中,有多个特殊的字符,那么,每⼀个特殊字符的前⾯都需要添加⼀个转义字符。
char c = '\'';
System.out.println(c); // '
转义字符还有另外⼀个作⽤:转义字符可以配合某些普通的字符使⽤,使其具有特殊的含义。
\t : tab //制表符
\n : 换⾏ //编译时告诉控制台换行
\r : 回⻋ //编辑时换行
常用运算符
算术运算符
+ - * / %
以上⼏个运算的注意事项:
- 求模运算%:求余数, 5 % 3 = 2
- 关于/:整型与整型的计算结果,还是整型。最终除如果得到⼀个浮点型的结果,那么这个浮点型的数字会⾃动的转成整型数字,浮点型转整型,舍去⼩数点后⾯所有的内容,直接保留整数部分(不是四舍五入)。
- +用于字符串表示字符串的拼接,当加号左右有任一个是字符串都会自动将另一个转为字符串再做拼接
++ --
⾃增、⾃减运算符,对⼀个变量进⾏⾃增1、⾃减1。
注意事项:⾃增、⾃减运算是很多初学者很容易出错的地⽅。⾃增、⾃减运算符,可以放在变量的前⾯,也可以放在变量的后⾯。
放变量前:先对这个变量进⾏⾃增、⾃减操作,然后再使⽤这个变量的值。
放变量后:先使⽤这个变量的值,然后再对这个变量进⾏⾃增、⾃减操作。
int a = 10;
System.out.println(a++); // 10, a = 11
System.out.println(--a); // 10, a = 10
System.out.println(++a); // 11, a = 11
System.out.println(a--); // 11, a = 10
System.out.println(a); // 10
// 拓展:
// 在内存中进⾏各种计算的时候,其实是将计算的结果先存到了⼀个临时的空间中,然后再使⽤这个空间
//中的值给指定的变量赋值
a = a++;
System.out.println(a); // 10
赋值运算符
=
是⼀个赋值运算符,将等号右边的值给左边的变量进⾏赋值。
+= -= *= /= %=
将⼀个变量,在现有值的基础上,对⼀个数字进⾏运算
a += 3; // a = a + 3;
a -= 3; // a = a - 3;
a *= 3; // a = a * 3;
a /= 3; // a = a / 3;
a %= 3; // a = a % 3;
注意事项:
1、组合运算符,在给左侧变量进⾏赋值的时候,是进⾏了⼀次强制类型转换。
2、赋值运算,也有运算结果。赋值运算的结果,是赋值完成后的变量的值。
char c = 'a';
System.out.println(c += 2); // 结果是c,并不是99
byte n = 127; n++; // n += 1 n = n + 1
System.out.println(n); // 结果是-128
int a = 10;
System.out.println(a = 100); // 结果是赋值完成后的变量值100
关系运算符
对两个数据进⾏⼤⼩⽐较的运算
> < >= <= == !=
关系运算的结果⼀定是 boolean 类型
逻辑运算符
对两个boolean类型的变量进⾏的运算
& | ! ^
&:与,两真即为真,有任意⼀个为假,结果就是假。
|:或,两假即为假,有任意⼀个为真,结果就是真。
!:⾮,⾮真即假,⾮假即真。
^:异或,两个相同为假,两个不同为真。
&&:短路与, ||:短路或。
短路操作:如果在进⾏逻辑运算的时候,前半部分的内容可以决定最终的结果,则后半部分不参与运算。以后在使⽤逻辑运算的时候,如果没有特殊的需求,尽量使⽤短路操作。
int x = 10, y = 20;
boolean flag = x++ > --y && x-- < ++y;
System.out.println(flag); // false
System.out.println(x); // 11
System.out.println(y); // 19
位运算符
类似于逻辑运算,将两个整型数字的补码的每⼀位进⾏类似逻辑运算的操作。1相当于true,0相当于false。
& | ^ ~
注意事项:
~按位取反,是将⼀个数字的补码的每⼀位进⾏取反,包括符号位。
= 10; // 0000 1010
y = -20; // 1110 1100
/*
* 0000 1010
* 1110 1100
* 0000 1000
*/
System.out.println(x & y); // 8
/*
* 0000 1010
* 1110 1100
* 1110 1110 => 1001 0010
*/
System.out.println(x | y); // -18
/*
* 0000 1010
* 1110 1100
* 1110 0110 => 1001 1010
*/
System.out.println(x ^ y); // -26
/*
* 0000 1010
* 1111 0101 => 1000 1011
*/
System.out.println(~x); // -11
<< >> >>>
位移运算符,也叫作移位运算符。
将⼀个数字的补码的每⼀位向左或者向右移动指定的位数。
>> : 有序号右移,左侧补符号位。
>>>: ⽆符号右移,左侧补0。 1、左移运算符,每向左移动⼀位,相当于乘⼀个2 2、右移运算符,每向右移动⼀位,相当于除⼀个2,但是如果除的结果是浮点型数字,最后的结果是向下取整。
1、位异或:定理:⼀个数字和另外⼀个数字异或两次,肯定得到⾃⼰。
2、⾯试题:如何⾼效率的计算 2 * 8 解: 2 << 3
三目运算符
语法:
boolean变量或者boolean结果的表达式 ?值1 :值2
规则:
如果问号前⾯的boolean是true,整体的结果是值1;
如果问号前⾯的boolean是false,整体的结果是值2;
int a = 10, b = 20;
/*
先判断a和b的⼤⼩关系,
如果a > b成⽴,取a的值给max赋值,
如果a > b不成⽴,取b的值给max赋值
*/
int max = a > b ? a : b;
运算符的优先级
- 运算符的简单分类:
运算符根据操作数的不同,可以分为:⼀元运算符、⼆元运算符、三元运算符
⼀元运算符:只能操作⼀个操作数,++ -- ! ~ + - (此时的+和-代表的是正负)
⼆元运算符:只能操作两个操作数,
三元运算符:只能操作三个操作数,三⽬运算符。
- 运算符的优先级
1. ⼀元运算符 > ⼆元运算符 > 三元运算符
2. 算术运算:乘除模 > 加减
3. 逻辑运算:与 > 或
4. 赋值运算符的优先级是最低的
5. ⼩括号的优先级是最⾼的