Day04 Java中的变量,常量与运算符
五. 变量,常量
-
变量: 变量就是可以变化的量。可以理解为系统为变量名分配了一块内存空间,内存空间里储存了什么就是变量的值。
-
Java是一种强类型语言,每个变量都必须声明其类型。
-
Java变量是程序中最基本的储存单元,其要素包括变量名,变量类型和作用域。
//type varName [= vakue][{,varName [= value]}]; //数据类型 变量名 = 值;可以使用多个逗号隔开来声明多个同类型的变量 //具体的例子如下 int i = -1; int i1 = 1, i2 = 2;- 注意事项:
- 每个变量都必须有类型,可以是基本类型,也可以是引用类型。
- 变量名必须是合法的标识符。
- 变量声明是一个完整的语句,每一个声明都需要以分号(;)结尾.
- 变量作用域:分下面三种:类变量,实例变量,局部变量
先做了解
//一个实例 public class Variable { static int i = 0; //类变量 String str = "Hello world!"; //实例变量 public void method() { int b = 0; //局部变量 } }- 局部变量,存在于方法和语句块中,他的生命周期一般就是距离他最近的一对花括号( {} ).局部变量必须声明和初始化,否者无法使用。
-
public class A {
public static void main(String[] args) {
int i1; //定义在main方法中的两个局部变量
int i2 = 10;
System.out.println(i1); //没有初始化,无法输出,报错
System.out.println(i2); //正常输出10
}
}
-
实例变量:从属于对象,随着对象的创建而创建,一般拥有与对象相同的生命周期,如果没有手动指定初始化的值,则会在创建时自动使用定义类型的默认值进行初始化。
-
整数类型的默认值:0
-
小数类型的默认值:0.0
-
布尔类型的默认值:false
-
其余类型的默认值:null
-
- 注:如果要使用实例变量,需要先创建对应类。
public class Variable {
String name; //定义了四个类变量,其中一个给有初始值
int age;
String male = "Female";
double salary;
public static void main(String[] args) {
Variable var = new Variable();
System.out.println(var.name);//输出null
System.out.println(var.age);//输出0
System.out.println(var.male);//输出female
System.out.println(var.salary);//输出0.0
}
}
- 类变量:在实例变量前定义前加上关键字
static即为类变量,类变量无需新建对应类即可直接通过ClassName.varName调用。类变量的初始化机制遵循实例变量的初始化机制。
public class Variable {
//两个类变量,一个初始化了,一个没有
static String companyName = "Konoha";
static String position;
public static void main(String[] args) {
//没有新建对象直接使用
System.out.println(companyName);//输出konoha
System.out.println(position);//输出null
}
}
-
常量(Constant): 初始化后不能再改变的值。
常量可以理解为一种特殊的变量,他的值设定之后,在程序运行期间不允许被改变。定义使用
final关键词,定义语法如下:final type varName = value; final double PI = 3.14;注意:常量的名字一般全部使用大写的字符。
-
变量的命名规范:
- 所有的变量,方法,类名:见名知意,要让人看到就清楚是用来干嘛的。
- 类成员变量,局部变量和方法名:一般使用首字母小写和驼峰原则。如
lastName,showLastName(). - 常量:使用大写字母和下划线,如
MAX_NAME.
六. Java的运算符
-
Java的运算符可以分为以下几类:
- 算数运算符:+, -, *, /,%,++,--
- 赋值运算符:=
- 关系运算符:<, >, >=, <=, ==, !=, instanceof(对象部分再介绍)
- 逻辑运算符:&&(与), ||(或), !(非)
- 位运算符: &, |,^,~,>>,<<,>>>(做了解)
- 条件运算符: ? : (三目运算符)
- 扩展赋值运算符: +=, -=, *=,/=
-
下面直接通过程序演示各个运算符的用法
- 算数运算符:
int total = a + b; System.out.println(total); //输出a+b total = a - b; System.out.println(total); //输出a-b total = a * b; System.out.println(total); //输出a*b total = a / b; //出现问题,请思考 System.out.println(total); //输出a/b total = b % a; //%为取模运算,即取得 b / a 的余数 System.out.println(total); 算数运算中,得到的结果类型取决于操作数的类型,例如,int与int操作会得到int类型的结果,int和long操作会得到long的结果,Java在数字操作中,对高于int的类型操作时结果类型使用操作数中类型最高作为的结果的类型,对低于int类型的数字之间的操作结果依旧使用int类型作为结果的类型。
//算数运算符的结果类型问题 long ll = 123123123123123123L; int in = 123123; short sh = 12; byte by = 1; //可以使用IDE的功能看到结果的类型 System.out.println(ll+in+sh+by);//结果类型为long System.out.println(in+sh+by); //结果类型为int System.out.println(sh+by); //结果类型为int- 关系运算符:关系运算符得到的是一个boolean值.
boolean flag = false; flag = a < b; System.out.println(flag); flag = a > b; System.out.println(flag); flag = a != b; System.out.println(flag); flag = a == b; System.out.println(flag);- 逻辑运算符:与或非,得到的结果是一个boolea值
//自己尝试看看得到的结果是否与你想的一致 flag = (a < b) && (a != b); System.out.println(flag); flag = (a < b) && (a == b ); System.out.println(flag); flag = (a > b) || (a == b ); System.out.println(flag); flag = (a < b) || (a != b); System.out.println(flag); flag = !(a < b); System.out.println(flag); flag = !(a > b); System.out.println(flag);- 逻辑运算符&&的短路运算性质:当 && 前一个操作数为 false 时便不再计算后面的表达式,直接返回false
//逻辑运算符&&的短路运算例子 boolean bo1 = false; int a1 = 3; boolean bo2 = bo1 && (++a1>3); System.out.println(a1); //输出为3,++a1未执行-
自增运算符++, 自减运算符--
自增自减运算符的功能相当于a=a+1;他们是单目运算符,可以放在变量的前面或者后面,但是两者在某些时候会有一些不同的差异,通过以下的例子简单说明:
//看如下的代码,以++为例,--规则相同 int i1 = 3; int i2 = i1++; System.out.println(i1); //输出4 int i3 = ++i1; System.out.println(i1); //输出5 System.out.println(i2); //输出3 System.out.println(i3); //输出5可以看出 i1++ 在执行完成 i2 = i1 后才被执行,而++i1 在执行 i3 = i1 之前执行了。我们可以先简单的认为前置++运算符会先执行,而后置的++运算符会在执行完当前操作之后在执行。--运算符同理。
//由此我们可以通过如下的代码理解他的原理 int i1 = 3; //int i2 = i1++ 可以看做执行了以下语句 int i2 = i1; i1 = i1 + 1; //int i3 = ++i1 可以看做执行了以下语句 i1 = i1 +1; int i3 = i1;-
位运算
- &:按位取与
- | :按位取或
- ^ :按位异或
- ~ :按位取反
- <<:按位左移,溢出舍去
- >>:按位右移,溢出舍去
我们通过一下的例子直接认识这几个操作符:
两个二进制数A, B
A = 0000 1100
B = 0000 1101
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~B = 11110010
一个二进制数A = 0000 0001,左移,右移同理
A << 1 0000 0010
A << 2 0000 0100
左移右移根据二进制的规则我们可以发现,他们风别对应 *2 与 /2 ,而且效率极高。
- 扩展赋值运算符:以+=为例,其余同理
//通过这个例子理解 int a = 5; int b = 6; a += b; System.out.println(a); //输出11 //即 a += b 等同于下面的语句 a = a * b; //其它运算符可以自己尝试-
条件运算符: ? : (三元运算符)
语法和使用如下
// x ? y : z
//如果 x == true, 返回y,否则返回z,x可以是值,表达式等。
//一个例子
int score = 50;
String level = score < 60 ? "及格" : "不及格";
System.out.println(level); //输出不及格
score = 70;
System.out.println(score < 60 ? "及格" : "不及格"); //输出及格
-
扩展: + 作为字符串连接符
当 + 的某一侧的操作数为String类型时,就会将非字符串的数据转换成字符串,然后将他们作为字符串按照顺序连接起来。
//看两个例子
int i1 = 3;
int i2 = i1++;
int i3 = ++i1;
// + 作为字符串连接符的例子
System.out.println(i3+""); //输出“5”
System.out.println("" + i2 + i3); //输出“35”
System.out.println(i2 + i3 + ""); //输出“8
连接符从左向右运算,直到发现字符串才会转换,之前的操作按照原先的规则进行运算。
- 运算的优先级问题:Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级最低。建议使用括号组织表达式的优先级。使用优先级为 1 的小括号可以改变其他运算符的优先级,即如果需要将具有较低优先级的运算符先运算,则可以使用小括号将该运算符和操作符括起来。相关运算的优先级在此不多赘述,见下表,多多尝试。
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 1 | ()、[]、{} | 从左向右 |
| 2 | !、+、-、~、++、-- | 从右向左 |
| 3 | *、/、% | 从左向右 |
| 4 | +、- | 从左向右 |
| 5 | «、»、>>>«、»、>>> | 从左向右 |
| 6 | <、<=、>、>=、instanceof | 从左向右 |
| 7 | ==、!= | 从左向右 |
| 8 | & | 从左向右 |
| 9 | ^ | 从左向右 |
| 10 | | | 从左向右 |
| 11 | && | 从左向右 |
| 12 | || | 从左向右 |
| 13 | ? : | 从右向左 |
| 14 | =、扩展运算符 | 从右向左 |

浙公网安备 33010602011771号