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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM何伟 中级黑马   /  2013-4-14 19:47  /  1795 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM何伟 于 2013-4-15 20:23 编辑

有两个类,它们之间有继承关系。父类中有一个带参数的构造函数,子类会默认访问父类的参构造函数么?

6 个回复

倒序浏览
在构造子类时,一定会调用到父类的构造方法。
父类如果有无参构造方法,子类默认调用父类的无参数构造方法。
如果父类有带参数构造函数,可以通过super(s)调用父类带参构造。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 love_java 于 2013-4-14 20:05 编辑

给你举个例子,下面这段代码应该能看懂吧。
class TestA{
         public TestA(){
          System.out.println("A");
         }
        }
        class TestB extends TestA{
         public TestB(){
          System.out.println("B");
         }
        }
        public class test{
         public static void main(String args[]){
          TestB testB=new TestB();
         }
}
最后输出的结果是:AB


这就说明子类在被调用的时候继承了父类的无参构造方法,并且默认访问了,在你调用子类的时候,父类的构造方法也被调用了。
当有参的构造方法就得用super关键字调用了。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
子类不会默认访问父类的带参构造函数
子类的构造函数都隐含一个super(),对父类无参构造函数的调用
子类会默认访问父类的无参构造函数,要想访问父类的带参构造函数要用super(参数列表)访问
要是你自己在父类定义了一个带参的构造函数,最好在写一个无参的,要不然子类写构造函数时,在你没有调用父类的构造函数时,找不到默认的构造函数很容易报错

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
  1. class Fu
  2. {
  3.         int i = 0;
  4.         Fu(int i)
  5.         {
  6.                 this.i = i;
  7.                 System.out.println("Fu:"+i);
  8.         }
  9. }
  10. class  Zi extends Fu
  11. {
  12.         String str;
  13.         Zi(String str)
  14.         {
  15.                 super(2);//这一句必须写!因为系统默认的是super()这句;而且必须是第一条语句!!
  16.                 System.out.println("B:"+str);
  17.         }
  18.         public static void main(String[] args)
  19.         {
  20.                 new Zi("Hello");
  21.         }
  22. }
  23. /*
  24. 此程序的执行过程为:new Zi("Hello")----->Zi(String str)------>super(2)-------->Fu(int i)----->输出i------>输出str。
  25. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
会的, 因为子类会找父类的成员,如果父类是无参子类会默认的访问父类勿参的构造, 如果有参的,那super语句指定
回复 使用道具 举报
李力 中级黑马 2013-4-14 21:08:34
7#
  1. class Fu
  2. {
  3.         int i = 0;
  4.                 Fu(){}//不带参数的父类构造函数
  5.         Fu(int i)
  6.         {
  7.                 this.i = i;
  8.                 System.out.println("Fu:"+i);
  9.         }
  10. }
  11. class  Zi extends Fu
  12. {
  13.         String str;
  14.                 Zi(){}//不带参数的子类构造函数这样不容易报错
  15.         Zi(String str)
  16.         {
  17.                 super(2);//这一句必须写!因为系统默认的是super()这句;而且必须是第一条语句!!
  18.                 System.out.println("Zi"+str);
  19.         }
  20.         public static void main(String[] args)
  21.         {
  22.                 new Zi("Hello");
  23.         }
  24. }
  25. /*
  26. 此程序的执行过程为:new Zi("Hello")----->Zi(String str)------>super(2)-------->Fu(int i)----->输出i------>输出str。
  27. 结果为:Fu2
  28.            ZiHello
  29. */
复制代码
super :
当前对象里面的父类的内存空间的标识。
在子类的构造方法内部引用父类的构造方法。
在子类中调用父类中的成员方法。
在子类中调用父类中的成员变量

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马