static关键字
作用:
用static修饰的类成员,在内存中多个对象中【共享】一块内存
示意图:
static修饰类成员
实例:
学生类,此类用于建立学生对象的基本信息,快速阅读本文重点只需要关注 school 和 idCounter
school用于展示static修饰的内容共享一块内存
idCounter用于实现每创建一个学生对象使id序号自动+1
package y20.m9.constructionMethod;
/**
* @author WuZS
* @date 2020/10/7 22:08
*
* 学生类,包含 学号、姓名、年龄、学校信息
* 注:【学号】不能自主赋值,从1号开始,每新建一个学生对象自动向下顺延
*/
public class Student {
private int id;
private String name;
private int age;
/**
* 所有学生对象共享一个idCounter
*/
private static int idCounter=0;
private static String school;
/**
* // 新建学生对象没有输入信息时只顺延学号
*/
public Student(){
++idCounter;
this.id=idCounter;
System.out.println("构造方法1");
}
/**
* @param name
* @param age
* // 新建学生对象录有输入信息时录入信息并顺延学号
*/
public Student(String name,int age){
this.name=name;
this.age=age;
this.id=++idCounter;
System.out.println("构造方法2");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public int getId() {
return id;
}
public void setSchool(String school) {
Student.school = school;
}
public String getSchool() {
return school;
}
}
主控类,此类用于操作学生对象
在本类中创建了3个学生对象,其中 One 和 Two 初始化时没有带参数,所以 One、Two 与 Three 在创建时调用的是不同的构造方法
给 One.school 赋值,打印 Three.school 的值发现与 One.school 一样,体现了上文提到的【共享性】
package y20.m9.constructionMethod;
/**
* @author WuZS
* @date 2020/10/7 22:09
*/
public class Console {
public static void main(String[] args) {
Student One = new Student();
Student Two = new Student();
Student Three= new Student("LiMing",99);
One.setSchool("哈尔滨佛学院");
System.out.println(Three.getName()+ " " + Three.getSchool());
System.out.println(One.getName() + One.getId() + "\n" + Two.getName() + Two.getId() + "\n" + Three.getName() + Three.getId());
}
}
输出
构造方法1
构造方法1
构造方法2
LiMing 哈尔滨佛学院
null1
null2
LiMing3
static修饰方法(静态方法)
概念:
用static修饰的方法叫做静态方法,静态方法属于【类】,不属于对象
public class Console(){
private static void main(String[] args){
//静态方法是属于类的,所以可以用【类名.静态方法名】的形势调用
Student.staticMethod();
//静态变量同理
System.out.print(Student.school);
//当然,也可以采用调用对象方法的方式调用静态方法
//编译器会将其自动转成【类名.静态方法/变量名】的格式
Student One = new Student();
One.staticMethod();
System.out.print(One.shool);
}
}
public class Student(){
private int id;
private static int school ="南山敬老院";
public static void staticMethod(){
System.out.print(school);
}
注意:
1.静态不能直接(要通过对象间接)访问非静态
原因:内存中先有静态内容,后有非静态内容,先人不知后人
2.静态方法中不能用this
原因:this表示当前对象,
代码举例
public class Student(){
private int id;
private static int school ="南山敬老院";
public static void staticMethod(){
//ERROR,静态不能直接访问非静态
System.out.print(id);
//Right
System.out.print(school);
}
public void unstaticMethod(){
//非静态可以直接访问静态,先人不知道后人,但后人知道先人
System.out.print(school)
}
}
static静态内存结构
静态代码块
概念:
第一次用到本类时,执行唯 一 一 次;
举例:
public class Student(){
static{
System.out.print("静态代码块执行");
}
public Student(){
System.out.print("构造方法执行")
}
}
因为静态内容总是先于非静态内容执行,所以输出会是如下形式
静态代码块执行
构造方法执行