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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王春祥 中级黑马   /  2012-3-19 17:00  /  1982 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

现在感觉敲着敲着代码忽然就会发现不明白的地方了
class Fu
{
        int num=4;
}
class Zi extends Fu
{
        int num=5;
}
class ExtendDemo
{
        public static void main(String[] args)
        {
                Zi z=new Zi();
                System.out.println(super.num);       
        }
}       
编译后
ExtendDemo.java:38: 错误: 无法从静态上下文中引用非静态 变量 super
                System.out.println(this.num);
                                   ^
ExtendDemo.java:38: 错误: 找不到符号
                System.out.println(this.num);
                                                  ^
super换this也一样,改成z就好,这是为什么呢用super和this替代和本身的对象名有什么区别呢,还有num是非静态成员变量,怎么静态的主函数依然可以使用呢

6 个回复

倒序浏览
main所在类的父类是object类,你调用super当然没有num属性了。
只有在同一个类中,静态函数才访问静态变量。你这里是在main里面定义的类,算局部变量,当然可以访问了。
回复 使用道具 举报
首先main可以访问非静态的num是因为z.num中z是已经创建的实例对象,此时num已存在与堆内存中,也就是说只能是(对象.num)才可以访问num;
System.out.println(super.num);    这里不管是super还是this都代表类名而不是一个实例对象,  所以无法访问非静态的num,
回复 使用道具 举报
this代表当前对象的引用 super带表父类的引用
ExtendDemo的父类是Object
super.num;  的时候无论是this还是super都没有num属性。
还有num是非静态成员变量,怎么静态的主函数依然可以使用呢
如下就可以
        public static void main(String[] args)
        {
            Fu fu = new Fu();
            System.out.println(fu.num);  
        }
回复 使用道具 举报
你的意思是在主函数new了一个zi对象出来,然后就可以在主函数使用super来调用new出来的zi对象的父类属性吗?那么你在主函new了很多个对象怎么办?在主函数使用super访问的是main函数的父类。
回复 使用道具 举报
主函数的this和super都出现了是闹哪样啊
回复 使用道具 举报
ExtendDemo默认的父类是object类,你在类ExtendDemo使用super,此时super指的是object类,而object类里没有你要的num属性,所以会出现ExtendDemo.java:38: 错误: 找不到符号
如果你使用this,则此时this指代的是类ExtendDemo,this.num是指调用ExtendDemo中的属性num而你在ExtendDemo没有定义num所以也会出现.java:38: 错误: 找不到符号
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马