静态static

静态static

static概述

如果使用了static关键字,这样的内容就不是属于对象自己的,而是属于类的,只要是本类的对象都共享同一份数据.

这份数据保存在类中

image-20230420111108741

static关键字用于成员变量

如果一个成员变量使用了static关键字,那么这个对象就不属于自己而是属于类的

image-20230421161744794

static可以用来计数

代码示例

Student类

public class Student {
    private String name;
    private int age;
    static String room;
    //可以用来自动生成学号
    private static int count;//计数器,可以使用这个静态变量来计算生成对象的个数
    private int id;//学号

    public Student() {
        count++;
        id = count;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        count++;
        id = count;

    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

主函数

public class Demo09 {
    public static void main(String[] args) {
        Student two = new Student("易烊千玺", 23);
        two.room = "407实验室";//room为所有对象共享的
        System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge() + ",教室:" + two.room + ",学号:" + two.getId());
        Student one = new Student("蔡徐坤", 19);
        System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + ",教室:" + one.room + ",学号:" + one.getId());


    }
}



static关键字用于成员方法

静态方法概述

image-20230421164423560

原本的成员方法需要先创建对象才能使用,对于静态方法直接通过类名称使用方法

推荐使用--类名称.静态方法

不推荐--对象名称.静态方法

image-20230421164717350

image-20230421164940269

代码示例

public class Myclass {
    public static void methodStatic()
    {
        System.out.println("我是静态方法");
    }
    public void method()
    {
        System.out.println("我是成员方法");

    }
}

主函数

public class Demo10 {
    public static void main(String[] args) {
        Myclass one=new Myclass();
        one.method();
        one.methodStatic();//不推荐写法
        Myclass.methodStatic();//推荐写法
        hello();
    }
    public static void hello()
    {
        System.out.println("你好");
    }
}

注意事项

静态不能访问非静态

因为在内存中先有静态内容,然后有非静态内容

静态方法里面不能用this

image-20230421165027940

代码截图

image-20230421165044125

代码示例

public class Myclass {
    private String name;
    private static int age;

    public static void methodStatic() {
        System.out.println("我是静态方法");
//        System.out.println(name);
        //静态方法不能访问非静态变量
        System.out.println(age);
        //静态方法可以访问静态变量
//        System.out.println(this);
//        静态方法不能使用this
    }

    public void method() {
        System.out.println(name);
        //成员方法可以访问非静态变量
        System.out.println(age);
        //成员可以访问静态变量
        System.out.println("我是成员方法");
        System.out.println(this);//成员方法可以使用this

    }
}

静态static的内存图

方法区里面有一个静态区,方法区里面的静态变量会指向这个静态区

根据类名称访问成员变量的时候,全程和对象没关系,只和类有关系.

image-20230425185353205

代码示例

Student类

public class Student {
    public static String room;
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static String getRoom() {
        return room;
    }

    public static void setRoom(String room) {
        Student.room = room;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


Main方法

public class Main {
    public static void main(String[] args) {
        Student.room = "407实验室";
        Student one = new Student("蔡徐坤", 20);
        Student two = new Student("易烊千玺", 19);

        System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + ",教室:" + Student.room);
        System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge() + ",教室:" + Student.room);


    }
}

静态代码块

public class 类名称{

static{

//静态代码块的内容

}

}

1.第一次使用本类的时候静态代码块执行

2.静态内容总是优先于非静态,使用静态代码块比构造方法先执行

image-20230425190728192

代码示例

Student类

public class Student {

static
{
    System.out.println("我是静态代码块");

}
    public Student() {
        System.out.println("构造方法执行");
    }



}

Main方法

public class Main {
    public static void main(String[] args) {
        Student one = new Student();//静态代码块总是优先于构造代码块
        //静态代码块只执行一次
        Student two = new Student();


    }
}
posted @ 2023-04-21 17:03  harper886  阅读(30)  评论(0编辑  收藏  举报