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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

静态方法随着类的加载而加载,
所以方法体中不能使用this关键字,原因是对象落后于方法后加载。this找不到对应的对象。
但是如果对象也被static修饰,是否意味着就可以使用this了?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

倒序浏览
在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行.
因为this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不一定存在

2.      在问题之前先讲super的用法:
1.super的用法跟this类似,this代表对本类对象的引用,指向本类已经创建的对象;而super代表对父类对象的引用,指向父类对象;
2.静态优先于对象存在;
3.由上面的1.和2.知:
因为静态优先于对象存在,所以方法被静态修饰之后方法先存在,而方法里面要用到super指向的父类对象,但是所需的父类引用对象晚于该方法出现,也就是super所指向的对象没有,当然就会出错。
综上,静态方法中不可以出现super关键字。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 笑脸不在 于 2013-12-25 13:42 编辑

在方法中:this代表的是调用此方法的对象。
而静态成员(方法和变量)都是随着类的加载而存在的,类加载了,但不一定就有对象
也就是说,静态成员是优先于对象存在于内存中的
假如:在加载类时,某个静态方法需调用含有this的静态方法;那么这个this指代什么呢~jvm不知道就报错了
所以:静态方法中是不可以存在this的(super也是同理)。其实静态成员可以被类名直接调用的,所以不管this可不可以在静态方法中调用静态成员(实际上也是不可以的),这个都是多余的
按楼主的意思写了如下代码:
class ThisTest
{
        public static void main(String[] args)
        {
                Person p=new Person();
                p.show();
               
        }
        static class Person
        {
                public static int age=30;
                public static void show()
                {
                        System.out.println("Person Age:"+this.age);//当把this去掉后就可以了
                }
        }
}
结果当然是编译没通过:无法从静态上下文中引用非静态变量
关于this和super的一些详细用法可以参考我的日记:
http://user.qzone.qq.com/2798043851/2


评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
OK,了解了。感觉想用this就是多此一举的样子
回复 使用道具 举报
因为静态方法优先于对象存在,所以静态方法中不可以使用this引用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马