详解static关键字在Java中的各种适应场景,这个很重要!

简介: 详解static关键字在Java中的各种适应场景,这个很重要!

写在开头

静态(static)关键字在Java的众多关键字中举足轻重!也是很多大厂面试官特别喜欢问的面试高频知识点,今天我们就一起学习,梳理,重温一下这个关键吧,之所以用重温修饰是因为在过往的文章中早已提到了static,无论是变量中还是方法中甚至于类中,static都是不可或缺的!

我们知道要想调用类中的属性和方法,通常情况下,需要创建一个对象,初始化完成之后,通过对象的引用去访问,而static修饰的方法和变量为类所有,因此,可以直接跳过对象的初始化,主要类被加载了就可以直接通过类名.属性名/方法名进行直接调用!

一、静态变量

【代码示例】

public class Person {
   
    //成员变量
    //在类内部但在方法体外声明的变量称为成员变量,或者实例变量,或者字段。
    //之所以称为实例变量,是因为该变量只能通过类的实例(对象)来访问。
    int data1 = 3;
    //静态变量
    //通过 static 关键字声明的变量被称为静态变量(类变量),
    //它可以直接被类访问
    static int data2 = 4;
    public int sum(){
   
        //局部变量
        //在方法体内声明的变量被称为局部变量,该变量只能在该方法内使用,
        //类中的其他方法并不知道该变量。
        int a = 1;
        int b = 2;
        return a+b;
    }
    public static void main(String[] args) {
   
        Person person = new Person();
        System.out.println(person.data1 == person.sum());
        System.out.println(Person.data2 == person.sum());
    }
}

二、静态方法

【代码示例】

public class Test {
   
    public static void main(String[] args) {
   
        System.out.println(sub(2,1));
    }
    //若方法的声明中加上了static关键字,静态方法是属于类的,
    //而不是属于类创建的对象或实例的,故在调用时无需通过对象实例。
    public static int sub(int a,int b){
   
        return a - b;
    }
}

三、静态代码块

虽然静态代码块和main()方法都被static修饰,但静态代码块通常用来初始化一些静态变量,它会优先于 main() 方法执行。来段代码感受一下:
【代码示例】

public class Test {
   

    public static void main(String[] args) {
   
        System.out.println("main 方法");
    }

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

输出:

静态代码块
main 方法

四、静态内部类

静态嵌套类,并没有对实例的共享关系,仅仅是代码块在外部类内部
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它
静态嵌套类仅能访问外部类的静态成员和方法
在静态方法中定义的内部类也是静态嵌套类,这时候不能在类前面加static关键字。

【代码示例】

class OuterFish {
   
    static class InnerFish {
   
    }
}

class TestStaticFish {
    
    public static void main(String[] args) {
   
        //创建静态内部类对象
        OuterFish.InnerFish iFish = new OuterFish.InnerFish();
    }
}

static在Java中的主要用法就这么多了,那么好,接下来我们就根据它的用法来进行最后的总结

总结

1、static 可以修饰变量、方法、代码块和内部类 static 变量是这个类所有,由该类创建的所有对象共享同一个 static
2、可以通过创建的对象名.属性名 和 类名.属性名两种方式访问 static 变量在内存中只有一份 static
3、修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次 static 修饰的变量可以重新赋值 static
4、方法可以通过对象名.方法名和类名.方法名两种方式来访问 static 方法中不能用 this 和 super 关键字 static
5、方法必须被实现,而不能是抽象的abstract static 方法不能被重写 static
6、代码块在类被第一次加载时执行静态代码块,且只被执行一次,主要作用是实现 static 属性的初始化 static
7、内部类属于整个外部类,而不属于外部类的每个对象,只可以访问外部类的静态变量和方法

目录
相关文章
|
13天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
14天前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
2106 3
|
14天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
44 2
|
2月前
|
安全 Java 数据安全/隐私保护
有哪些场景不适合使用Java反射机制
Java反射机制虽强大,但并非万能。在性能要求极高、安全性严格控制、类结构复杂多变或对象创建频繁的场景下,使用反射可能带来性能下降、安全风险增加等问题,应谨慎选择。
52 9
|
2月前
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
56 9
|
2月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
56 8
|
2月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
50 4
|
2月前
|
存储 Java
Java 中的静态(static)
【10月更文挑战第15天】静态是 Java 语言中一个非常重要的特性,它为我们提供了一种方便、高效的方式来管理和共享资源。然而,在使用过程中,我们需要谨慎考虑其优缺点,以确保代码的质量和可维护性。
|
11天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
13天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。