一个 static 还能难得住我?(一)

简介: static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量、方法、做静态代码块、静态导包等,下面我们就来具体聊一聊这个关键字,我们先从基础开始,从基本用法入手,然后分析其原理、优化等。

初识 static 关键字


static 修饰变量

static 关键字表示的概念是 全局的、静态的,用它修饰的变量被称为静态变量

public class TestStatic {
    static int i = 10; // 定义了一个静态变量 i 
}

静态变量也被称为类变量,静态变量是属于这个类所有的。什么意思呢?这其实就是说,static 关键字只能定义在类的 {} 中,而不能定义在任何方法中。

微信图片_20220414195447.png

就算把方法中的 static 关键字去掉也是一样的。

微信图片_20220414195451.png

static 属于类所有,由类来直接调用 static 修饰的变量,它不需要手动实例化类进行调用

public class TestStatic {
    static int i = 10;
    public static void main(String[] args) {
        System.out.println(TestStatic.i);
    }
}

这里你需要理解几个变量的概念

  • 定义在构造方法、代码块、方法的变量被称为成员变量,成员变量的副本数量和实例的数量一样。
  • 定义在方法、构造方法、代码块的变量被称为局部变量;
  • 定义在方法参数的变量被称为参数。

详情参考

都说变量有七八种,到底谁是 Java 的亲儿子

static 修饰方法

static 可以修饰方法,被 static 修饰的方法被称为静态方法,其实就是在一个方法定义中加上 static 关键字进行修饰,例如下面这样

static void sayHello(){}

《Java 编程思想》在 P86 页有一句经典的描述

static 方法就是没有 this 的方法,在 static 内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用 static 方法,这实际上是 static 方法的主要用途

其中有一句非常重要的话就是 static 方法就是没有 this 的方法,也就是说,可以在不用创建对象的前提下就能够访问 static 方法,如何做到呢?看下面一段代码

微信图片_20220414195459.png

在上面的例子中,由于 staticMethod 是静态方法,所以能够使用 类名.变量名进行调用。

因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为 static。平常我们见的最多的 static 方法就是 main方 法,至于为什么 main 方法必须是 static 的,现在应该很清楚了。因为程序在执行 main 方法的时候没有创建任何对象,因此只有通过类名来访问。

static 修饰方法的注意事项

  • 首先第一点就是最常用的,不用创建对象,直接类名.变量名 即可访问;
  • static 修饰的方法内部不能调用非静态方法;

微信图片_20220414195503.png

  • 非静态方法内部可以调用 static 静态方法。


微信图片_20220414195507.png

static 修饰代码块

static 关键字可以用来修饰代码块,代码块分为两种,一种是使用 {} 代码块;一种是 static {} 静态代码块。static 修饰的代码块被称为静态代码块。静态代码块可以置于类中的任何地方,类中可以有多个 static 块,在类初次被加载的时候,会按照 static 代码块的顺序来执行,每个 static 修饰的代码块只能执行一次。我们会面会说一下代码块的加载顺序。下面是静态代码块的例子

微信图片_20220414195510.png

static 代码块可以用来优化程序执行顺序,是因为它的特性:只会在类加载的时候执行一次。

static 用作静态内部类

内部类的使用场景比较少,但是内部类还有具有一些比较有用的。在了解静态内部类前,我们先看一下内部类的分类

  • 普通内部类
  • 局部内部类
  • 静态内部类
  • 匿名内部类

静态内部类就是用 static 修饰的内部类,静态内部类可以包含静态成员,也可以包含非静态成员,但是在非静态内部类中不可以声明静态成员。

静态内部类有许多作用,由于非静态内部类的实例创建需要有外部类对象的引用,所以非静态内部类对象的创建必须依托于外部类的实例;而静态内部类的实例创建只需依托外部类;

并且由于非静态内部类对象持有了外部类对象的引用,因此非静态内部类可以访问外部类的非静态成员;而静态内部类只能访问外部类的静态成员;

  • 内部类需要脱离外部类对象来创建实例
  • 避免内部类使用过程中出现内存溢出
public class ClassDemo {
    private int a = 10;
    private static int b = 20;
    static class StaticClass{
        public static int c = 30;
        public int d = 40;
        public static void print(){
            //下面代码会报错,静态内部类不能访问外部类实例成员
            //System.out.println(a);
            //静态内部类只可以访问外部类类成员
            System.out.println("b = "+b);
        }
        public void print01(){
            //静态内部内所处的类中的方法,调用静态内部类的实例方法,属于外部类中调用静态内部类的实例方法
            StaticClass sc = new StaticClass();
            sc.print();
        }   
    }
}

静态导包

不知道你注意到这种现象没有,比如你使用了 java.util 内的工具类时,你需要导入 java.util 包,才能使用其内部的工具类,如下

微信图片_20220414195516.png

但是还有一种导包方式是使用静态导包,静态导入就是使用 import static 用来导入某个类或者某个包中的静态方法或者静态变量。

import static java.lang.Integer.*;
public class StaticTest {
    public static void main(String[] args) {
        System.out.println(MAX_VALUE);
        System.out.println(toHexString(111));
    }
}


相关文章
|
3月前
|
存储 缓存 Java
从static说起
从static说起
14 0
|
8月前
|
安全 Java
一文教你,synchronized和Lock的区别?
最近有多位粉丝被问到synchronized和Lock,据说还是阿里一面的面试题。在分布式开发中,锁是控制线程的重要方式。Java提供了两种锁机制synchronized 和 Lock。接下来,我给大家分享一下我对synchronized和Lock的理解。
68 0
|
3月前
|
安全 Java
java多线程之Lock锁原理以及案例实现电影院卖票
java多线程之Lock锁原理以及案例实现电影院卖票
|
5月前
|
存储 编译器 C语言
面试官:说一下你对const static volitale的理解 =_=
面试官:说一下你对const static volitale的理解 =_=
|
6月前
|
设计模式 安全 Java
synchronized真的不重
synchronized 是java中常见的保证多线程访问共享资源时的安全的一个关键字。很多人在讲到synchronized 时都说synchronized 是一把重量级的锁,那么synchronized 真的很重么?
|
8月前
|
Java
深入理解static的作用以及被static修饰的变量、方法、块
static关键字有以下三种使用方法: 1.被static修饰的变量属于静态变量,类变量,可以通过类名,变量名直接引用,不需要进行new一个新类。 2.被static修饰的方法属于静态方法,类方法,可以通过类名,方法名直接引用,而不需要new出来一个对象 3.静态块,用于初始化一个类的时候进行一些操作,静态变量、静态方法和静态代码块都只执行一次,而且只在初始化的时候执行。
200 1
|
10月前
|
存储 C语言
static的作用
static的作用
128 0
是否可以从一个static方法内部发出对非static方法的调用?
这里其实问的是静态方法和非静态方法的区别: 静态方法和非静态方法的区别可以总结如下:
653 0
|
编译器
public final static搭配的好处
final 和 static 往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理
147 0
public final static搭配的好处
面试官:private 方法可以被代理吗?别答错了。。
面试官:private 方法可以被代理吗?别答错了。。
163 0

热门文章

最新文章