java基础---17. 静态static关键字

Posted deer_cen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础---17. 静态static关键字相关的知识,希望对你有一定的参考价值。

1 static关键字概述

2 静态static关键字修饰成员变量

2.1

  • 定义一个学生类
public class Student {
    private String name;
    private int age;
    static String room;

    public Student() {
    }

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

    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;
    }
}
  • 使用
/*
如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象
共享同一份数据。
 */
public class Demo01StaticField {
    public static void main(String[] args) {
        Student one = new Student("郭靖",19);
        one.room = "101教室";
        System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + " " + one.room);//姓名:郭靖,年龄:19 101教室

        Student two = new Student("黄蓉",16);
        System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge()+ " " + two.room);//姓名:黄蓉,年龄:16 101教室
        //这里并没有用two.room = "101教室";但是结果依然有101教室,说明static定义的变量是共享的
    }
}

2.1

  • 定义类
public class Student {
    private int id;//学号
    private String name;//姓名
    private int age;//年龄
    static String room;//所在教室
    private static int idCounter = 0;//学号计数器,每当new了一个新对象的时候,计数器++

    public Student() {
        //idCounter++;也可以写成下面的样子。
        this.id = ++idCounter;

    }

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

    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;
    }
}
  • 使用
/*
如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象
共享同一份数据。
 */
public class Demo01StaticField {
    public static void main(String[] args) {
        Student one = new Student("郭靖",19);
        one.room = "101教室";
        System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + " " + one.room
         + ", 学号:" + one.getId());//姓名:郭靖,年龄:19 101教室, 学号:1

        Student two = new Student("黄蓉",16);
        System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge()+ " " + two.room
         + ", 学号:" + two.getId());//姓名:黄蓉,年龄:16 101教室, 学号:2
        //这里并没有用two.room = "101教室";但是结果依然有101教室,说明static定义的变量是共享的
    }
}

3 静态static关键字修饰成员方法

3.1

  • 定义类
public class MyClass {
    
    public void method(){
        System.out.println("这是一个成员方法");
    }
    //静态方法
    public static void methodStatic(){
        System.out.println("这是一个静态方法");
    }
}
  • 使用
/*
一旦使用了static修饰成员方法,那么就成为了静态方法。静态方法不属于对象而是属于类的。
如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。

无论是成员变量还是成员方法,如果有了static,都推荐使用类名称进行调用
静态变量:类名称.静态变量
静态方法:类名称.静态方法()

 */
public class Demo02StaticMethod {
    public static void main(String[] args) {
        //1. 对于成员方法
        MyClass obj = new MyClass();//首先创建对象
        //然后才可以使用没有static关键字的内容
        obj.method();//这是一个成员方法

        //2. 对于静态方法,可以通过对象名进行调用,也可以直接通过类名称来调用
        obj.methodStatic();//这是一个静态方法
        MyClass.methodStatic();//这是一个静态方法

        //3. 对于自己的方法
        //对于本类当中的静态方法,可以神略类名,以下两种调用方法完全等效
        myMethod();//自己的方法!
        Demo02StaticMethod.myMethod();//自己的方法!
    }
    public static void myMethod(){
        System.out.println("自己的方法!");
    }
}

3.2 注意事项

/*
注意事项:
1. 静态不能直接访问非静态
原因:原因:因为在内存中是先有了静态内容,后有了非静态内容。“先人不知道后人,但是后人知道先人”
2. 静态方法当中不能用this
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。
 */
public class MyClass {
    //成员变量
    int num;
    //静态变量
    static int numStatic;
    //成员方法
    public void method(){
        System.out.println("这是一个成员方法");
        //成员方法可以访问成员变量
        System.out.println(num);
        //成员方法可以访问静态变量
        System.out.println(numStatic);
    }
    //静态方法
    public static void methodStatic(){
        System.out.println("这是一个静态方法");
        //静态方法可以访问静态变量
        System.out.println(numStatic);
        //静态方法不可以访问成员变量  静态不能直接访问非静态
        System.out.println(num);//报错

        //静态方法中不能使用this关键字
        System.out.println(this);//报错
    }
}

4 静态static的内存图

依然用之前的学生类

public class Demo03StaticStudent {
    public static void main(String[] args) {
        //首先设置一下教室,这是静态的东西,应该通过类名称经行调用
        Student.room = "101教室";

        Student one = new Student("郭靖",20);
        System.out.println("one的名字是:" + one.getName());//one的名字是:郭靖
        System.out.println("one的年龄是:" + one.getAge());//one的年龄是:20
        System.out.println("one的教室是:" + Student.room);//one的教室是:101教室

        Student two = new Student("黄蓉",18);
        System.out.println("two的名字是:" + two.getName());//two的名字是:黄蓉
        System.out.println("two的年龄是:" + two.getAge());//two的年龄是:18
        System.out.println("two的教室是:" + Student.room);//two的教室是:101教室

    }
}

  • 在方法区当中有一块独立的空间叫做静态区,专门用来存储静态static数据
  • 由Student.room到Student类里去找room,再到静态区找到101教室

5 静态代码块

/*
静态代码块特点:当第一次使用到本类时,静态代码块执行唯一的一次。
静态内容总是优先于非静态,所以静态代码块比构造方法先执行.

静态代码块的典型用途:
用来一次性地对静态成员变量进行赋值
 */
public class Demo04Static {
    public static void main(String[] args) {
        Person one = new Person();
        //静态代码块执行了
        //构造方法执行了!

        Person two = new Person();
        //构造方法执行了!
    }
}

以上是关于java基础---17. 静态static关键字的主要内容,如果未能解决你的问题,请参考以下文章

Java基础--static关键字

Java基础语法 - 面向对象 - static 关键字

零基础学Java并不难!详解Java中的static关键字(上)

Java基础-static 关键字解析

零基础学Java并不难!详解Java中的static关键字(下)

JAVA基础static 关键字