静态方法,静态代码块,静态变量是在类加载的同时被加载.
而当第一次创建一个类的实例或者调用一个类中的属性或者执行一个类中的方法时会加载这个类.那么在加载类的期间会加载该类中的所有静态方法,静态属性,静态代码块.
有了以上的铺垫就可以了解静态方法和非静态方法之间的调用方式了.
一.静态方法中调用静态方法和非静态方法
1.静态方法中可以直接通过方法名静态方法.因为都属于同一个类.两个静态方法都是同时被加载的
2.静态方法中可以通过类名.静态方法名调用其它类中的静态方法.在调用时,被调用的静态方法所在的类就被加载了.而该类中的所有静态方法,静态属性也会一起被加载
3.静态方法中是不能直接使用方法名调用本类中的非静态方法的.也不能使用类名.非静态方法名去调用其它类中的非静态方法.因为非静态方法并不是在类加载的同时加载,所以需要创建类的实例去调用
二.非静态方法中调用静态和非静态方法
1.非静态方法中可以直接使用方法名调用本类中的静态方法,因为当执行到该非静态方法时显然该方法所属的类已经被加载了.那么此时该类中的所有静态方法或者变量也已经被加载了.因此可以直接调用.
也可以使用类名.静态方法名调用其它类中的非静态方法.在调用的同时同样会加载该被调用的静态方法所在类中的所有静态方法和静态属性
2.非静态方法中可以直接用方法名调用本类中的非静态方法,但是在调用其它类中的非静态方法时需要new一个实例对象去调用 --- 此处有点抽象在后面详细说明
现在说说在同一个类中为什么静态方法中不能直接调用本类的非静态方法,但是在非静态方法中却可以直接调用非静态方法,下面的论述都是基于在同一个类中的:
1.为什么静态方法中不能调用非静态方法呢,正如开篇所说,所有的静态资源(静态方法,静态变量等)在类被加载的同时就已经被加载到内存中了.而此时类中的非静态方法还没有被加载.所以无法直接在静态方法中调用非静态方法.
2.那么非静态方法中为什么又能直接使用方法名调用本类中的非静态方法而不用创建实例呢.
我的理解是静态资源是属于类的.也就是说可以属于很多个该类的对象,因为静态资源全程只有一份.那么随便谁用到这个静态资源用到都是同一份.所以无法在静态方法中直接调用非静态方法.因为你无法预知你调用的会是哪一个对象的方法.这是个一对多的关系
但是非静态资源不是.非静态资源是属于一个对象的.每一个对象都有自己的一份非静态资源.同时第一个非静态方法需要执行的前提就是需要有一个类的实例去调用.所以在该非静态方法中调用下一个非静态方法显然就是使用了同一个对象.这是一个一对一的关系
这也是我经过查询其他朋友的说法后而推想的.具体是否如此.希望有了解的大牛可以指点一二