黑马程序员技术交流社区

标题: 【小强贴】关于静态方法中不可以定义this和super关键字的... [打印本页]

作者: 心灵的一扇窗    时间: 2014-3-17 20:03
标题: 【小强贴】关于静态方法中不可以定义this和super关键字的...
本帖最后由 心灵的一扇窗 于 2014-3-18 19:52 编辑

毕老师是这样来解释这个问题的,他说这是因为静态是优先于对象存在的,我认为这个解释不是十分合理,因为就算静态是优先于对象存在,我此时定义一个对象,然后再用该对象调用该静态方法,还是会报错(静态方法中不能调用非静态变量this)这就不能说明是因为对象没有创建而造成调用失败,而是java从语法规定了静态方法不能调用非静态成员,无论你的非静态成员是否存在。
作者: 刘凯旋    时间: 2014-3-17 20:55
首先调用你的代码要写对,不然因为代码原因出错而下结论说是别的原因,其二,在静态初始化时,它找不到这个this或super,找不到就会出错,而不是说this一定是非静态的原因,楼主接着又说什么对象调用静态,我都搞不懂楼主想要问什么了,静态方法中不可以定义this和super关键字就是因为静态优先于对象存在,这个没有什么为什么,它本来就是这样的就行1+1=2一样
作者: 无道    时间: 2014-3-17 21:24
楼主可以把代码贴上来。
作者: haio    时间: 2014-3-18 10:15
静态优先于对象存在优先的可以访问后来的因为知道后来的是存在的
而后来的却不知道先前的是否存在所以无法访问
我是这样理解的交流交流!
作者: 水蓝    时间: 2014-3-18 10:18
静态优先于对象存在:
可以理解为,静态是在类字节码加载到方法区后,紧跟着加载到方法区的。
其实就是在你new对象之前,虚拟机会到方法区中找这段字节码,看是否加载了这个类定义。

this本身属于对象本身:
this是指向对象的,这种关键字,指代对象本身,是在对象内部使用的。静态方法,属于类,而不属于对象。静态方法,在不创建对象的情况下,就可以被调用。所以,我们在使用静态方法调用this指针时,你能说明this指的是哪一个对象吗?显然没法确定的。
作者: 心灵的一扇窗    时间: 2014-3-18 19:10
haio 发表于 2014-3-18 10:15
静态优先于对象存在优先的可以访问后来的因为知道后来的是存在的
而后来的却不知道先前的是否存在所以无法 ...

同学,你可不可以加几个标点符号,看起来有点吃力哦,重在参与交流,挺你!
作者: 心灵的一扇窗    时间: 2014-3-18 19:52
刘凯旋 发表于 2014-3-17 20:55
首先调用你的代码要写对,不然因为代码原因出错而下结论说是别的原因,其二,在静态初始化时,它找不到这个 ...

我的问题不是很明确么?就是对毕老师对于“静态方法中不可以定义this和super关键字”这个问题的解释有点不解么,静态的确是先于对象而存在的,这点没有疑问,而且静态方法在进入方法区后,java虚拟机给予了语法检查,从语法上规定了静态方法中不可以调用非静态成员,就算此时对象已经在该静态方法的前面创建也不可以。
请看下面的代码:



作者: 心灵的一扇窗    时间: 2014-3-18 19:57
水蓝 发表于 2014-3-18 10:18
静态优先于对象存在:
可以理解为,静态是在类字节码加载到方法区后,紧跟着加载到方法区的。
其实就是在你 ...

“静态方法,属于类,而不属于对象”,这句话有点问题,静态方法,属于类,同时也是属于对象的,因为它是多个不同对象的共享方法,能够被对象所调用
作者: 心灵的一扇窗    时间: 2014-3-18 20:05
水蓝 发表于 2014-3-18 10:18
静态优先于对象存在:
可以理解为,静态是在类字节码加载到方法区后,紧跟着加载到方法区的。
其实就是在你 ...

this本身是一个引用,指向调用它所属的方法的对象,静态方法也可以被对象所调用,以下代码可以证明:



作者: haio    时间: 2014-3-19 13:50
本帖最后由 haio 于 2014-3-19 15:40 编辑
心灵的一扇窗 发表于 2014-3-18 19:10
同学,你可不可以加几个标点符号,看起来有点吃力哦,重在参与交流,挺你! ...

