static详解

static详解

Java中的static关键字可以修饰变量、方法和代码块,其主要作用是将属性或方法与实例化对象无关,也就是说可以在没有实例化对象的情况下直接访问。

对于静态变量和静态方法,确实是在类加载的时候就会被初始化并且分配到内存中,而不需要等到对象实例化以后才能访问。也就是说,静态变量和静态方法所占用的内存空间,在类被加载时就已经确定并分配了,不需要等到实例化对象时再分配内存。

但对于静态代码块而言,则不能简单地认为是最先分配内存的。静态代码块会在类加载的时候被执行,但是其内部定义的变量在什么时候初始化则不确定,只有在静态代码块被执行时才会进行初始化。

因此,我们不能简单地将static关键字与内存中的分配顺序联系起来,static关键字的作用主要是用于定义静态变量和静态方法,从而提供一种在没有实例化对象的情况下访问变量和方法的机制。而静态代码块的作用则是在类被加载时执行一些初始化代码。

通过static定义的属性或方法都储存在全局区

public class Student {
    //静态变量对于这个类而言在内存中只有一个,与类中所有实例化对象共享
    private static int age;//静态变量   多线程!
    private double score;//普通变量
    
    public void run()
    {
        System.out.println("run");
    }
    public static void go()
    {
        System.out.println("static go");
    }

    public static void main(String[] args) {
        Student s1= new Student();
        
        System.out.println(Student.age);//调用静态变量可以直接用类名
        System.out.println(s1.age);
        System.out.println(s1.score);//调用非静态只能通过实例化对象
        
        Student.go();//静态方法也可以直接通过类调用
        s1.run();//非静态方法只能通过对象调用
        
    }
}

Java中的static关键字主要用于修饰类变量和类方法,它表示静态的、类级别的,而不是实例级别的。

在Java中,内存分为不同的区域,其中包括堆、栈、方法区等。对于静态变量和类方法,它们存储在特殊的内存区域中——方法区中。方法区是线程共享的,它存储了所有的类信息、常量、静态变量和代码等,属于共享的内存资源。当Java程序运行时,类信息和静态变量在类被加载时就会分配内存,并在整个程序运行期间都存在,直到程序结束才会被回收。

通过使用static关键字,可以让类变量和类方法实现类级别的共享,这样无需创建对象就能够访问它们。同时,静态方法也不依赖于实例化对象而存在,因此它们通常用于访问静态数据或执行不需要实例化的操作,如实用工具类中的一些静态方法。在使用类变量或类方法时,也可以使用类名直接访问(如:ClassName.variableName)。

需要注意的是,静态变量和方法属于类本身,因此它们可以被同一类的所有对象共享。但需要注意的是,静态变量属于类本身,如果在程序中创建多个实例,则它们都共享同一个静态变量的值。这也意味着当一个实例更改静态变量的值时,它会被影响到同类的所有其他实例。因此,在使用static关键字时,应该注意静态变量和静态方法的共享性。

总之,使用static关键字可以实现静态的、类级别的变量和方法,在Java中存储在方法区中,属于共享的内存资源。它们可以被同一类的所有对象共享可以通过类名直接访问。但需要注意静态变量和静态方法的共享性,以避免出现错误。

静态代码块与匿名代码块

public class Person {
    //2.一般用来赋初值~
    {
        System.out.println("匿名代码块");
    }
    //1.静态代码块在整个函数中只执行一次
    static {
        System.out.println("静态代码块");
    }
    //3.
    public Person()
    {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person1=new Person();

        System.out.println("==================");
        Person person2=new Person();
    }
}

输出:

静态代码块
匿名代码块
构造方法
==================
匿名代码块
构造方法

静态导入包

import static java.lang.Math.random;

public class Test {
    public static void main(String[] args) {
        System.out.println(random());
    }
}

final定义的类无法被继承

public final class Person {
}

public class Student extends Person {
}

此时会报错

posted @ 2023-07-01 08:58  晚枫zz  阅读(32)  评论(0)    收藏  举报