<h3>只要一个函数被static 修饰, 他和对象就没有关系了,只和类名有关系,静态方法可以直接用类名调用。</h3>
static 只能修饰成员方法和成员变量,(不能修饰构造方法,因为构造方法时跟对象有关系的,而static只能和类有关系)。
注意:
- 在静态方法中不能使用非静态成员, 要想使用必须加static
- 静态成员只和类有关, 和对象无关
- 不能在静态方法中调用非静态方法,非静态方法可以调用静态方法(因为非静态方法执行之前,已经创建类了,所以可以执行静态方法)
- 静态方法中不能使用this, 因为this是记录对象地址的,this 依赖于对象使用
- 静态成员变量如果是顺序连接着的, 先隐式赋默认值,然后再对其赋值
对于非静态成员变量在类加载的时候,不会开辟空间和赋值,而对于静态成员变量在类加载的时候回开辟空间并赋值
静态与动态的区别
- 1.出现时间不同:
静态成员变量:他是在类加载的时候就在方法区的静态区开辟空间并赋值
非静态成员变量: 当创建这个类的对象的时候,随对象产生,并在堆中赋值 - 2.他们所在内存区域不同
静态成员变量:在方法区的静态区
非静态成员变量:在堆中 - 初始化时间不同:
静态成员变量:在类加载的时候就会初始化,类加载完成时初始化已经结束
非静态成员变量:对象创建过程中被创建
- 初始化时间不同:
- 4.生命周期不同:
静态成员变量:随着类的加载就在方法区的静态区一直存在,知道jvm虚拟机关闭,类从方法区消失,静态成员才会消失
非静态成员变量: 它随着对象的产生而存在,随着对象的消失而消失
对象方法==实例函数==非静态方法
类方法 == 静态方法
静态代码块:
static{
类加载的时候执行,顺序执行
}
构造代码块:位于类的成员变量
{
}
静态代码块和构造代码块同事存在的时候,先执行静态代码块
构造方法隐式三步:
1.per()
2.变量赋值
3.所有构造代码块
4.构造函数里代码
如果构造代码块书写在非静态成员变量上面:
- super()
- 构造代码块
- 成员变量赋值
在类加载的时候,JVM会先加载类中的所有静态成员变量,当所有静态成员变量加载完成后,开始给类中的所有静态成员变量进行默认初始化, 当类中所有静态成员变量默认初始化完成后,会接着给静态成员变量进行赋值显示操作,只有类中所有静态成员显示赋值结束后, 静态代码块才会运行
类的加载过程:
1、启动JVM,加载程序中需要使用的class文件。
2、在加载class文件的时候,所有的静态内容(静态成员变量,静态成员函数,静态代码块)都要加载到方法区的静态区中。
3、当类中的所有静态加载完成之后,开始给类中的所有静态成员变量默认初始化。
4、类中的所有静态成员变量默认初始化完成之后,开始给这些静态成员变量显示赋值。
5、所有静态成员变量显示赋值结束之后,开始运行类中的静态代码块。
6、当所有的静态代码块执行完成,代表当前这个class文件才彻底被加载结束。
对象的创建过程:
1、使用new关键字创建对象,在堆中给对象分配内存空间。
2、给对象所属类中的所有非静态成员变量分配空间并进行默认的初始化。
3、执行和new对象时传递参数一致的构造函数。
4、执行构造函数的的过程中有隐式的三步:
4.1、执行super() 语句,找父类的空参数构造函数
4.2、给非静态成员变量进行显示赋值。
4.3、运行构造代码块
4.4、构造函数中的自己写的代码执行。
5、构造函数执行完成,对象创建结束。
一个类中先执行静态成员然后执行构造,按顺序执行静态成员或者构造成员
栈:先进后出,所有方法开辟空间
堆: new 关键字开辟空间 默认赋值
方法区: 存放class文件字节码文件,静态区和非静态区,字符串常量池
网友评论