程序的基本功能是处理数据,在程序中我们又是用变量来表示数据的,之前我们说过变量的使用及命名规则,下面我们说说变量的作用域
1、变量的使用有一个作用域的问题,作用域是指他存在的范围,只有在这个范围中,程序才能访问。
2、作用域决定了变量的生命周期。变量的生命周期是指从一个变量被创建并分配内存空间开始,到这个变量被销毁并清除其所占的内存空间的过程。当一个变量被定义时,它的作用域就被确定了。
按照作用域的不同,变量分为以下类型
a.1位置:定义在方法内部或方法的一个代码块内部
例:
public void method1() {
int a = 0; //局部变量,作用域为整个method01方法;
{
int b = 0; //局部变量,作用域为所处的代码块;
b = a;
}
b = 20; //编译出错,b不能被访问;
}
a.2局部变量没有默认值,使用前必须先初始化
a.3生命周期
例:
public class Sample {
public int add() {
int addResult = 1;
addResult = addResult+2;
return addResult;
}
public int subtract() {
int subResult = 1;
subResult = subResult-2;
return subResult;
}
public static void main(String[] args) {
Sample s = new Sample();
s.add();//开始局部变量addResult的生命周期,位于Java栈区;
//结束局部变量addResult的生命周期,退回到main方法;
s.subtract();//开始局部变量subResult的生命周期,位于Java栈区;
//结束局部变量subResult的生命周期,退回到main方法;
}
}
在Sample实例调用add方法后,局部变量addResult的生命周期就开始,并且addResult位于Java栈区。
执行完毕Sample实例的add方法,局部变量addResult的生命周期就结束了,退回到main方法;
b.1位置:在类中声明,作用域是整个类
b.2:实例变量有默认值,使用之前无需初始化
b.3生命周期
例:
class Calculate {
private int num1 = 0;
private int num2 = 0;
public int add() {
int result = num1 + num2;
num1 = num1+1;
num2 = num2+2;
return result;
}
public static void main(String[] args) {
Calculate t1 = new Calculate();//开始实例变量num1,num2的生命周期,num1,num2位于堆区
t1.add();
}
//执行完毕Calculate类的main方法,结束Calculate实例及它的实例变量num1,num2的生命周期,
//卸载Calculate类,Java虚拟机运行结束
}
位于方法或者构造方法的参数,它的作用域是整个方法或者构造方法。
和方法参数很相似,差别在于前者是传递参数给异常处理代码块,而后者是传递参数给方法或者构造方法。异常处理参数是指catch(Exception e)语句中的异常参数"e",它的作用域是紧跟着catch(Exception e)语句后的代码块。
= : int x=0,i=1,j=1;
*= : 这里的"*="由操作符"*"和"="复合而成,它等价于 a=a*b; 这种复合操作符能使程序变得更加简洁。
/= : a/=b 等价于 a=a/b;
%= : a%=b 等价于 a=a%b;
...
> : 大于
>= : 大于等于
< : 小于
<= : 小于等于
以上操作符只适用于整数类型和浮点数类型;
instanceof: 判断一个引用类型所引用的对象是否是一个类的实例。该操作符左边是一个引用类型,右边是一个类名或接口名。形式如下:
obj instanceof ClassName
或者
obj instanceof InterfaceName
例如:
String a = "zs";
System.out.println(a instance String); //输出true;
== : 等于
!= : 不等于
既可以是基本类型,也可以是引用类型
+ : 数据类型值相加或字符串连接;
a. 数据类型值相加;
int a=1+2; //a值为3;
b. 字符串连接
System.out.println(1+2+"a"); //输出3a
System.out.println(1+2.0+"a"); //输出3.0a
System.out.println(1+2.0+"a"+true); //输出3.0atrue
System.out.println("a"+1+2); //输出a12
System.out.println(1+"a"+2); //输出1a2
/ : 整除, 如操作数均为整数,运算结果为商的整数部分
int a1=12/5; //a1变量的取值为2
double a7=12/5.0; //a7变量的取值为-2.4
% : 取模操作符, 如操作数均为整数,运算结果为商的整数部分
int a2=13%5; //a2变量的取值为3
double a3=1%5; //a3变量的取值为1.0
>> : 算术右移位运算,也称做带符号右移位运算
int a1 = 12 >> 1; //a1变量的取值为6;
对12右移一位的过程为:舍弃二进制数的最后一位,在二进制数的开头增加一位符号位,由于12是正整数,因此增加的符号位为0。
结果(00000000 00000000 00000000 00001100)到(00000000 00000000 00000000 00000110)
>>> : 逻辑右移位运算,也称为不带符号右移位运算
int a1 = 12 >>> 1; //a1变量的取值为6;
对12右移一位的过程为:舍弃二进制数的最后一位,在二进制数的开头增加一个0。
结果(00000000 00000000 00000000 00001100)到(00000000 00000000 00000000 00000110)
int a2 = -12 >>> 2; //a2变量的取值为1073741821
对-12右移二位的过程为:舍弃二进制数的最后二位,在二进制数的开头增加二个0。
结果(00000000 00000000 00000000 00001100)到(01000000 00000000 00000000 000001)
<< : 左移位运算,也称为不带符号左移位运算
int a1 = 12 << 1; //a1变量的取值为24;
a. 对12左移一位的过程为:舍弃二进制数的开头一位,在二进制数的尾部增加一个0
结果(00000000 00000000 00000000 00001100)到(00000000 00000000 00000000 00011000)
int a2 = -12 << 2; //a2变量的取值为-48;
对-12左移二位的过程为:舍弃二进制数的开头二位,在二进制数的尾部增加二个0
结果(10000000 00000000 00000000 00001100)到(10000000 00000000 00000000 000110000)
& : 与运算,对两个操作元的每个二进制位进行与运算,运算规则为:1&1->1, 1&0->0, 0&1->0, 0&0->0;
| : 或运算,对两个操作元的每个二进制位进行或运算,运算规则为:1|1->1, 1|0->1, 0|1->1, 0|0->0;
^ : 异或运算,对两个操作元的每个二进制位进行或运算,运算规则为:1^1->0, 1^0->1, 0^1->1, 0^0->0;两个值相同,为0, 不同为1;
~ : 取反运算, ~1->0, ~0->1;
&& : 左边的布尔表达式的值为false, 整个表达式值肯定为false, 此时会忽略执行右边的布尔表达式。
|| : 左边的布尔表达式的值为true, 整个表达式值肯定为true, 此时会忽略执行右边的布尔表达式。
布尔表达式 ? 表达式1 : 表达式2
如果布尔表达式的值为true, 就返回表达式1的值, 否则返回表达式2的值
int score = 61;
String result = score>=60?"及格":"不及格";//返回结果为及格