Java中static的用法

Java中static的用法,第1张

Java中static的用法

文章目录
      • Java中static的用法
      • static修饰成员变量
      • static修饰成员方法
      • static成员变量初始化
      • static静态代码块
      • static静态代码块和static方法的使用区别

static修饰成员变量

​ static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。

【静态成员变量特性】

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问

    class Student{
        //普通成员变量
        public int a;
        //静态成员变量(类变量)
        public static int b = 1;
    }
    public class Test {
        public static void main(String[] args) {
            //调用类的普通成员变量 (属性) 创建对象(实例) 通过对象去调用-->实例变量
            Student student1 = new Student();
            System.out.println(student1.a);
            
            //调用静态成员变量(类变量)方法1: 通过类名访问(推荐使用)
            System.out.println(Student.b);
            //调用静态成员变量(类变量)方法2: 通过对象的引用访问
            Student student = new Student();
            System.out.println(student.b);
        }
    }
    
  3. 类变量存储在方法区当中

  4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

static修饰成员方法

【静态方法特性】

  1. 不属于某个具体的对象,是类方法

  2. 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者

    class Student{
        //这是一个静态方法,也叫类方法
        public static void staticFunc(){
            System.out.println();
        }
    }
    public class Test {
        public static void main(String[] args) {
            //方法1: 类名.静态方法名(...)方式调用(推荐)
            Student.staticFunc();
            //方法2: 通过对象调用(不推荐)
            Student stu = new Student();
            stu.staticFunc();
        }
    
    } 
    
    
  3. 不能直接在静态方法中访问任何非静态成员变量

    解释: 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

//解决办法 方法1: 创建对象引用
public static void staticFunc1(){
    Student student = new Student();
    student.a = 1;
}
//方法2: 传入对象引用参数
public static void staticFunc(Student student){
    student.a = 1;
}
  1. 静态方法中不能直接调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

  1. 静态方法无法重写,不能用来实现多态
static成员变量初始化

注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性

  1. 就地初始化
    就地初始化指的是:在定义时直接给出初始值
  2. 静态代码块初始化
static静态代码块

​ 一般用来初始化静态成员.

class Student1{
    public int a;
    public static int b = 1;
    
    {
        //实例代码块:定义在类的内部,方法的外部.可以有多个
        System.out.println("实例代码块!");
    }
    static{
        //静态代码块:定义在类的内部,方法的外部且{}前加上static.可以有多个
        System.out.println("静态代码块!");
    }
   
    public static void staticFunc(){
        System.out.println();
    }
}

注意事项

1.静态代码块不管生成多少个对象,其只会执行一次
2.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并
4.实例代码块只有在创建对象时才会执行

class Student1{
    public int a;
    public static int b = 1;
    {
        //实例代码块:定义在类的内部,方法的外部.可以有多个
        a = 1;
        System.out.println("实例代码块!");
    }
    static{
        //静态代码块:定义在类的内部,方法的外部且{}前加上static.可以有多个
        b = 2;
        System.out.println("静态例代码块只执行了一次!");
    }

    public Student1(int a) {
        this.a = a;
        System.out.println("有一个参数的构造方法执行了!");
    }
}

public class Test {
    public static void main(String[] args) {
        Student1 student1 = new Student1(1);
        System.out.println("===============");
        Student1 student2 = new Student1(2);
    }
}

运行结果:

静态例代码块只执行了一次!
实例代码块!
有一个参数的构造方法执行了!
===============
实例代码块!
有一个参数的构造方法执行了!
static静态代码块和static方法的使用区别

​ 如果有些代码必须在项目启动的时候就执行,就需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化但是不执行,在不创建对象的情况下,可以供其他程序调用,而在调用的时候才执行,这需要使用静态方法,这种代码是被动执行的。 静态方法在类加载的时候 就已经加载 可以用类名直接调用。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/920177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存