黑马程序员技术交流社区

标题: 关于继承中函数的问题 [打印本页]

作者: bushangkoukou    时间: 2013-6-4 15:39
标题: 关于继承中函数的问题
本帖最后由 bushangkoukou 于 2013-6-4 19:41 编辑

class Fu
{
Fu()
{
  System.out.println("fu run");
}
Fu(int x)
{
  System.out.println("fu...****..."+x);
}
}
class Zi extends Fu
{
Zi()
{
//super();
  System.out.println("zi run");
}
Zi(int x)
{
//super();
  System.out.println("zi..."+x);
}
}
class  ExtendsDemo4
{
public static void main(String[] args)
{
  Zi z = new Zi();
  Zi z1= new Zi(4);
}
}

此代码中为什么父类中的Fu (int x)不执行????

作者: 闫月乐    时间: 2013-6-4 16:05

  1. //此代码中为什么父类中的Fu (int x)不执行????
  2. class Fu
  3. {
  4.         Fu()
  5.         {
  6.                 System.out.println("fu run");
  7.         }
  8.         Fu(int x)
  9.         {
  10.                   System.out.println("fu...****..."+x);
  11.         }
  12. }
  13. class Zi extends Fu
  14. {
  15.         Zi()
  16.         {
  17.                 //super();
  18.                   System.out.println("zi run");
  19.         }
  20.         Zi(int x)
  21.         {
  22.                 /*
  23.                 第二部:
  24.                 所以,为了满足你的题意,你需要手动写super(参数),去主动运行父类中有参数的构造函数
  25.                 把下面这句话改啦!
  26.                 */
  27.                  super(x);//super();
  28.                   System.out.println("zi..."+x);
  29.         }
  30. }
  31. class  ExtendsDemo4
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.           Zi z = new Zi();
  36.           Zi z1= new Zi(4);
  37.           /*
  38.           第一部:
  39.                 Zi z1=new Zi(4);
  40.                 对象一建立就会调用预知相对应的构造函数,即Zi(int x)
  41.                 并将4传给x,而子类构造函数会默认去访问父类!!空参数!!的构造函数(即使该子类构造函数中有参数也不影响).
  42.                 所以,你的程序,会直接运行父类中的空参数构造函数,而非有参数的那个

  43.           */
  44.         }
  45. }
复制代码

作者: 小冰块    时间: 2013-6-4 16:12
因为无论你创建的子类对象时构造函数有没有参数,第一行隐藏的都是super();而不是super(int x);既然没有调用到含有参数的父类构造函数,当然就不执行了。

你要是想让他执行,就手动在子类构造函数的第一行填上super(x);用它覆盖掉默认的无参构造函数。
作者: bushangkoukou    时间: 2013-6-4 19:22
小冰块 发表于 2013-6-4 16:12
因为无论你创建的子类对象时构造函数有没有参数,第一行隐藏的都是super();而不是super(int x);既然没有调 ...

你好,能放个代码来看看吗?
作者: bushangkoukou    时间: 2013-6-4 19:29
闫月乐 发表于 2013-6-4 16:05

回答的太好了,赞一个,不愧是同班同学
作者: 小冰块    时间: 2013-6-4 19:37
class Fu
{
        Fu()
        {
                System.out.println("fu run");
        }

        Fu(int x)
        {
                System.out.println("fu...****..."+x);
        }
}

class Zi extends Fu
{
        Zi()
        {
                //super();
                System.out.println("zi run");
        }
        Zi(int x)
        {
                super(x);//<----就是这里
                System.out.println("zi..."+x);
        }
}

class  ExtendsDemo4
{
        public static void main(String[] args)
        {
                Zi z = new Zi();
                Zi z1= new Zi(4);
        }
}

以下是运行情况:
这是没改之前的:
D:\Java\0601>java ExtendsDemo4
fu run
zi run
fu run
zi...4
这是该了之后的:
D:\Java\0601>javac ExtendsDemo4.java

D:\Java\0601>java ExtendsDemo4
fu run
zi run
fu...****...4
zi...4


顺便问一句,谁能告诉我怎么在贴子里加上面那种带上行号的程序代码?


作者: 闫月乐    时间: 2013-6-4 19:39
bushangkoukou 发表于 2013-6-4 19:29
回答的太好了,赞一个,不愧是同班同学

:funk:同班?呃呃呃,你是??
作者: bushangkoukou    时间: 2013-6-4 19:44
小冰块 发表于 2013-6-4 19:37
class Fu
{
        Fu()

高级模式里面有个添加代码
作者: bushangkoukou    时间: 2013-6-4 19:45
闫月乐 发表于 2013-6-4 19:39
同班?呃呃呃,你是??

看头像就知道了啊,哈哈




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