黑马程序员技术交流社区

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

作者: 殷婷婷    时间: 2013-8-8 13:04
标题: 继承问题
class Fu
{
        int x = 10;
}
class Zi extends Fu
{
       Zi()
       {
              x=8;
       }
      x=34;
      
}
class Example
{
      
       publicstatic void main(String[] args)
       {
              Fuf = new Zi();
              System.out.println(f.x);
              
       }
}
碰到了个小问题,为什么我在子类构造函数中写x=8是正确的,而在构造函数外写了个x=34就编译错误了呢?子类不是继承了父类的x吗?难道不能直接用吗?


作者: 天涯海角    时间: 2013-8-8 17:34
如果子类中出现了非私有的同名成员变量时,子类要要访问本类中的变量用this,要访问父类中的同名变量用super。而且你的代码也写错了,下面是我写的你对照一下:
class Fu
{
        int x = 10;
}
class Zi extends Fu
{
       Zi()
       {
            int  x=8;
       }
      int x=34;
      
}
class Example
{
      
       publicstatic void main(String[] args)
       {
              Zi z = new Zi();
              System.out.println(super.x);
              
       }
}
作者: 柳小龙    时间: 2013-8-8 18:30
顶楼上一下。。。当一个类继承了一个父类时,如果想要访问自己的方法或变量时,用this关键字;如果想访问父类的的属性和方法时,用super关键字。。并且在构造方法或其他成员方法内,引用自己的变量时,默认会自动会给变量加上this。

在 Zi extends Fu后,Zi就拥有了一份Fu的拷贝(私有的属性和方法除外),在Zi中,如果不重新给x赋值,x默认和Fu的属性x的值一样是10。

在方法外如果直接这样写x=34;既不属于重新定义一个int型的x,也不属于给自己的属性x赋值!!!按照楼上的写法,  int x=34;是对父类继承来的属性x的重写。。System.out.println(super.x);是有错误的,main为静态方法,父类变量x是非静态变量,在静态方法中不能直接调用非静态的变量!!!
作者: ☆今☆    时间: 2013-8-8 21:54
应该是类中不能写语句吧,
  x=34;是赋值语句
类中只能是成员变量和方法

作者: 肖博    时间: 2013-8-9 15:30
顶楼上一下,在多态中,静态成员函数中,无论编译还是运行都参考左边。
class Fu
{
        int x = 10;
}
class Zi extends Fu
{
       Zi()
       {
            int  x=8;
       }
      int x=34;
      
}
class Example
{
      
       public   static void main(String[] args)
       {
              Fu f = new Zi();
              System.out.println(f.x);
                Zi  z = new Zi();
              System.out.println(z.x);
              
       }
}




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