static关键字

static 是 Java 中的一个关键字,它可以用来修饰成员变量、成员方法和内部类。当一个变量或方法被声明为 static 时,它就是一个静态成员

static关键字

在Java中,static修饰的代码属于,属于静态方法、静态变量,存储在方法区当中的静态常量池当中。

static修饰的代码属于类,存在方法区的静态常量池中,被所有对象共享。

如果不使用static关键字修饰,这些方法和变量在扫描代码时不会分配内存,只会以二进制的形式保存在.class文件中存放在方法区,当创建对象时才会被分配内存地址,进而被调用。

当我们使用static关键字修饰时,这些代码会在程序执行之前,就在方法区静态常量池当中创建了内存地址,这些方法和变量属于类,方便了类直接调用使用变量和方法,也就是说,我们无需创建对象即可通过类来调用这些方法和变量。

设置static

如果方法和变量属于非静态的,只有在对象中才会被分配内存空间,通过对象才能调用

方便类使用自己的方法和变量,能直接被类调用

运行实例

遇到代码题:画堆栈内存图

如该题所示,加static修饰的变量属于类变量,存储在方法区的静态常量池当中,被所有对象共享

因此无论a1还是a2都能改变内容

static特点

1.static修饰变量

被static修饰的成员变量,称为静态成员变量.静态成员变量不属于某个具体的对象,而是所有对象共有的(即属于类).只有在类第一次使用时加载时进行初始化,以后创建类时不会重新赋值

静态成员变量有如下特点:

①不属于某一个具体的对象,不存储在某一个对象分配的内存地址当中.是类的属性.

②是类的属性,所以静态成员变量一般通过类名访问.(也可以通过创建的对象来进行访问,因为对象来源于类,可以访问类的信息,但不推荐)

③生命周期伴随类的一生,只有在类被删除时才会消失.

④静态变量存储在方法区静态常量池中

非静态方法可以调用静态方法

静态方法调用非静态方法的方式

1.在非静态方法上加入static关键字

2.在main方法当中创建对象,让对象调用非静态方法

为什么在非静态方法中可以调用静态方法?

           因为被static修饰属于类变量,存储在方法区的静态常量池当中,被所有对象共享。从形成角度来说, fff()方法想要表达的时候就已经创建好了对象,那么静态方法一定是存在的,因为有对象一定是有类的。


public class A {
   private static int a;
   public static void main(String[] args){
       modify(a);
       System.out.println(a);
    }
    public static int modify(int a){
       return a++;
    }
}

代码运行结果为0

modify只进行值传递,int a为局部变量,因此对A中a无影响

 在main方法执行之前运行目的是优化程序。

 画堆栈运行图,首先在静态常量池中放一个变量a,a的默认值为0,main执行,调用modify(a)方法入栈,注意该方法上的变量是局部变量,只在该方法中起作用。java只进行值传递,此时执行a++,然后出栈,最后输出a的值,注意此时的a是静态常量池中的变量a,值为0。

代码流程

扫描-加载(编译)-运行

1.先扫描main方法所在的类:Test类,发现无父类,也无static修饰的代码,编译Test类,将main方法入栈

2.执行new Demo("----")执行前扫描Demo类,发现没有父类,编译Demo类,static代码块优先执行

3.先输出11

4.执行public static Demo demo 涉及到调用Demo构造方法,输出===+++

5.输出22

6.编译完毕,回到main方法继续执行newDemo("----");创建对象,进入运行阶段

7.调用构造器创建对象,输出===----

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值