static关键字,static修饰类成员,static修饰方法

    科技2025-02-12  13

    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("构造方法执行") } }

    因为静态内容总是先于非静态内容执行,所以输出会是如下形式

    静态代码块执行 构造方法执行
    Processed: 0.010, SQL: 8