下面笔者,按照之前的Student进行简单的说明:
class Student {
private String name ;
private int age ;
private String classRoom ;//上课教室
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void doClass() {
System.out.println("姓名 "+ name +" 年龄 " + age +"正在上课学习");
}
}
public class Main {
public static void main(String[] args) {
Student student1 = new Student("小赵",21);
student1.doClass();
Student student2 = new Student("小吴",19);
student2.doClass();
Student student3 =new Student("小王",20);
student3.doClass();
}
}
上述代码的运行结果为:
对于上述的代码,笔者画图简单解析一下:(堆区)
但是,对于每个学生的classRoom(上课教室)都一样!!因此,我们可以:
public static String classRoom ="山东大学数计学院!";
因此,当我们加了static 以后,每个对象里面,就没有了classRoom 只有name 和age ,此时的classRoom 在方法区!
因此,相当于,全部的学生,都在一个教室: 山东大学数计学院!
在Java当中,被static修饰的成员变量称为静态成员,也可以称为:类成员!其不属于某个具体的对象,是所有对象所共享的!
static修饰的成员变量,称为静态成员变量:
静态成员变量特性 :
- 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 类变量存储在方法区当中
- 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁
笔者将上面的代码;public static String classRoom ="山东大学数计学院!";,通过类名访问一下:
class Student {
private String name ;
private int age ;
//private String classRoom ;//上课教室
public static String classRoom ="山东大学数计学院!";
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void doClass() {
System.out.println("姓名 "+ name +" 年龄 " + age +" 正在上课学习");
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Student.classRoom);
}
}
上述代码的运行结果为:
在上述的代码中,没有开辟对象,但是仍能打印出来结果,证明,静态类的成员不属于对象,所以不用通过对象的引用来访问,直接通过类名就可以访问!!(静态不依赖于对象!)
下面讲解一下:用static修饰的成员方法!
打今儿起,开始接触静态成员修饰的方法,所以,对于成员方法的叫法,我们也该改改口了!!
静态成员方法:大致的写法为:
public static void func() {
System.out.println("static func()");
}
非静态成员方法:大致的写法为:
public void doClass() {
System.out.println("姓名 "+ name +" 年龄 " + age +" 正在上课学习");
}
上述的区别主要在于:有无static !!
输出静态成员方法跟输出静态成员变量一样:Main 函数里面的写法为:
public static void main(String[] args) {
Student.func();
}
然后就可以成功的输出最后的结果:
因此,通过上述的代码可以看出:静态的成员方法,也不依赖于成员变量!!
在静态方法中,我们需要注意的是:
- 在静态方法内部,不能直接调用非静态的成员方法,所有的非静态方法,一定依赖于对象的引用才能调用!
- 在静态方法内部不能直接使用非静态的成员数据 原因:非静态的数据成员是属于对象的,当我们调用的时候,没有实列化任何对象!!
- 只要是非静态的数据成员,都需要通过对象的引用才能调用
- 静态方法里面是不能使用this的
- 普通成员方法内部是可以使用静态的成员方法的
在我们一般进行Java项目的时候,一般类中的数据成员都设置为private ,而成员方法设置为public
class Student {
private static int size = 10;
//构建getter and setter 方法!!来对数据进行更改!
public static int getSize() {
return size;
}
public static void setSize(int size) {
Student.size = size;
}
}
public class Main {
public static void main(String[] args) {
Student.setSize(12);
System.out.println(Student.getSize());
}
}
获取静态的成员变量或者是设置静态的成员变量,此时的方法最好是静态的,否则,你要是非静态的,你还得实列化对象,这就好比,脱裤子放屁,多费手续!!
下面讲解一下:对于静态变量的初始化!!
1.直接赋值
public static String classRoom ="山东大学数计学院!";
2.默认初始化
public static int arr ; // arr---->0
public static String classRoom ; //classRoom ------>null
3.可以通过getter 和setter方法来进行初始化
//构建getter and setter 方法!!来对数据进行更改!
public static int getSize() {
return size;
}
public static void setSize(int size) {
Student.size = size;
}
4.在构造对象的时候,可以在构造方法中进行赋值(不建议这样写)
5.通过代码块进行赋值!!(对于代码块是什么??请详见笔者下篇博客!)