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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘辉 中级黑马   /  2013-3-4 23:15  /  1120 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Fu
{
        static int number=5;
}

class Zi extends Fu
{
         int number = 6;

        public static  void show()
        {
                System.out.println(super.number);//static和super冲突,为什么
        }
}


public class Demo11
{
        public static void main(String []args)
        {
            Zi z = new Zi();

         z.show();
        }
}

点评

最好把题目写的明确一些,把问题中不懂的地方写出来,并在代码中注释好。  发表于 2013-3-5 21:53

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

5 个回复

倒序浏览
你是问为什么冲突对吧?   静态函数里面不允许出现super,this。因为错误提示里说的很明白,静态函数里不允许出现非静态变量,甚至你不写super,编译也不通过,因为有隐藏的this。  具体原因则是  加载顺序的问题,静态函数随着类的加载而加载,而这时还没有创建对象呢,number是非静态的,只能被对象所调用,所以不能出现在静态函数里。

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
super代表的是父类对象的引用。这里静态方法先于父类对象存在,所以不能用super。
回复 使用道具 举报
static成员优先于对象存在。
回复 使用道具 举报
两个问题:一.首先你这个public class Demo11位置应该编译不过去,你这样的话Demo11的类就是公共的.
            二.就是cmd里应该会给出提示无法从静态上下文中引入非静态变量super,静态函数随着类的加载而加载,还没有创建对象呢,而你的number是个非静态的变量,只能被对象调用.也可以从内存图来理解,静态函数在方法区的静态区中,而你的number在堆内存中存储,先后顺序都不对了.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报
super在这里代表父类的实例对象,不能用于static方法中,而且,更为重要的是this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者是一个类,而不是对象.如果使用的是类来调用而不是对象,则 super和this就无法指向合适的对象.所以static 修饰的方法中不能使用this和super.
辉哥,是不是清楚了呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马