static的使用
前提
当我们在编写类的时候,就是在描述其对象的属性和方法,但并没有产生实质性的对象,只有通过new才会产生出对象,这时系统才会分配内存空间给对象,它的方法属性才可被外部调用,但我们希望无论是否有对象,某些特定的数据在内存空间里只有一份。
例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
class Circle{
private double radius;
public Circle(double radius){
this.radius=radius;
}
public double findArea(){
return Math.PIradiusradius;
}
}
创建两个Circle对象
Circle c1=new Circle(2.0); //c1.radius=2.0
Circle c2=new Circle(3.0); //c2.radius=3.0
Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,不能被同一个类的不同对象所共享。 上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然。
如果想让一个类的所有实例共享数据,那就是类变量,如国家名字,利率等。所以我们在设计类时,要分析一下哪些变量不因对象的而发生改变,就将它设计为类属性,相应的方法称为类方法,类方法与调用者无关。
关键字的使用
-
static:静态的
-
static可以用来修饰:方法、属性、代码块、内部类
-
static用来修饰属性:静态变量(或类变量)
3.1属性:是否被Static修饰,可分为静态变量(类变量)和非静态变量(实例变量)。 实例变量:当我们创建类的好多对象后,每个对象就拥有了类的非静态属性,当修改这个对象的属性值时,并不会影响其他对象同样属性的值。 类变量:当我们创建类的好多对象后,每个对象都共享这个静态变量,当一个静态变量修改后,所有对象的这个静态变量值也会跟着修改。 3.2 补充: ①随着类的加载而加载,可通过“类.静态变量”的方式进行调用 ②优先于对象存在,静态变量的加载要早于对象的创建 ③类只会再一次,则静态变量在内存中也只会存在一次,存在方法区的静态域中 ④ 类变量 vs 实例变量 类 yes no 对象 yes yes
-
使用 static 修饰方法:静态方法:
① 随着类的加载而加载,可以通过 " 类 . 静态方法 " 的方式调用 ② 静态方法 非静态方法 类 yes no 对象 yes yes ③ 静态方法中,只能调用静态的方法或属性。 非静态的方法中,可以调用所有的方法或属性。
5.static 注意点:
5.1 在静态的方法内,不能使用 this 关键字、super 关键字。
5.2 关于静态属性和静态方法的使用,大家从生命周期的角度去理解。
- 开发中,如何确定一个属性是否需要声明 static 的?
—> 属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
—> 类中的常量也常常声明为 static。
开发中,如何确定一个方法是否要声明为 static 的?
—> 操作静态属性的方法,通常设置为 static 的;
—> 工具类中的方法,习惯上声明为 static 的。
比如:Math、Arrays、Collections