运算
参数传参
本质上是将对象的地址以值的方式传递到形参中
在方法中改变对象的字段值会改变原对象该字段值,因为引用的是同一个对象。
方法里和方法外的两个指针指向了不同的对象。
float与double
Java 不能隐式执行向下转型,因为这会使得精度降低。
1.1f 字面量才是 float 类型。
1.1 字面量属于 double 类型
字面量 1 是 int 类型
使用 += 或者 ++ 运算符会执行隐式类型转换。
switch 不支持 long
关键字
final
1.数据
- 对于基本类型,final 使数值不变;
- 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
2.方法
声明的方法不能被子类重写
3.类
声明的类不允许被继承
static
1.静态变量
- 静态变量:又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存中只存在一份。
- 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
public class A {
private int x; // 实例变量
private static int y; // 静态变量
public static void main(String[] args) {
// int x = A.x; // Non-static field 'x' cannot be referenced from a static context
A a = new A();
int x = a.x;
int y = A.y;
}
}
2.静态方法
静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法。
只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字,因此这两个关键字与具体对象关联。
3.静态语句块
静态语句块在类初始化时运行一次。
4.静态内部类
非静态内部类依赖于外部类的实例,也就是说需要先创建外部类实例,才能用这个实例去创建非静态内部类。而静态内部类不需要。
public class OuterClass {
class InnerClass {
}
static class StaticInnerClass {
}
public static void main(String[] args) {
// InnerClass innerClass = new InnerClass(); // 'OuterClass.this' cannot be referenced from a static context
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.new InnerClass();
StaticInnerClass staticInnerClass = new StaticInnerClass();
}
}
静态内部类不能访问外部类的非静态的变量和方法。
5.静态导包
在使用今天方法和变量时不用再指定ClassName
import static com.xxx.ClassName.*
6.初始化顺序
静态变量和静态语句块优于实例变量和普通语句块,最后才是构造函数的初始化。
存在继承的情况下,初始化顺序为:
- 父类(静态变量、静态语句块)
- 子类(静态变量、静态语句块)
- 父类(实例变量、普通语句块)
- 父类(构造函数)
- 子类(实例变量、普通语句块)
- 子类(构造函数)