目录
有时候我们会遇到这种情况:
假设几只猫同时住在同一房号的猫窝,当我们通过类来实例化不同对象的时候就要一直不断的给同一个属性赋同样的值
class Cat{
public int age;
public String name;
public String room;
}
public class Test {
public static void main(String[] args) {
Cat cat1 = new Cat();
cat1.age = 1;
cat1.name = "dudu";
cat1.room = "X110";
Cat cat2 = new Cat();
cat2.age = 2;
cat2.name = "Acai";
cat2.room = "X110";
}
}
既然几只猫是住在同一只猫窝里,这样就可以使用static来修饰成员
1.static修饰成员
在java中,被static修饰的成员,称为静态成员,也可以称为类成员,不属于任何一个具体的对象,是所有对象所共享的。
2.static成员的特性
- 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 类变量存储在方法区当中
- 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
3.static修饰成员的举例运用
继续回到猫和猫窝
我们可以对静态成员通过对象名来调用,但不推荐这种方式。因为前面说过,静态成员也称为类成员,是所有对象所共享的。
class Cat{
public int age;
public String name;
//public String room;
public static String room = "X110";// 被static修饰的属性
}
public class Test {
public static void main(String[] args) {
Cat cat1 = new Cat();
cat1.age = 1;
cat1.name = "dudu";
//cat1.room = "X110";
System.out.println(cat1.name + "的房号是" + cat1.room);//对象名调用
Cat cat2 = new Cat();
cat2.age = 2;
cat2.name = "Acai";
System.out.println(cat2.name + "的房号是" + cat2.room);
//cat2.room = "X110";
}
}
对于静态成员的调用,我们一般使用类名
Cat.room;
4.static修饰方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
class Cat{
public int age;
public String name;
private static String room = "X110";// 被static修饰的属性
public static void sayName(Cat cat){// 静态方法/类方法 可以通过类名调用
System.out.println("我的名字叫" + cat.name);
}
}
public class Test {
public static void main(String[] args) {
Cat cat1 = new Cat();
cat1.age = 1;
cat1.name = "dudu";
Cat cat2 = new Cat();
cat2.age = 2;
cat2.name = "Acai";
Cat.sayName(cat1);
}
}
5.static方法的特性
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
- 不能在静态方法中访问任何非静态成员变量
- 静态方法不能调用任何非静态方法
6.private修饰的static成员
在一个类中,被private修饰的静态成员
class Cat{
public int age;
public String name;
private static String room = "X110";// 被static修饰的属性
}
public class Test {
public static void main(String[] args) {
System.out.println(Cat.room);//此处会报错
}
}
那这样的话该怎么调用被private修饰的静态成员呢?
可以用过静态方法来调用被private修饰的静态成员。
class Cat{
public int age;
public String name;
private static String room = "X110";// 被static修饰的属性
public static String getRoom(){//静态方法返回privat修饰的静态成员
return room;
}
}
public class Test {
public static void main(String[] args) {
Cat cat1 = new Cat();
cat1.age = 1;
cat1.name = "dudu";
Cat cat2 = new Cat();
cat2.age = 2;
cat2.name = "Acai";
System.out.println(Cat.getRoom());
}
}
调用成功
7.static成员变量初始化
静态成员变量的初始化分为两种,一种是就地初始化,另一种是静态代码块初始化
7.1就地初始化
即在定义变量的时候初始化,就像文章上面的静态成员均为就地初始化。
public static String room = "X110"
7.2静态代码块初始化
代码块就是一对花括号的内容,静态代码块就是在一个普通代码块上加上static
class Cat{
public int age;
public String name;
private static String room;// 被static修饰的属性
public static String getRoom(){
return room;
}
static{ //静态代码块
room = "X110";
}
static{
room = "X118";
}
static{ //最终还是X110
room = "X110";
}
}
7.2.1静态代码块的特性
- 静态代码块不管生成多少个对象,其只会执行一次
- 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)