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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 石欣欣 黑马帝   /  2011-9-15 15:39  /  2735 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Fu
{
        Fu()
        {
                System.out.println("Fu show");
        }
}

class Zi extends Fu
{
        Zi()
        {
                System.out.println("Zi show");
        }
}


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


问题是;如果类中是构造函数  Zi z=new Zi();  的结果是 Fu show Zi show ,如果类中是成员函数 Zi z=new Zi();  的结果就什么也不显示了


原因???

8 个回复

倒序浏览
当一个类产生一个对象时,它会先去找相应的构造函数对这个对象初始化,也就是会先运行一次构造函数,并且当存在继承关系时,会先运行父类中相应的构造函数.因为子类的构造函数的第一行有一个隐藏的语句:super().这就是会出现Fu show Zi show 的原因.当它只是成员函数时,它不用运行构造函数,所以没有输了语句被调用.补充:对于你说是成员函数时这句话不是很理解,当一个类里的某个函数与类名相同,这个函数就是构造函数了.
[ 本帖最后由 杜桂发 于 2011-09-15  16:06 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-15 16:18:34
藤椅
你要新建一个对象,就必须要用到构造方法,即使你没有构造,也要调用默认构造方法,如果有继承,则先运行父类构造方法,再运行子类构造方法,既然是继承,当然得先有父类,再有子类了,对吧!会显示Fu show Zi show 是因为你写的构造方法里面有这个语句,如果你没有定义构造方法,这时候系统会调用默认构造方法,默认构造方法没有打印语句,当然什么都没打印咯。
回复 使用道具 举报
黑马网友  发表于 2011-9-15 16:25:50
板凳
理解这个问题,楼主首先要理解构造函数的概念。
构造函数是一种特殊的成员方法,其方法名和类名相同。它的特点是:
(1)构造方法没有返回值,前面不能有返回类型,也不能有void。
(2)程序中不能直接调用构造方法。构造方法是当new运算符实例化一个对象时,系统自动调用的。
(3)构造方法一般用于成员变量的初始化。
而在子类生成一个实例对象时,会自动调用父类的构造方法,
故[code]  Zi z=new Zi(); [/code]运行的结果为Fu show Zi show ,而如果相应的输出语句放在成员方法中,程序产生一个类的对象时调用的构造函数不执行任何操作,同时它也不会自动调用成员方法,故不输出任何内容。
回复 使用道具 举报
黑马网友  发表于 2011-9-15 20:17:28
报纸

回复 沙发 的帖子

成员函数就是有返回值类型的  比如:void show();  这个不是叫做成员函数吗?
回复 使用道具 举报

回复 板凳 的帖子

还是你说的比较靠谱  ,构造函数不能被调用?当创建对象时会自动调用?   还有就是初始化这方面不太懂。能解释解释吗?
[ 本帖最后由 石欣欣 于 2011-09-15  20:25 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-15 20:37:19
7#
建议楼主去看下毕向东老师第五天第八节的内容.
回复 使用道具 举报
黑马网友  发表于 2011-9-15 21:10:15
8#
这里对构造方法做个总结,希望能够帮到你~~~
①构造函数的作用及定义
    构造方法的特征:
        1)它具有与类相同的名称;
        2)它不含返回值;
        3)它不能在方法中用return语句返回一个值;
    注:在构造方法里不含返回值的概念是不同于“void”的,若在定义构造方法时加了“void”,结果这个构造方法就不会被自动调用了。


   构造方法的作用:
   当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,可以在这个方法中加入要完成初始化工作的代码。


②构造方法的重载
   与一般的构造方法重载一样,重载的构造方法具有不同个数或不同类型的参数,编译器就可以根据这一点判断出使用
new关键字产生对象时,该调用那个构造方法。产生对象的格式是:new 类名(参数列表)。重载构造方法可以完全不同
于初始化操作。如:Person p = new Person("Tom",18);语句,会完成以下几件事:
     1)创建指定类的新的实例对象;
     2)在堆内存中为实例对象分配内存空间,并调用指定类的构造方法;
     3)将实例对象的首地址赋给引用变量。

③构造方法的一些细节
    在Java 每个类里至少有一个构造方法,如果程序员没有在一个类里定义构造方法,系统会自动为这个类产生一个默认的
构造方法,这个默认构造方法没有参数,在其方法中也没有任何代码,即什么也不做。由于系统提供的构造方法往往不能
满足编程者的需求,我们可以自己定义类中 构造方法,来满足我们的需要。一旦为该类定义了构造方法,系统就不再提供
默认的构造方法了。
回复 使用道具 举报
黑马网友  发表于 2011-9-15 21:25:15
9#
。。。。。你所说的  成员函数,,, 这个需要 指定调用才会运行的 啊。。
  构造函数  ,是  new 这个对象的时候就会被执行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马