Java中的static关键字

1、static的概述

当在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余。可是不创建对象,方法又调用不了,这时就会想,那么我们能不能不创建对象,就可以调用方法呢?
可以的,我们可以通过static关键字来实现。static它是静态修饰符,一般用来修饰类中的成员。

static存在的主要意义:

static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法

static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行

2、静态的特点

1、Java静态代码块中的代码会在类加载JVM时运行,且只被执行一次
2、静态块常用来执行类属性的初始化
3、静态块优先于各种代码块以及构造函数,如果一个类中有多个静态代码块,会按照书写顺序依次执行
4、静态代码块可以定义在类的任何地方中除了方法体中【这里的方法体是任何方法体】
5、静态代码块不能访问普通变量
6、被static修饰的成员变量属于类,不属于这个类的某个对象。(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量)
 7、被static修饰的成员可以并且建议通过类名直接访问


      3、静态的注意事项

一、 静态成员只能直接访问静态成员
       二、 非静态成员既可以访问非静态成员也可以访问静态成员


       4、静态的优缺点

静态优点:
对对象的共享数据提供单独空间的存储,节省空间,没有必要每一个对象都存储一份
可以直接被类名调用,不用在堆内存创建对象
静态成员可以通过类名直接访问,相对创建对象访问成员方便

静态弊端:
访问出现局限性。(静态虽好,但只能访问静态)

5、static关键小结:

(1)特点:

1、static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量。

2、static修饰的成员被所有的对象共享。

3、static优先于对象存在,因为static的成员随着类的加载就已经存在。

4、static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。

5、static修饰的数据是共享数据,对象中的存储的是特有的数据。

(2)成员变量和静态变量的区别:

1、生命周期的不同:

成员变量随着对象的创建而存在随着对象的回收而释放。

静态变量随着类的加载而存在随着类的消失而消失。

2、调用方式不同:

成员变量只能被对象调用。

静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

3、别名不同:

成员变量也称为实例变量。

静态变量称为类变量。

4、数据存储位置不同:

成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。

静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

(3)静态使用时需要注意的事项:

1、静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)

2、静态方法中不可以使用this或者super关键字。

3、主函数是静态的


6、类变量与实例变量区分

类变量

类变量其实就是静态变量
定义位置--------------定义在类中方法外
所在内存区域--------方法区
生命周期--------------随着类的加载而加载
特点--------------------无论创建多少对象,类变量仅在方法区中,并且只有一份


         实例变量

实例变量-------其实就是非静态变量
定义位置-------定义在类中方法外
所在内存区域-------堆
生命周期---------随着对象的创建而加载
特点--------------每创建一个对象,堆中的对象中就有一份实例变量

7、Static静态代码

静态代码块(也叫静态块、静态初始化块)

Java静态代码块中的代码会在类加载JVM时运行,且只被执行一次,也就是说这些代码不需要实例化类就能够被调用。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,就需要使用静态代码块,所以静态块常用来执行类属性的初始化!

基本上代码块分为三种:Static静态代码块、构造代码块、普通代码块

代码块执行顺序静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块

public class StaticTest {

    static {
        System.out.println("static代码块");
    }
    {
        System.out.println("构造代码块");
    }

    public StaticTest(){
        System.out.println("构造函数");

    }

    public  void normal(){
        System.out.println("普通代码块");

    }
}

  public static void main(String[] args){
      new StaticTest().normal();
    }

输出结果:

 

继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器

public class FatherStaticTest {

    static {
        System.out.println("父类static代码块");
    }
    {
        System.out.println("父类构造代码块");
    }

    public FatherStaticTest(){
        System.out.println("父类构造函数");

    }

    public  void normal(){
        System.out.println("父类普通代码块");

    }
}
public class StaticTest extends FatherStaticTest{

    static {
        System.out.println("static代码块");
    }
    {
        System.out.println("构造代码块");
    }

    public StaticTest(){
        System.out.println("构造函数");

    }

    public  void normal(){
        System.out.println("普通代码块");

    }
}
父类static代码块
static代码块
父类构造代码块
父类构造函数
构造代码块
构造函数
普通代码块

 

参考链接:

https://blog.csdn.net/qq_44543508/article/details/89468169

深入分析Java中的关键字static

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chen_ShengJie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值