文章目录
1.为什么要static关键字?
当我们在创建对象的过程中,如果每个对象都有共用的特性,
我们即便知道也需要一个个得去初始化,这就显得比较麻烦复杂,
在java中引入了静态关键字static,被static修饰的成员,称之为静态成员,也可以称为 类成员,
其不属于某个具体的对象,是所有对象所共享的。
这样就可以实现我们想要的不同对象的共性。
2.static修饰成员变量
当类中的一个成员变量由static修饰后,就称为静态成员变量。
静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
class A {
public static int a = 20;
public int b;
public int c;
public void print(){
System.out.println(a+" "+b+" "+c+" ");
}
}
public class test {
public static void main(String[] args) {
A aclass = new A();
A bclass = new A();
aclass.a = 10;
aclass.b = 10;
aclass.c = 20;
bclass.a = 20;
bclass.b = 20;
bclass.c = 30;
aclass.print();
bclass.print();
}
}
运行结果:
20 10 20
20 20 30
如果A类中的变量a没有被static 修饰
public class A {
public int a = 20;
public int b;
public int c;
public void print(){
System.out.println(a+" "+b+" "+c+" ");
}
}
public class Test01 {
public static void main(String[] args) {
A aclass = new A();
A bclass = new A();
aclass.a = 10;
aclass.b = 10;
aclass.c = 20;
bclass.a = 20;
bclass.b = 20;
bclass.c = 30;
aclass.print();
bclass.print();
}
}
则运行结果为
10 10 20
20 20 30
不同之处在于aclass与bclass对象中的a变量的结果不同
两者不同的原因:
被static修饰后的成员变量,属于类的属性,不依赖于对象,
也就是说静态成员变量是类的特征,不同的对象去修改静态成员变量,
会直接改变所有对象的共有特征,这也就导致了两个代码运行结果的不同
。所以静态成员一般建议使用private修饰。
如何访问静态成员变量:
方式一:推荐
class A {
public static int a = 20;
public int b;
public int c;
public void print(){
System.out.println(a+" "+b+" "+c+" ");
}
}
public class test {
public static void main(String[] args) {
A.a = 10;
//类名.静态变量名
}
}
方式二:不推荐(因为静态变量是类的特性,不是对象的)
class A {
public static int a = 20;
public int b;
public int c;
public void print(){
System.out.println(a+" "+b+" "+c+" ");
}
}
public class test {
public static void main(String[] args) {
A aclass = new A();
aclass.a = 10;
//对象名.静态变量名
}
}
静态成员变量的特性:
1.不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2.既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3.HotSpot(Java虚拟机)中存储在方法区。
4.类变量存储在方法区当中
5.生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
3. static修饰成员方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,
不是某个对象所特有的,不依赖于对象。静态成员一般是通过静态方法来访问的。
***在一般的实际工程当中,静态变量一般会被private修饰这样在类外就无法访问到了
这个静态成员变量***
如何访问:一般通过静态方法访问
class A {
private static int a = 20;
public static int geta(){
return a;
}
}
public class test {
public static void main(String[] args) {
A.geta();
}
}
静态方法特性:
不属于某个具体的对象,是类方法
可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,推荐使用类名访问
***静态方法没有隐藏的this引用参数,因此不能在静态方法中访问任何非静态成员变量***
注意:由于静态方法是不依赖与对象的,所以没用this参数,而普通成员变量是需要实例化对象才可以产生的,所以在静态方法中自然无法访问普通成员变量
``可以在静态方法中通过创建该类对象去实现访问。
class A {
public int b;
public int c;
private static int a = 20;
public static void print(){
A aclass = new A();
System.out.println(aclass.b);
}
}