黑马程序员技术交流社区

标题: 为什么静态函数中不能访问非静态成员?99%说是,我觉得不是 [打印本页]

作者: 江海豪    时间: 2015-10-2 21:36
标题: 为什么静态函数中不能访问非静态成员?99%说是,我觉得不是
java编程思想第四版中文版86页作者提到的,静态方法内部不能调用非静态方法,这不是绝对的,我们可以传递一个对象的引用到静态方法里,
作者: 江海豪    时间: 2015-10-2 21:38
让我想个程序来验证下 , 老感觉书上面写的太肯定了。。。
作者: 江海豪    时间: 2015-10-2 21:44
有木有同学来一起验证下阿,,我比较菜刚学没多久知识面有点窄。。{:2_31:}
作者: fmi110    时间: 2015-10-2 21:45
江海豪 发表于 2015-10-2 21:38
让我想个程序来验证下 , 老感觉书上面写的太肯定了。。。

静态方法 先于对象存在,非静态方法是对象的成员,为避免静态方法访问不存在的对象,编译器禁止静态方法访问非静态的成员
作者: sunsteam    时间: 2015-10-2 21:49
传了别的类对象的引用 那跟这个类的静态是两回事
作者: 向阳啊    时间: 2015-10-2 21:57
都是刚学的。。在看毕老师视频。。感觉你还是概念不是太清晰。。。。
作者: spruce    时间: 2015-10-3 00:25
不是不能访问,是一般实例方法访问实例成员隐含了对象的引用,静态方法不隐含对象的引用,所以要显式传入引用
作者: lvfx    时间: 2015-10-3 00:33
很好理解啊,静态优先对象存在
作者: 江海豪    时间: 2015-10-4 21:23
本帖最后由 江海豪 于 2015-10-4 21:34 编辑
向阳啊 发表于 2015-10-2 21:57
都是刚学的。。在看毕老师视频。。感觉你还是概念不是太清晰。。。。
把this  传给静态方法   就可以了         静态方法有了this   就可以调用非静态成员了 。。 。   我这是迫不得已的办法来的,虽然不符合常规开发,但是真的能让静态成员调用非静态的。。   看黑马的视频学的.........
public class Test{   
        
        int a = 1;
        Test(int a){
                this.a = a;
        }
        public static void ask(Test x){
                x.say();
        }
        public void say(){
                System.out.println("a="+a);
        }
        public static void main(String[] args){
                        Test c = new Test(2);
                        c.ask(c);
    }
}
作者: ZhengJX    时间: 2015-10-4 21:34
黑马有你更精彩
作者: 江海豪    时间: 2015-10-7 11:26
本帖最后由 江海豪 于 2015-10-7 11:32 编辑
江海豪 发表于 2015-10-4 21:23
把this  传给静态方法   就可以了         静态方法有了this   就可以调用非静态成员了 。。 。   我这是迫 ...

非静态调用静态 是 直接引用
静态调用非静态 不能 直接引用 是间接引用
你说的使用对象调用非静态成员方法,你能在main方法上面直接使用对象调用吗?我把 c 传到ask中  是把引用传入static修饰的ask()方法中, 让ask()里面的x有内存地址 然后去访问say()   这叫间接引用好吧,  对象在堆中,引用在栈中
引用是对象的一个名字
如果你学过C/C++的话,可以将引用理解为java的指针
我这方法只是转牛角尖的去访问,没说好用和符合。
你那句使用对象调用非静态成员方法  是没看清代码。
  Test c = new Test(2);
           c.ask(c);
而不是
  Test c = new Test(2);
           c.ask();不是不能访问,是一般实例方法访问实例成员隐含了对象的引用,静态方法不隐含对象的引用,所以要显式传入引用

作者: 江海豪    时间: 2015-10-7 11:30
ZhengJX 发表于 2015-10-4 21:34
黑马有你更精彩

发表下问题意见啦。 。 。 别水{:2_40:}
作者: 江海豪    时间: 2015-10-7 11:32
spruce 发表于 2015-10-3 00:25
不是不能访问,是一般实例方法访问实例成员隐含了对象的引用,静态方法不隐含对象的引用,所以要显式传入引 ...

还是你能理解 ,, 我就是你这么理解的 ,  ,,   那个static函数里面 不带this  所以里面也没引用  所以我就帮助他   给了个引用给他了 。 让他拿着引用去访问非静态的。 。




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