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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

java编程思想第四版中文版86页作者提到的,静态方法内部不能调用非静态方法,这不是绝对的,我们可以传递一个对象的引用到静态方法里,

13 个回复

倒序浏览
让我想个程序来验证下 , 老感觉书上面写的太肯定了。。。
回复 使用道具 举报
有木有同学来一起验证下阿,,我比较菜刚学没多久知识面有点窄。。{:2_31:}
回复 使用道具 举报
江海豪 发表于 2015-10-2 21:38
让我想个程序来验证下 , 老感觉书上面写的太肯定了。。。

静态方法 先于对象存在,非静态方法是对象的成员,为避免静态方法访问不存在的对象,编译器禁止静态方法访问非静态的成员
回复 使用道具 举报
传了别的类对象的引用 那跟这个类的静态是两回事
回复 使用道具 举报
都是刚学的。。在看毕老师视频。。感觉你还是概念不是太清晰。。。。
回复 使用道具 举报
spruce 中级黑马 2015-10-3 00:25:38
7#
不是不能访问,是一般实例方法访问实例成员隐含了对象的引用,静态方法不隐含对象的引用,所以要显式传入引用
回复 使用道具 举报
lvfx 来自手机 中级黑马 2015-10-3 00:33:17
8#
很好理解啊,静态优先对象存在
回复 使用道具 举报
本帖最后由 江海豪 于 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);
    }
}

点评

我是没看出来你哪句代码让静态成员调用非静态了? 我只看到了使用对象调用非静态成员方法。我个人认为你的这个例子没说明问题。  发表于 2015-10-4 22:37
回复 使用道具 举报
黑马有你更精彩
回复 使用道具 举报
本帖最后由 江海豪 于 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();不是不能访问,是一般实例方法访问实例成员隐含了对象的引用,静态方法不隐含对象的引用,所以要显式传入引用
回复 使用道具 举报
ZhengJX 发表于 2015-10-4 21:34
黑马有你更精彩

发表下问题意见啦。 。 。 别水{:2_40:}
回复 使用道具 举报
spruce 发表于 2015-10-3 00:25
不是不能访问,是一般实例方法访问实例成员隐含了对象的引用,静态方法不隐含对象的引用,所以要显式传入引 ...

还是你能理解 ,, 我就是你这么理解的 ,  ,,   那个static函数里面 不带this  所以里面也没引用  所以我就帮助他   给了个引用给他了 。 让他拿着引用去访问非静态的。 。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马