哦,这个问题有点大啊,首先这不是一个简答的问题,要回答这个问题需要有对JVM有深刻的理解,对JAVA内存机制有相当高的认识。要弄清楚为什么静态不能访问非静态这个问题,你要知道一下一个点
1)什么是静态(static)
static是一个成员修饰符,他只能修饰类中的成员属性和成员函数,在你这个问题中“静态”是特指成员函数;
被static修饰的成员函数和普通函数的区别简单来说就是这个函数经过复杂的java内存调用和分配机制将此成员函数进行了特殊处理,蒙了吧,其实就是这个函数可以被类直接使用,因为这个成员函数成为为了这个类的对象所共用的了,在内存中的体现就是当类被加载到此方法立即被加载了,根本不需要用什么new 来实例化一个对象。
2)什么是非静态not static
所谓非静态就是指那些没有被static修饰的成员啦,这样的成员是必须要new实例化一个实际对象,并且通过这个对象才能访问的成员,在没有new实例化之前他们是根本不存在的
所以显而易见static静态成员函数在使用时非静态是不存在于内存的,除非将此成员实例化,不然是没办法访问的
例如:
- class StaticAndUnStatic{
- int a,b;//非静态成员属性
- static intgetSum(int a ,int b){//静态成员方法
- return a+b;
- }
- }
- class Main{
- void main(string[] arg){
复制代码
|