这些天我又将这个问题总结了一下你看一下共同学习!!
我们描述一个类,其实就是描述一个事物的属性和行为,并没有产生一个具体的实例。而是通过new操作符建立对象来供给外部调用。当一个或多个对象在产生时,本身就有一个特定的方法或属性,并且这个方法或属性是一个或多个对象共有的,我们就把它定义为静态,并且在一个类一生成静态就存在了。
在有静态的方法中非静态成员可以直接访问本类中的静态成员和非静态成员(因为静态优先与非静态而存在)
而静态成员只能访问静态成员不能访问非静态成员(因为静态在被调用时不需要建立对象,而非静态在被调用时必须先建立类的实例对象)
关键:静态方法中不能以任何方式引用this和super关键字?
答::因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时this所指向的对象根本就没有产生,不管你把创建对象的代码放在静态前还是静态后静态都是优先于对象和非静态而存在的
我试着编译了一下是可以的
class Person
{
            String name ="hallo";
    static String country = "ZG";
            static Person p = new Person();
            static void show()
            {
                    System.out.println(p.name);
            }
            public static void main(String [ ] args)
            {

            }
}



这次可是加了标点符号哦!!有建议可以交流!!!相互学习!!加油!!


作者: 心灵的一扇窗    时间: 2014-3-19 19:55
haio 发表于 2014-3-19 13:50
这些天我又将这个问题总结了一下你看一下共同学习!!
我们描述一个类,其实就是描述一个事物的属性和行为 ...

“当一个或多个对象在产生时,本身就有一个特定的方法或属性,并且这个方法或属性是一个或多个对象共有的”共有的属性,我们把它称之为非特定的
作者: 心灵的一扇窗    时间: 2014-3-19 19:57
haio 发表于 2014-3-19 13:50
这些天我又将这个问题总结了一下你看一下共同学习!!
我们描述一个类,其实就是描述一个事物的属性和行为 ...

嗯,顶你,互相交流,互相学习,真理是越辩越明的,我喜欢这种感觉,我不能为了回答问题而回答问题,而是为了一种把问题弄清楚之后而获得的成就感,对,就是这种感觉,太棒了!
作者: 心灵的一扇窗    时间: 2014-3-19 20:06
haio 发表于 2014-3-19 13:50
这些天我又将这个问题总结了一下你看一下共同学习!!
我们描述一个类,其实就是描述一个事物的属性和行为 ...

“静态成员只能访问静态成员不能访问非静态成员(这是java语法的规定,为了防止因对象不存在时出现的调用错误)(因为静态在被调用时不需要建立对象(可以建立,也可以不建立,应需要而创建),而非静态在被调用时必须先建立类的实例对象)”非静态成员因对象的存在而存在,
作者: 心灵的一扇窗    时间: 2014-3-19 20:15
haio 发表于 2014-3-19 13:50
这些天我又将这个问题总结了一下你看一下共同学习!!
我们描述一个类,其实就是描述一个事物的属性和行为 ...

“因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时this所指向的对象根本就没有产生,不管你把创建对象的代码放在静态前还是静态后静态都是优先于对象和非静态而存在的”静态优先于对象存在是有前提条件的,前提是那个对象不是本类的静态对象,而是在其他的类中定义的,如果是本类的静态对象,就不一定了
作者: 心灵的一扇窗    时间: 2014-3-19 20:23
haio 发表于 2014-3-19 13:50
这些天我又将这个问题总结了一下你看一下共同学习!!
我们描述一个类,其实就是描述一个事物的属性和行为 ...
class Person
{
             String name ="hallo";
     static String country = "ZG";
             static Person p = new Person();
             static void show()
             {
                     System.out.println(p.name);
             }
             public static void main(String [ ] args)
             {

            }
}

你这段代码能编译并运行的话,说明本类的静态对象是优先于show方法而存在的,如果不是,那show方法里面使用的对象的成员变量就要报错了

作者: haio    时间: 2014-3-19 23:51
心灵的一扇窗 发表于 2014-3-19 20:15
“因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时this所指向的对象根本就没有产生,不管 ...

嗯!学习了!!厉害!!




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