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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 殷婷婷 中级黑马   /  2013-8-8 13:04  /  2076 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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吗?难道不能直接用吗?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
如果子类中出现了非私有的同名成员变量时,子类要要访问本类中的变量用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);
              
       }
}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
顶楼上一下。。。当一个类继承了一个父类时,如果想要访问自己的方法或变量时,用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是非静态变量,在静态方法中不能直接调用非静态的变量!!!

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
应该是类中不能写语句吧,
  x=34;是赋值语句
类中只能是成员变量和方法
回复 使用道具 举报
顶楼上一下,在多态中,静态成员函数中,无论编译还是运行都参考左边。
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);
              
       }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马