java程序运行内存分配,static,final

一:java程序运行内存分配

(个人理解 非常个人)

1.类加载:

开始运行程序时,先找到启动类的main()方法,先加载这个启动类,如果这个启动类有父类就先加载它的父类,把所有的父类加载完,再开始加载这个启动类。(有种递归的感觉)。
①先将这个类的[类的信息(名称、修饰符等元数据信息),类中的Field信息,类中的方法信息等]放到方法区
②给类static变量被分配内存并设置默认值,被分配在中。final常量也分配到
③将类static变量的初始值覆盖默认值,执行static代码块。
④main()入口之前的类按照以上步骤加载完类之后开始加载这个启动类
!!没有执行!只是加载"代码描述"和给"代码中的static变量赋值"
!!类=成员变量+成员方法(静态的成员变量分配内存+执行静态代码块+其余的变量/方法只是"加载描述信息(修饰符等等)"到方法区)

2.执行main()方法

从启动类的main()方法开始执行:
①当执行的到创建局部变量的语句:

  • main的局部变量:分配内存到
  • 当变量是a=new()出来的[数组对象/String/自定义等对象]时即创建对象时,为a这个引用变量在堆内分配内存(存储的是对象在堆中的起始地址),再给这个对象成员变量分配到
    若这个对象没有加载,先按照1加载到内存方法区(类信息/方法信息/static执行赋值)

③当执行到调用方法语句:

  • 遇到局部变量分配空间到
    不管是什么方法dinal还是static,都是对象的方法,它们的描述信息都被加载到了方法区对于final/static修饰符没什么不同,只是把修饰符信息加载了。

代码说明


public class Son1 extends Father {
    //静态成员变量/常量
    public static int a =2;
    public static double b;
    public final int x=1;
    public static String ss;
    public final String sss="zzh";
    public static final String ssss="hhh";
    //成员部变量
    public String s;
    public int y=4;

    //成员方法
    public void f(){
        //局部变量
        int q=2;
        System.out.println(q);
    }
    //静态成员方法
    public static void h(){
        //局部变量
        int w=4;
        System.out.println(w);
    }

    public static void main(String args[]){
        int d=6;//局部变量
        Son1 sa=new Son1();//局部变量
        sa.f();
        sa.h();
    }
}

1.先将Fater类加载到方法区
2.再加载启动类:son1类信息(方法信息/修饰符...)到方法区
3.将启动类中的类成员变量分配到内存堆并赋默认值:a=0,b=0.0,x=0,s的引用,ss引用,sss引用的值都是对应的值是null)【检查这个符号引用代表的类是否被加载如果没有则进行类加载】。再给赋初值:a=2,x=1,ss=null,ss=“zzh”,sss=“hhh”。????

4.开始执行main()方法
5.局部变量d分配内存到栈
6.先检查是否加载了类son1
7.sa引用分配到堆,其对象分配到堆(对象所需内存的大小在类加载完成后便可完全确定)

8.调用f(),局部变量q分配到栈,执行完方法出栈。
9.调用h(),局部变量w分配到栈,执行完方法出栈。


二.static和final的区别

1.修饰

  • static:修饰类/成员变量/成员函数
  • final:修饰类/成员变量/成员函数/局部变量

2.赋值

static

static关键字作用:在没有创建对象的情况下来调用方法/变量
static修饰的方法或变量不需要依赖对象进行访问,在类信息加载是分配内存

  • static修饰类:只能是内部类
  • static成员变量:可以不被赋初值/多次赋值,可以被继承修改
  • static成员函数:为类所有,[类.]调用,可以被继承不可被重写,如果“重写”只是添加了子类的静态方法,父类的静态方法被隐藏而不是重写。

final

final不是为类所有,它与一般类/变量/方法的区别就是能不能被继承/赋值次数,就是个常量/能不能被重写

  • final类:不可被继承没有子类
  • final成员变量:被赋值一次
  • final成员函数:不可被重写(private方法隐式为final)
    ·父类中的final方法是public修饰的,子类可以继承到此方法,子类会重写此方法,将会导致编译出错
    ·使用final方法就是以防任何继承类修改它的含义
  • final局部变量:只能被赋值一次
    ·当final修饰一个基本数据类型时,该基本数据类型的值在初始化之后便不能再改变。 当final修饰一个引用类型时,在初始化之后不能再让其指向其他对象,但是对象的内容是可以改变的。
    ·final修饰局部变量:尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。

static final

  • 修饰类:内部不可继承类
  • 成员变量:不能改变值的为类所属的变量
  • 成员函数:为类所属的可继承不可重写的方法
  • 没有局部变量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值