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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 包晗 中级黑马   /  2012-7-12 13:02  /  2563 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 包晗 于 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也能运行成功

11 个回复

倒序浏览
如果子父类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this(this代表的是本类对象的引用);子类要访问父类中的同名变量,用super( super代表的是父类对象的引用),而这里的z.num访问的是子类的成员变量,this省略
而调用子类的show()方法,当然打印的还是子类的变量num = 5


回复 使用道具 举报
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.
回复 使用道具 举报
哥们,你打印的都是子类中的num,可能你把this跟super理解反了吧
回复 使用道具 举报
  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: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

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
成员变量在多态调用时,new谁就调用谁的成员变量。
new Zi();打印的是Zi类的num,两个都是。

继承中,除了private修饰的成员变量外,同名变量可以看成是子类的覆盖父类的。
回复 使用道具 举报
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方法貌似是没有意义的呀

        }

}
回复 使用道具 举报
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方法貌似是没有意义的呀

        }

}
回复 使用道具 举报
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);
           
        }
}
//多态中静态成员函数特点:编译和运行都参考左边

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
子类没有调用父类的话就是本类的值,只是省略了this.
回复 使用道具 举报
哦,谢谢大家了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马