下面笔者,按照之前的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修饰的成员方法!
打今儿起,开始接触静态成员修饰的方法,所以,对于成员方法的叫法,我们也该改改口了!!
静态成员方法:大致的写法为:
x
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); } }
非静态成员方法:大致的写法为:
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.通过代码块进行赋值!!(对于代码块是什么??请详见笔者下篇博客!)