黑马程序员技术交流社区

标题: 静态不能访问非静态 [打印本页]

作者: ZhaoF    时间: 2015-1-16 20:01
标题: 静态不能访问非静态
为什么静态不能访问非静态?

作者: 诺诺    时间: 2015-1-16 20:16
进内存的时候那货还不在
作者: 枪杆不如笔杆    时间: 2015-1-16 20:32
哦,这个问题有点大啊,首先这不是一个简答的问题,要回答这个问题需要有对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){
复制代码




作者: 枪杆不如笔杆    时间: 2015-1-16 20:36
后面的怎么被截断了郁闷
//静态成员函数调用非静态成员,未实例化时会报错的
int c=StaticAndUnStatic.getSum(StaticAndUnStatic.a,StaticAndUnStatic.b)
作者: bluebloodant    时间: 2015-1-16 20:59
帮顶一下
作者: SNXJ    时间: 2015-1-16 21:57
实现过程  好好学学
作者: 小马范    时间: 2015-1-16 22:04
因为静态加载后,非静态没有对象时不存在,所以无法访问
作者: 初见。    时间: 2015-1-16 22:23
这个。。。。
作者: 探寻者    时间: 2015-1-16 22:26
成员加载的先后问题,静态变量随着类名的加载而加载,而非静态随着对象或者方法的加载而加载。当静态调用非静态的成员时,非静态的成员还没加载进内存呢,所以编译会报错。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2