黑马程序员技术交流社区

标题: 关于静态方法只能调用静态变量的问题! [打印本页]

作者: jingyarufeng    时间: 2016-8-1 22:43
标题: 关于静态方法只能调用静态变量的问题!
如果我在测试类的方法中定义一个静态方法,然后在方法里创建一个对象.然后调用实体类的非静态变量呢?
[Java] 纯文本查看 复制代码
class Demo8_Demoo {
        public static void main(String[] args) {
                print2();
        }
                public static void print2() {        //静态成员方法
                        Demoo ddd = new Demoo();
                        //ddd.num1 = 200;
                        System.out.println(ddd.num1);//输出非静态成员方法        //为什么this不能用,但是ddd可以用?                       
                       
                }       
}

class Demoo {
        int num1 = 10;                                        //非静态成员变量               
}

纠结到最后我自己都晕了,还请大神们给分析分析

作者: jingyarufeng    时间: 2016-8-1 22:46
是不是我概念没搞明白...还是怎么的..求大神
作者: Kaweh.    时间: 2016-8-1 22:55
你需要记住,this代表一个对象,如果在demo8里边用this,代表的就是demo8的对象,但是你需要访问的是deno的成员变量
作者: mingyeing    时间: 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变量和成员方法。
其实这一点很好理解,当我们创建一个对象的时候非静态成员存储在堆内存中, 静态成员存储在方法区中,也叫静态区中。非静态成员随着对象的创建而创建,静态成员随着类的加载而加载。如果你在一个静态方法中,调用了一个非静态的成员变量。那么,我们知道静态方法可以不创建对象,直接同过类名调用,那么,当我们在另一个类中通过类名直接调用这个静态方法的时候,他的非静态的成员变量就并没有创建出来,这样就不行了。
而关于你这道题,this为什么不能用,因为this代表的当前对象的引用,代表的是Demo8_Demoo 这个类创建的对象的引用,与Demo类无关!
作者: jingyarufeng    时间: 2016-8-1 23:00
mingyeing 发表于 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变 ...

但是,我这样写不也成了静态方法调用了静态变量么...
作者: jingyarufeng    时间: 2016-8-1 23:07
本帖最后由 jingyarufeng 于 2016-8-1 23:11 编辑
mingyeing 发表于 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变 ...

其实说的是在方法中,不能直接调用本类的成员变量和成员方法。
是不是因为我这个是在不同的类中,所以可以调用了 .今天老师讲到这,我就是在想,如果我们在调用之前,提前给他创建一个对象,这样,非静态成员变量也会被创建了出来,这样,我们是否就可以在静态方法中调用这个静态变量了呢!



作者: yuxing    时间: 2016-8-1 23:10
静态中当然不能用this,this代表对象的引用,而静态的是先于对象的~~
作者: jingyarufeng    时间: 2016-8-1 23:13
yuxing 发表于 2016-8-1 23:10
静态中当然不能用this,this代表对象的引用,而静态的是先于对象的~~

那我要是先创建一个对象,再调用静态方法呢.
作者: yuxing    时间: 2016-8-1 23:16
jingyarufeng 发表于 2016-8-1 23:13
那我要是先创建一个对象,再调用静态方法呢.

有了对象直接拿对象调呗~~~这个时候this又代表不了你创建的对象~
作者: mingyeing    时间: 2016-8-1 23:27
jingyarufeng 发表于 2016-8-1 23:00
但是,我这样写不也成了静态方法调用了静态变量么...

静态方法不能访问非静态成员,是值在方法中调用本类的非静态成员是不可以的。另外,我那个关于内存的解释不知道你看了没有。看懂了,应该就好理解了一些。
作者: jingyarufeng    时间: 2016-8-1 23:52
mingyeing 发表于 2016-8-1 23:27
静态方法不能访问非静态成员,是值在方法中调用本类的非静态成员是不可以的。另外,我那个关于内存的解释 ...

内存中的解释我懂,我们导师也给我们画图说明了,意思就是类先加载,而对象不知道有没有创建,所以,静态方法不可以调用非静态变量.我现在明白了.是在本类中.本类中.谢谢大神的热心解答昂.
作者: jingyarufeng    时间: 2016-8-2 00:04
mingyeing 发表于 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变 ...

this 也明白了,应该是代表的是当前类的当前对象的引用,应该是用Demo8_Demoo 创建出来的对象,例如Demo8_Demoo ddd = new Demo8_Demoo(); 而 Demoo ddd = new Demoo();  对象ddd是 Demoo类的对象,所以不能在 Demo8_Demoo使用.不知道我是不是可以这样理解呢
作者: jingyarufeng    时间: 2016-8-2 00:27
mingyeing 发表于 2016-8-1 22:56
我们说的在静态方法中不能调用非静态的成员变量和成员方法,其实说的是在方法中,不能直接调用本类的成员变 ...

[Java] 纯文本查看 复制代码
class Demo8_Demoo {
        static int num1 = 12;
        public static void main(String[] args) {
                //static int num1 = 12;
                print2();
        }
        //static int num1 = 12;
                public static void print2() {
                       
                        //静态成员方法
                        //Demoo ddd = new Demoo();
                        //ddd.num1 = 200;
                        Demo8_Demoo dddd = new Demo8_Demoo();
                        System.out.println(dddd.num1);        //这里还是不能用this,为啥?                       
                       
                }       
}

作者: jingyarufeng    时间: 2016-8-2 02:06
jingyarufeng 发表于 2016-8-2 00:27
[mw_shl_code=java,true]class Demo8_Demoo {
        static int num1 = 12;
        public static void main(String[ ...

是不是因为 一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。静态方法在优先于对象存在,所以静态方法中不可以出现this.所以上面的代码虽然this代表了当前类当前对象的引用,但是为了避免上述错误,还是不可以用呢?
作者: zhangjiesss    时间: 2016-8-2 07:40
你就记住静态方法中不可以出现this,super关键字
作者: jingyarufeng    时间: 2016-8-4 22:05
总结一下,this代表当前对象的引用.
静态方法中不能出现this关键字...谢谢各位大神的不吝赐教!
作者: 0425    时间: 2016-8-5 00:18
静态方法中不可以出现this,super关键字




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