A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ZhaoF 中级黑马   /  2015-1-16 20:01  /  1483 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么静态不能访问非静态?

8 个回复

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



回复 使用道具 举报
后面的怎么被截断了郁闷
//静态成员函数调用非静态成员,未实例化时会报错的
int c=StaticAndUnStatic.getSum(StaticAndUnStatic.a,StaticAndUnStatic.b)
回复 使用道具 举报
帮顶一下
回复 使用道具 举报
实现过程  好好学学
回复 使用道具 举报
因为静态加载后,非静态没有对象时不存在,所以无法访问
回复 使用道具 举报
这个。。。。
回复 使用道具 举报
成员加载的先后问题,静态变量随着类名的加载而加载,而非静态随着对象或者方法的加载而加载。当静态调用非静态的成员时,非静态的成员还没加载进内存呢,所以编译会报错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马