Java学习笔记02
变量
Java是一种强类型语言,每个变量都必须声明其类型,可以是基本类型或引用类型。变量名必须是合法的标识符。变量是可以变化的量,变量实际上代表了内存中一块空间,空间中存放的值是可变的。
为了增强可读性,不建议在一行中定义多个变量。
变量的要素包括变量名,变量类型和作用域。关于变量的作用域,需要介绍三种变量:
- 类变量:在类里面的变量,需要加关键字
static
- 实例变量:类似类变量,但没有
static
。在类的里面,方法外面。 - 局部变量:写在方法里面的变量
public class Demo{
String name;
int age;
//实例变量,在方法外面,又在类的里面。从属于对象
public static void main(String[] args) {
//main方法
int i = 10;//i是局部变量,只存在于本代码块
System.out.println(i);
Demo demo = new Demo();
//类名 变量名 = 操作符 构造器名
System.out.println(demo.age);
/*
没有初始化age却能正常输出,输出结果是0
实例变量如果不初始化则会变成该类型的默认值
*/
}
public void add() {
//其他方法
}
}
值得一提的是,布尔型变量的默认值是false。除了八种基本类型,其余变量默认值都是null。实例变量的输出很特别(System.out.println(demo.age);
),但加了static变成类变量了就可以直接输出。
与变量相对应的是常量,常量被初始化之后就不能被改变。常量名一般用大写字符,创建一个常量:final double PI = 3.14;
。Java中虽然有const
这个关键字,但并没有使用,定义常量需要用final
关键字。
Java中的修饰符不注重顺序,如果要让这个常量变成类变量,即可以写static final double PI = 3.14;
也可以将static和final交换位置。
变量的命名规范:
- 类变量、局部变量:首字母小写+驼峰原则,monthSalary
- 常量:大写字母+下划线,例如MAX_VALUE
- 类名:首字母大写+驼峰原则,Man,GoodMan
- 方法名:首字母小写+驼峰原则,run(),runRun()
运算符
Java运算符分为以下几种:
算术运算符:+,-,*,/,%,++,–
赋值运算符:=
扩展后的赋值运算符:+=,-=,*=,/=
位运算符:&,|,~,^,<<,>>,>>>
关系运算符:>,>=,<,<=,=,!=,instanceof
逻辑运算符:&&,||,!
条件运算符:? :
运算符优先级有一个记忆口诀:单算移关与,异或逻条赋。
单:单目运算符,比如逻辑非(!),按位取反(~),自增,自减
算:算数运算符,加减乘除取模
移:移位运算符,左移(<<),右移(>>),无符号右移
关:关系运算符,大于(>),小于(<),大于等于(>=),小于等于(<=),还有instanceof
与:按位与(&)
异:按位异或(^)
或:按位或(|)
逻:逻辑运算符(and or )
条:条件运算符 ?:
赋:赋值语句
++和–都是一元运算符,只需要一个变量就可运算。一元运算符有两种形式,符号在前面的叫前缀形式,比如++i。符号在后面的叫后缀形式,比如i++。
在表达式中,前缀形式会先完成+1,而后缀形式会先使用变量原来的值。记忆方法:加号在前就先加后使用,加号在后面就先使用后加。
public class Demo {
public static void main(String[] args) {
int i = 1;
int j = 1;
System.out.println(i++);
System.out.println(++j);
System.out.println(i+" "+j);
}
}
输出:
1
2
2 2
逻辑运算符中,与运算&&只有两个都是true才为true。而或运算||只需要有一个是true就为true。与运算和或运算按照短路方式求值,如果第一个操作数能够确定表达式的值,就不会运算第二个操作数。如expression1 && expression2
,如果第一个表达式的值为false,那么结果不可能为true,就不会运算第二个表达式。类似的,如果expression1 || expression2
中第一个表达式为true,那么结果肯定为true,第个表达式不会被进行运算。可以利用这一点避免错误:
x != 0 && 1/x > x+y //这样不会出现数字除以0的问题
位运算
&运算符都是1才取1,否则是0;|都是0才为0,否则是1;^相同取0,不同取1。下面是一个例子,不是Java代码。
位的与运算和或运算是没有短路原则的,左右两边的表达式都会被执行。
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~B = 1111 0010
一个面试题:如何计算2*8最快?答案是位运算
Java的位运算还有左移( << )、右移( >> ) 、无符号右移( >>> ) 。
public class Demo {
public static void main(String[] args) {
short i = 5;// i = 0000 0000 0000 0101
System.out.println(i<<2);
System.out.println(i>>2);
}
}
输出为:
20
1
i是一个short类型变量,short类型的大小是2B,即16位,因此i用二进制表示实际上是0000 0000 0000 0101
,将i左移之后得到的是0000 0000 0001 0100
,十进制数值为20。右移得到0000 0000 0000 0001
,十进制为1。
右移和无符号右移存在区别,>>>会使用0填充高位,>>则会使用符号填充高位。
+除了数学上的加法之外还可以作为字符串拼接符。
public class Demo {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(""+a+b);
System.out.println(a+""+b);
System.out.println(a+b+"");
}
}
结果为:
1020
1020
30
当括号内左边和中间有字符串时a和b都被作为字符串拼接起来了,但把空串放到右边的时候返回的结果却是a+b。
包机制
为了更好地组织类,Java提供了包机制用于区别类名的命名空间。包的本质就是文件夹,其语法为:
package package1[.package2[.package3...]];
一般使用公司域名倒置作为包名如com.baidu.www。使用包中的成员时需要在Java中导入包,pkg的导入必须放在最上面:
import package1[.package2...].(classname|*);
JavaDoc
javadoc用于生成api文档,加在类里面就是类的注释,加在方法里面就是方法的注释。