黑马程序员技术交流社区

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

作者: 乖睡觉咯    时间: 2013-8-16 22:59
标题: 继承中的小问题
  1. class Fu{
  2.         int num = 4;
  3.         Fu(){
  4.                 num = 5;
  5.         }
  6. }
  7. class Zi extends Fu{
  8.         int num = 6;
  9.         public void method(){
  10.                 int num = 7;
  11.                 System.out.println(num);
  12.         }
  13. }

  14. class demo{
  15.         public static void main(String[] args) {
  16.                 Zi z = new Zi();
  17.                 z.method();
  18.         }
  19. }
复制代码
运行结果一开始是 7;
想输出6的话 System.out.println(num);  改为 System.out.println(this.num);
想输出5的话 System.out.println(num);  改为 System.out.println(super.num);
那要是想输出 4 的话怎么改啊 ??   求解

作者: yangxin540    时间: 2013-8-16 23:33
构造函数是给数据初始化的,你定义了一个num等于4,然后然后在程序加载的时候构造函数就改变了num的值为5了,也就是该类的对象中存在的初始化num就是5,所以你要想打印出4,在你现在这个程序是不行的,要打印出4,你可以不在构造函数中初始化num为5.
作者: 焦允    时间: 2013-8-16 23:50
class Fu{
        int num = 4;
        Fu()
       {
             num = 5;
        }
       Fu(int num)
       {
            this.num = num;
        }
}
class Zi extends Fu{
        int num = 6;
        Zi()
       {
               super(int num);
       }
        public void method(){
                int num = 7;//与成员变量同名的局部变量
                //System.out.println(num); //调用的是method方法内的局部遍历
               //System.out.println(this.num);//调用的事Zi类中的成员变量。
               System.out.println(super.num);//调用的事Fu类中的成员变量。
        }
}
class Demo1{
        public static void main(String[] args) {
                Zi z = new Zi();  
                z.method();
        }
}


按照上面的修改运行结果就是4,在父类中添加一个有参数的构造方法,并在子类构造方法中显式调用.但这样改的话可能跟楼主的初衷不符。

其实楼主所写的代码中,父类中的num值在创建子类对象时,因为调用了父类构造方法进行了初始化赋值,num变量里面的值已经不再是4了,所以如果仅仅是调用num,而不对num重新赋值,是无法再输出4的结果的。

作者: 昝文萌    时间: 2013-8-17 12:35
创建子类对象时,会先调用父类的构造函数把父类对象里的成员变量num的值由4变为5。我是这样想的,如果要输出4,只能不调用父类的构造函数,只有用static关键字,把成员变量变为静态的,直接由类访问。经过尝试发现下面的代码可以实现输出4:
  1. class Fu
  2. {
  3.         static int num = 4;//这里定义静态成员变量
  4.         Fu()
  5.     {
  6.                 num = 5;
  7.         }
  8. }
  9. class Zi extends Fu
  10. {
  11.         int num = 6;
  12.         public static void method()//这里定义静态成员函数
  13.     {
  14.                 int num = 7;
  15.                 System.out.println("num="+Fu.num);//这里调用父类的静态成员变量
  16.         }
  17. }
  18. class demo  
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 Zi.method();//直接用类调用静态方法
  23.         }
  24. }
复制代码





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