黑马程序员技术交流社区

标题: 继承 [打印本页]

作者: HM何伟    时间: 2013-4-14 19:47
标题: 继承
本帖最后由 HM何伟 于 2013-4-15 20:23 编辑

有两个类,它们之间有继承关系。父类中有一个带参数的构造函数,子类会默认访问父类的参构造函数么?
作者: 周音匀    时间: 2013-4-14 19:59
在构造子类时,一定会调用到父类的构造方法。
父类如果有无参构造方法,子类默认调用父类的无参数构造方法。
如果父类有带参数构造函数,可以通过super(s)调用父类带参构造。
作者: love_java    时间: 2013-4-14 20:03
本帖最后由 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关键字调用了。
作者: U芽Lady    时间: 2013-4-14 20:08
子类不会默认访问父类的带参构造函数
子类的构造函数都隐含一个super(),对父类无参构造函数的调用
子类会默认访问父类的无参构造函数,要想访问父类的带参构造函数要用super(参数列表)访问
要是你自己在父类定义了一个带参的构造函数,最好在写一个无参的,要不然子类写构造函数时,在你没有调用父类的构造函数时,找不到默认的构造函数很容易报错
作者: 通行天下    时间: 2013-4-14 20:48
  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. */
复制代码

作者: 周一川    时间: 2013-4-14 20:53
会的, 因为子类会找父类的成员,如果父类是无参子类会默认的访问父类勿参的构造, 如果有参的,那super语句指定
作者: 李力    时间: 2013-4-14 21:08
  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 :
当前对象里面的父类的内存空间的标识。
在子类的构造方法内部引用父类的构造方法。
在子类中调用父类中的成员方法。
在子类中调用父类中的成员变量




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