黑马程序员技术交流社区

标题: 看看这个 [打印本页]

作者: 王春祥    时间: 2012-3-19 17:00
标题: 看看这个
现在感觉敲着敲着代码忽然就会发现不明白的地方了
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是非静态成员变量,怎么静态的主函数依然可以使用呢
作者: 张锐    时间: 2012-3-19 17:13
main所在类的父类是object类,你调用super当然没有num属性了。
只有在同一个类中,静态函数才访问静态变量。你这里是在main里面定义的类,算局部变量,当然可以访问了。
作者: 周建    时间: 2012-3-19 17:25
首先main可以访问非静态的num是因为z.num中z是已经创建的实例对象,此时num已存在与堆内存中,也就是说只能是(对象.num)才可以访问num;
System.out.println(super.num);    这里不管是super还是this都代表类名而不是一个实例对象,  所以无法访问非静态的num,

作者: 魏群    时间: 2012-3-19 17:35
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);  
        }
作者: 肖岑锋    时间: 2012-3-19 17:49
你的意思是在主函数new了一个zi对象出来,然后就可以在主函数使用super来调用new出来的zi对象的父类属性吗?那么你在主函new了很多个对象怎么办?在主函数使用super访问的是main函数的父类。
作者: 于紫洋    时间: 2012-3-19 17:52
主函数的this和super都出现了是闹哪样啊
作者: 陈从宾    时间: 2012-3-19 18:58
ExtendDemo默认的父类是object类,你在类ExtendDemo使用super,此时super指的是object类,而object类里没有你要的num属性,所以会出现ExtendDemo.java:38: 错误: 找不到符号
如果你使用this,则此时this指代的是类ExtendDemo,this.num是指调用ExtendDemo中的属性num而你在ExtendDemo没有定义num所以也会出现.java:38: 错误: 找不到符号





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