关键字static
1.作用对象
可以用来修饰的结构:主要用来修饰类的内部结构
属性、方法、代码块、内部类
2.static修饰属性(又称类变量)
是否使用static修饰属性,可分为 静态属性 和 非静态属性(实例变量)
2.1非静态变量
创建类的多个对象,各个对象独立拥有自己的非静态变量,当修改一个对象中的非静态变量不会影响其他对象中同名的非静态变量的值。
2.2静态变量
创建类的多个对象,所有对象都会共享用一个静态变量,当任意一个对象修改该静态变量后,其他对象调用的都是修改后的静态变量。
2.21其他说明
-
静态变量随着 类的加载 而 加载,
因此静态变量的加载早于对象的创建,
因此可以通过“ 类.静态变量 ”的方式来调用,
因此又称为 类变量 。
-
由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中
-
类变量 实例变量 类 可以调用,通过“类.类变量”来调用 不可以调用 对象 可以调用 可以调用
-
静态变量的内存解析
static修饰方法(又称类方法)
- 也是随着类的加载而加载,可以通过“类.静态方法”来调用
静态方法 | 非静态方法 | |
---|---|---|
类 | 可以调用,通过“类.静态方法”来调用 | 不可以调用 |
对象 | 可以调用 | 可以调用 |
-
静态方法中,只能调用 静态的方法或者属性
非静态方法中,既可以调用 非静态的方法或属性,也可以调用 静态的方法或属性
注意点
- 在静态方法中,不能使用this、super关键字,因为此时对象还未创建,而this、super指代的就是当前对象和父类对象,因此不能使用这些关键字。
- 从生命周期去理解静态属性和静态方法
如何判断属性方法是否使用static关键字
属性
- 属性时可以被多个对象所共享的,不会随着对象的不同而不同
- 类中的常量也常声明为static,比如Math.PI,常调用它,因此直接声明为static
方法
- 操作 静态属性 的方法通常设置为static
- 工具类的方法,习惯声明上为static的,比如Math、Arrays、Collections,不然使用时还要再创建个对象才能使用,很不方便
class Circle{ //static的综合运用
private double radius;
private int id;//自动赋值
public Circle(){
id = init++;
total++;
}
public Circle(double radius){
this();
this.radius = radius;
}
private static int total;//记录创建的圆的个数
private static int init = 1001;//static声明的属性被所对象所共享
public double findArea(){
return 3.14 * radius * radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public int getId() {
return id;
}
public static int getTotal() {
return total;
}
}
关键字Final
译为 最终的
作用于:
用来修饰:类、方法、变量
final用来修饰一个类:
此类不能被其他类所继承。比如:Sting类、System类、StringBuffer类
final用来修饰方法:
此方法不可以被重写。比如:Object类中getClass();
final用来修饰变量:
-
此时的 “变量” 可称为常量,不能随便修改赋值
-
final修饰属性,可以考虑赋值的位置
显式初始化(固定不变时选这种方式)
final int first = 10;
代码块中初始化(静态和非静态都可以,相应的静态代码块需要变量声明时也加上静态static关键字)(需要调用方法或者时异常等选这种方式)
final int second; { second = 20; }
构造器中初始化(需要经常修改选构造器)
public class FinalTest{ final int third; public FinalTest(int n){ third = n; } }
不可以在方法里边赋值(不管是静态还是非静态方法),因为方法是在对象创建好了才调用的,而对象创建的时候就已经需要加载属性,此时的final变量还未赋值,则会报错
final用来修饰形参(局部变量):
尤其是使用final修饰形参时,表明此形参是一个常量。
当我们调用此方法时,给常量形参赋一个实参。
一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。
public class Test{
public void methodtest(final int n){
n = 20;//编译报错
sout(n);
}
psvm{
Test t1 = new Test();
t1.methodtest(10);
}
}
static可以用来修饰:方法、属性、内部类、代码块
final可以用来修饰:方法、属性、类
因此static final可以用来修饰:方法、属性,当修饰属性时常称为: 全局常量