黑马程序员技术交流社区

标题: 有关面向对象,继承中,this 和super的问题 [打印本页]

作者: 江杰    时间: 2012-5-7 11:04
标题: 有关面向对象,继承中,this 和super的问题
class Fu
{
   int num= 4;//要是私有不能访问。
}


class Zi  extends Fu
{
                int num=5;
        void show()
        {
                System.out.println(num);//父类对象的引用
        }
}


class  ExtendsDemo2
{
        public static void main(String[] args)
        {
                Zi z= new Zi();
                   z.show();
                System.out.println(z.num+ "............."+z.num);
        }
}
这个的结果是:4
             4.........4
要是把show函数中的改成System.out.println(super.num);结果就会是
            4
                  5...........5
这个不是有super了 不应该是
            5
                  5............5吗

怎么还会输出4呢,内存的调用步骤到底是怎么样的,??
谢谢大家了。
作者: 谭景宾    时间: 2012-5-7 11:22
class Fu
{
   int num= 4;//要是私有不能访问。
}


class Zi  extends Fu
{
                int num=5;
        void show()
        {
                System.out.println(num);//父类对象的引用
        }
}


class  ExtendsDemo2
{
        public static void main(String[] args)
        {
                Zi z= new Zi();
                   z.show();
                System.out.println(z.num+ "............."+z.num);
        }
}
这个的结果是:4
             4.........4

应该是:5
     5.........5 才对吧!因为子类继承父类,变量不会被覆盖,这个时候num前面有个隐式的this,也就是调用自身的变量,为不是父类的

要是把show函数中的改成System.out.println(super.num);结果就会是
            4   //这里的4调用的是show函数里的num,函数里的num因为加了super所以调用的父类的num=4;
                  5...........5  //这里的两个5调用的是子类的变量num=5,与函数里的num无关,没有起到赋值或者覆盖效果,所以还是子类自身的5
作者: 隋营营    时间: 2012-5-7 11:40
本帖最后由 隋营营 于 2012-5-7 11:42 编辑

第一次的输出结果错了!应该是:
5
5.............5

改为:super.num 后输出结果是:
4
5.............5

虽然 Zi 继承了 Fu 的成员 , 但在内存中 引用 z 能直接访问到的只有自己的成员,
要访问父类的成员必须使用super——super.num 表示调用父类的num

2012-05-07_112016.png (12.74 KB, 下载次数: 30)

2012-05-07_112016.png

作者: 江杰    时间: 2012-5-7 12:52
隋营营 发表于 2012-5-7 11:40
第一次的输出结果错了!应该是:
5
5.............5

这个明了,多谢
作者: 江杰    时间: 2012-5-7 12:54
谭景宾 发表于 2012-5-7 11:22
class Fu
{
   int num= 4;//要是私有不能访问。

多谢作答,
作者: 黑马张立国    时间: 2012-5-7 14:20
关于能不能访问

   int num= 4;//要是私有不能访问
不能,因为private的权限是必须是同一个类,你这个是不同类
如果想实现可以用内部类
作者: 付左军    时间: 2012-5-7 18:00
class Fu
{
   int num= 4;//要是私有不能访问。
}


class Zi  extends Fu
{
                int num=5;
        void show()
        {
                System.out.println(num);//父类对象的引用
        }
}


class  ExtendsDemo2
{
        public static void main(String[] args)
        {
                Zi z= new Zi();
                   z.show();
                System.out.println(z.num+ "............."+z.num);
        }
}
这个的结果是:4
             4.........4谁说结果是44。。。4了?你创建子类对象,子类中的show方法会先找
自己的成员变量,怎么都不会是444
要是把show函数中的改成System.out.println(super.num);结果就会是
            4
                  5...........5
这个不是有super了 不应该是





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