黑马程序员技术交流社区

标题: 继承小问题 [打印本页]

作者: 包晗    时间: 2012-7-12 13:02
标题: 继承小问题
本帖最后由 包晗 于 2012-7-12 19:22 编辑
  1. class Fu
  2. {
  3.          int num=4 ;//private
  4. }

  5. class Zi extends Fu
  6. {
  7.         int num =5 ;
  8.         void show()
  9.         {
  10.                 System.out.println(num);
  11.         }
  12. }

  13. class ExtendsDemo2
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Zi z= new Zi();
  18.                 System.out.println(z.num+"..........."+z.num);
  19.                 z.show();
  20.         }
  21. }
复制代码
想问一下  我运行此程序发现默认打印 num 都是5   ,
在内存里 父类的num  是不是被重写了..   这里貌似不用this 标识num也能运行成功
作者: 王超    时间: 2012-7-12 13:13
如果子父类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this(this代表的是本类对象的引用);子类要访问父类中的同名变量,用super( super代表的是父类对象的引用),而这里的z.num访问的是子类的成员变量,this省略
而调用子类的show()方法,当然打印的还是子类的变量num = 5



作者: 万宝东    时间: 2012-7-12 13:15
zi继承fu的时候,并没有复写fu的num,而继承之后,在子内有2个num。然后需要哪个值就调用哪个值,他们2个之间没有关系,只是名字相同而已。
public static void main(String[] args)

18.        {

19.                Zi z= new Zi();

20.                System.out.println(z.num+"..........."+z.num);

21.                z.show();

22.        }
你的main函数中,打印的全是zi的num,所以全是5.
System.out.println(z.num+"..........."+z.num);把这一句换成System.out.println((new Fu()).num+"..........."+z.num);
打印的结果 就是  4 ...........5.
作者: 灵感    时间: 2012-7-12 13:55
哥们,你打印的都是子类中的num,可能你把this跟super理解反了吧
作者: 王宝康    时间: 2012-7-12 14:12
  1. class Fu
  2. {
  3.          int num=4 ;//private
  4. }

  5. class Zi extends Fu
  6. {
  7.         int num =5 ;
  8.         void show()
  9.         {
  10.                 System.out.println(num);
  11.         }
  12. }

  13. class ExtendsDemo2
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Zi z= new Zi();  //z的类型为Zi
  18.                 System.out.println(z.num+"..........."+z.num); // 此处打印z的成员变量num=5
  19.                 z.show();  //因为Zi类复写了父类的show方法,所以z.show()中的show方法是Zi类中的show方法,其中的show方法打印的num也是Zi中的成员变量num=5,
  20.                                  如果要想取到父类中的num,可以在Zi类中以super.num取到。
  21.         }
  22. }
复制代码

作者: 王红霞    时间: 2012-7-12 14:32
本帖最后由 王红霞 于 2012-7-12 14:37 编辑

class Fu

{

         int num=4 ;//private

}



class Zi extends Fu

{

        int num =5 ;

        void show()

        {

                System.out.println(num); //有一个规则,说的简便点就是“就近原则”。只要本类中有num,它就先输出本类中的值。输出的就是class Zi中的num的值

        }

}



class ExtendsDemo2

{

        public static void main(String[] args)

        {

                Zi z= new Zi(); / /创建的是Zi的对象  所以输出的就是Zi中的num啊

                System.out.println(z.num+"..........."+z.num);

                z.show();

        }

}

结果是
5………………5
5
======================================
class Fu
{
         int num=4 ;//private
}

class Zi extends Fu
{
        int num =5 ;
        void show()
        {
                System.out.println(super.num);   //这时的输出结果就是父类中的值了
        }
}

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


作者: 黑马-王言龙    时间: 2012-7-12 14:56
成员变量在多态调用时,new谁就调用谁的成员变量。
new Zi();打印的是Zi类的num,两个都是。

继承中,除了private修饰的成员变量外,同名变量可以看成是子类的覆盖父类的。
作者: 苑占丽    时间: 2012-7-12 15:09
class Fu

{
         int num=4 ;//private

}


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();

                System.out.println(z.num+"..........."+z.num);这一行直接就打印出5了

                z.show();这一行又让zi对象调用show方法貌似是没有意义的呀

        }

}
作者: 苑占丽    时间: 2012-7-12 15:09
class Fu

{
         int num=4 ;//private

}


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();

                System.out.println(z.num+"..........."+z.num);这一行直接就打印出5了

                z.show();这一行又让zi对象调用show方法貌似是没有意义的呀

        }

}
作者: 尹善波    时间: 2012-7-12 16:47
class Fu
{
         //Fu(){}  **在类中没有构造函数的情况下系统会自动默认创建一个空的构造函数
         int num=4 ;//private
}
class Zi extends Fu
{
       //Zi()    **在类中没有构造函数的情况下系统会自动默认创建一个空的构造函数   
  //{ super();}  在子类中的构造函数里第一行默认的有一个隐式super语句,在本例中隐含
                 //super访问隐含的父类,不起作用
        int num =5 ;
        void show()
        {
           System.out.println(num);
        }
}
class ExtendsDemo2
{
        public static void main(String[] args)
        {
           Fu f= new Zi();//加上这句构成了多态中成员变量的创建,
               //特点是:无论编译和运行都参考左边,
           Zi z= new Zi();//这个是成员函数的多态形式,特点是:编译看左边,运行看右边
       z.show();             //也就是说这里没有覆盖的发生
           System.out.println(z.num+"..........."+f.num);
           
        }
}
//多态中静态成员函数特点:编译和运行都参考左边

作者: 刘勇军    时间: 2012-7-12 18:49
子类没有调用父类的话就是本类的值,只是省略了this.
作者: 包晗    时间: 2012-7-12 19:21
哦,谢谢大家了




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