静态方法:与静态成员变量一样,属于类本身,在类装载的时候被装载到内存中,不会进行自动销毁,会一直存在内存中,直到JVM(Java Virtual Machine(Java虚拟机)的缩写)关闭
非静态方法:又称实例化方法,属于实例对象,实例化之后才能分配内存,必须通过类的实例来引用,当实例对象被JVM回收之后,也跟着消失
区别
(1)生命周期:静态方法的生命周期是从进程创建就开始的,一直到进程结束,所以说静态方法是全局的,贯穿整个进程
非静态方法的生命周期是从实例化对象才开始,一直到实例化对象被注销回收之后结束
所以,非静态方法的生命周期短语静态方法的生命周期,这也是实例方法中不能调用静态方法的原因
(2)调用方法:在外部调用静态方法时,可以使用“类名.方法名”的方式,也可以使用“对象.方法名的方式”,也就是说调用静态方法不需
要创建对象
实例化方法只能使用“对象.方法名”的方式
(3)访问权限:静态方法在访问本类成员时,只允许访问静态成员(既静态变量和静态方法),而不允许访问实例成员变量和实例化方
法,而实例化方法则无限制
实例成员变量是属于某个对象的,在执行静态方法时,并不一定存在该对象,同理,如果允许静态成员访问实例成员方
法,就间接可以访问实例成员变量,所以不能访问实例成员方法,基于这样的道理,静态方法中也不能使用关键字this
(4)执行顺序:当一个class文件被ClassLoader load(类加载器加载)进入JVM之后,方法指令保存在Stack中,此时Heap区并没有数
据。然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问Heap数据
区的;如果是实例方法(实例方法有一个隐含的传入参数,该参数是JVM给它的,这个参数就是实例对象在Stack中的内
存地址,因此实例方法才可以找到在Heap中属于自己的数据),则在调用前必须实例化该对象,在Heap中分配数据,
并将Stack中的内存指针通过JVM的隐含参数传给实例方法。若不实例化直接调用,由于隐含参数没有值,会报错。
其中: Stack(堆栈)存取速度仅次于寄存器,存储效率比heap高,可共享存储数据,但是其中数据的大小和生存期必须在运行前确定。
Heap(堆)是运行时可动态分配的数据区,从速度看比Stack慢,Heap里面的数据不共享,大小和生存期都可以在运行时再确定
package com.example.demo.studytwo;
public class jingtai {
static String qq = "静态变量";
String ww = "非静态变量";
public static void test1(){
System.out.println("静态方法");
}
public void test2(){
System.out.println("非静态方法");
}
}
class Run{
public static void main(String[] args) {
jingtai.test1();//无需实例化就可以调用到方法
System.out.println(jingtai.qq);
jingtai j = new jingtai();//需要实例化之后才能调用到方法
j.test2();
System.out.println(j.ww);
}
}
//静态的方法一般的可以直接调用
class A{
public static String ss(){
return "静态A";
}
class a{
public String dd(){
return A.ss();
}
}
}
//非静态方法需要new出一个对象:
class B{
public String ff(){
return "非静态B";
}
class b{
public String gg(){
B b = new B<