变量
变量分为成员变量和局部变量,成员变量在整个类内都有效,而局部变量只在声明它的方法内有效。成员变量又分为实例变量和类变量。
变量规范
-
一个变量里不要定义多个值
-
每个变量都要有类型(数据类型和引用类型都可以)
-
变量名必须是合法的标识符
-
变量声明后要以分号结尾
int a = 1; int b = 2; int c = 3;//注意程序可读性 String d = "sgh";
变量的命名规范
- 所有的变量、方法及类名起名时都要能够见名知意。
- **成员变量:**起名时除了第一个单词外,后面的单词首字母要大写。
- **局部变量:**起名时除了第一个单词外,后面的单词首字母要大写。
- **方法名:**起名时除了第一个单词外,后面的单词首字母要大写。
- **常量:**使用大写字母,两个或多个单词中间使用下划线。
- **类名:**所有单词首字母大写
变量作用域
局部变量
它在方法中,使用时必须声明初始化值。只在它的方法内才能使用
public class Variable {//类
//在类中可定义方法及属性
public static void main(String[] args) {//main方法,在类中
//局部变量
int i = 1;
System.out.println(i);//输出1
}
}
实例变量
它在方法外,在类的里面。它从属于对象(类:在类中可定义方法及属性(变量)),无需初始化。
-
若在实例变量中未进行初始化,系统会为其分配一个初始值
-
所有的数值类型(long,int,short,byte,float,double)均会初始化为 0 或 0.0
-
布尔值默认值(初始值)为false
-
字符型初始值’\u0000’的编码值为NULL,表示的意思就是空字符。所以输出时为空字符。
-
除了八大基本数据类型,其余的默认值都为null
public class Variable {//类 //在类中可定义方法及属性 String vegetable; int money; float sum; char num; boolean a1; public static void main(String[] args) {//main方法,在类中 //实例变量 //变量类型 变量名称 = new 变量类型 Variable v1 = new Variable(); //输出查看值 System.out.println(v1.vegetable);//string --> "null" System.out.println(v1.money);//int --> "0" System.out.println(v1.sum);//float --> "0.0" System.out.println(v1.num);//char --> "" System.out.println(v1.a1);//boolean --> false } }
输出结果如下图所示
类变量
它在方法外,在类的里面。它从属于对象,无需初始化()。
(除需添加一个static,且在方法中调用时不需要new来分配内存外,其余目前来看与实例变量并无区别)
用关键字static给予修饰**(其余未加static的为局部变量)**,也称为静态变量。
注:static需放在变量的类型前面
public class Variable {//类
//在类中可定义方法及属性
static double sum;
public static void main(String[] args) {//main方法,在类中
//类变量
System.out.println(sum);//输出0.0
}
}
实例变量与类变量的联系与区别
**联系:**都是在整个类内有效
**区别:**类变量需在定义名字(有时还会定义数值)时添加static,实例变量在方法中调用时需要new来分配内存
成员变量的隐藏
- 如果局部变量的名字与成员变量的名字相同时,成员变量会被隐藏,即这个成员变量在这个方法内暂时失效。
public class Variable {//类
//在类中可定义方法及属性
double sum = 30;
int num = 2;
public static void main(String[] args) {//main方法,在类中
//实例变量
int sum = 20;
System.out.println(sum);//输出值为20,而不是30.0。如果方法中没有"int sum = 20;",sum的值将为30.0。
}
}
- 如果想在该方法内使用被隐藏的局部变量,则必须使用this关键字(this可以出现在构造方法和实例方法中,但不可以出现在类方法中)
public class Variable {//类
//在类中可定义方法及属性
double sum = 30;
int num = 2;
public static void main(String[] args) {//main方法,在类中
//实例变量
int sum = 20;
Variable v1 = new Variable();
System.out.println(v1.sum);//调用构造方法中的变量,输出值为30.0。
System.out.println(sum);//输出值为20。
}
}
常量
常量用final表示
public class Variable {//类
//在类中可定义方法及属性
//修饰符(变量类型前都为修饰符)不存在先后顺序
static final double sum = 8.88;
final static double num = 9.99;
public static void main(String[] args) {//main方法,在类中
System.out.println(sum);//输出8.88
System.out.println(num);//输出9.99
}
}
运算符
很多运算会使用一些工具类来操作(调用Math类包,在该包中找到想要使用的方法)
算术运算符与算术表达式
加、减、乘、除和求余运算符(属于二目运算符,即连接两个操作元的运算符)。
算术表达式:用算术符号或括号连接起来的符合Java语法规则的式子
**注:**在进行运算时注意数据类型的作用范围,及时进行数据类型的转换
public static void main(String[] args) {
//二元运算符
//Ctrl+D:复制当前行到下一行
int a = 10;
int b = 20;
int c = 30;
int d = 40;
System.out.println(a+b);//输出30
System.out.println(a-b);//输出-10
System.out.println(a*b);//输出200
System.out.println(a/b);//输出0
System.out.println(a/(double)b);//注意数据类型的作用范围,输出0.5
System.out.println(a%b);//输出10(上0余10)
System.out.println((a+3)*b+c*d);//输出1460
}
算数混合运算的精度
精度从低至高排列:byte short char int long float double
- 如果表达式中有double类型,则按双精度进行运算
- 如果表达式中有float型,则按单精度进行运算(float和double同时出现,按双精度进行运算)
- 如果表达式中最高精度是long,则按long精度进行运算
- 如果表达式中最高精度低于int型或为int型,则按int精度进行运算
public static void main(String[] args) {
float f = 0.5565F;
double e = -4.9E-324;
long a = 888888888888L;
int b = 2147483647;//int最高值
short c = 32767;//short最高值
byte d = 127;//byte最高值
//有long类型输出时也为long类型
System.out.println(a+b+c+d);//输出891036405429(long)
//如果表达式中最高精度低于int型,则按int精度计算
System.out.println(b+c+d);//输出-2147450755(按int计算,超出了int的取值范围,所以溢出,无法正确输出)
System.out.println(c+d);//输出32894(int)
System.out.println(f+e);//输出0.5565000176429749(double)
System.out.println(a+f);//输出8.8888889E11(float)
}
关系运算符
含义 | 用法 | 运算符 | 结合方向 |
---|---|---|---|
大于 | op1>op2 | > | 从左到右 |
小于 | op1<op2 | < | 从左到右 |
等于 | op1=op2 | == | 从左到右 |
不等于 | op1!=op2 | != | 从左到右 |
大于等于 | op1>=op2 | >= | 从左到右 |
小于等于 | op1<=op2 | <= | 从左到右 |
关系运算返回的结果为true/false,即布尔值
public static void main(String[] args) {
int a = 60;
int b = 90;
System.out.println(a>b);//输出false
System.out.println(a<b);//输出true
System.out.println(a==b);//输出false
System.out.println(a!=b);//输出true
System.out.println(a<=b);//输出true
System.out.println(a>=b);//输出false
}
自增、自减运算符
含义 | 用法 | 运算符 |
---|---|---|
先给op2赋值,再进行自增运算(op1+1) | op2=op1++ | ++ |
先对op1自增,再为op2赋值 | op2=++op1 | ++ |
先给op2赋值,再进行自减运算(op1-1) | op2=op1– | – |
先对op1自减,再为op2赋值 | op2=–op1 | – |
注:op1进行自增或自减运算时,自己本身的数值要改变
public static void main(String[] args) {
int a = 5;
int b = a++;//先给b赋值(b=5),再进行自增运算(a=a+1=6)
int c = ++a;//先对a运算(a=a+1=6+1=7),再给c赋值(c=7)
System.out.println(a);//输出7
System.out.println(b);//输出5
System.out.println(c);//输出7
}
逻辑运算符与逻辑表达式
含义 | 用法 | 运算符 | 结合方向 |
---|---|---|---|
逻辑与 | op1&&op2 | && | 从左到右 |
逻辑或 | op1||op2 | || | 从左到右 |
逻辑非 | !op | ! | 从右到左 |
使用逻辑运算符进行逻辑运算
op1 | op2 | op1&&op2 | op1||op2 | !op1 |
---|---|---|---|---|
true | true | true | true | false |
true | false | false | true | false |
false | true | false | true | true |
false | false | false | false | true |
------ | ------ | 全为真则为真,其余为假 | 全为假则为假,其余为真 | 如果是真则为假,如果是假则为真 |
示例如下:
public static void main(String[] args) {
//与(and) 或(or) 非(取反)
boolean a = true;
boolean b = false;
System.out.println("a && b:"+(a&&b));//输出 a && b:false
System.out.println("a || b:"+(a||b));//输出 a || b:true
System.out.println("!(a && b):"+!(a&&b));//输出 !(a && b):true
}
短路运算
当逻辑与运算时,若第一个数据就为假时,那么第二个程序将不被执行。
//短路运算
int c = 8;
boolean d = (c<7)&&(--c<7);//若执行了"--c<7"这一程序,那么c的值则应为7
System.out.println(d);//输出false
System.out.println(c);//输出8,证明没有执行第二个程序
位运算符
用于二进制的计算。0代表假,1代表真。下表中运算结果使用的例子:op1为 0101 0101
(异或操作使用例子为op1) op2为 0010 0011
含义 | 用法 | 运算符 | 运算方法 | 运算结果 |
---|---|---|---|---|
与 | op1&op2 | & | 有0为0,全1为1 | 0000 0001 |
或 | op1|op2 | | | 有1为1,全0为0 | 0111 0111 |
非A即B | op1^op2 | ^ | 相同为0,不同为1 | 0111 0110 |
异或 | ~op | ~ | 取反操作 | 1010 1010 |
左移 | op1<<op2 | << | 左移几位乘以几个2 | 2<<3输出16 |
右移 | op1>>op2 | >> | 又移几位除以几个2 | 16>>3输出2 |
赋值运算符
含义 | 用法 | 运算符 | 运算方法 |
---|---|---|---|
与 | op1+=op2 | += | op1=op1+op2 |
或 | op1-=op2 | -= | op1=op1-op2 |
字符串连接符
符号为:”+“。若字符串在前面,后面的会拼接;若字符串在后面,前面的依旧进行运算。
int a = 10;
int b = 20;
System.out.println(""+a+b);//输出1020
System.out.println(a+b+"");//输出30
三元运算符
x(表达式) ? y : z 如果x==true,则结果为y,否则结果为z
int sum = 100;
String num = sum>60 ? "合格":"不合格";//输出合格
System.out.println(num);
优先级
多使用”()“,可使优先级更加明确,代码更加清晰明了。