黑马程序员技术交流社区

标题: 无参构造方法可以调用有参构造方法吗? [打印本页]

作者: 头狼    时间: 2014-12-21 23:30
标题: 无参构造方法可以调用有参构造方法吗?
无参的构造方法可以调用有参的构造方法吗?为什么子类的构造方法一定会调用父类的构造方法呢?


作者: lidinghai    时间: 2014-12-21 23:48
可以。         因为是子类,会把父类中public的方法继承下来,同时又可以定义自己的方法。
作者: 陈强fly    时间: 2014-12-22 00:29
子类的无参构造方法不能调用父类的带参构造方法
作者: duluhua    时间: 2014-12-22 10:18
构造方法这里我研究了好长时间,比较凌乱,总结了下。
1.构造方法的作用是:在创建类的对象的时候,对对象进行初始化,也就是说,只要一创建对象,那么就让该对象的成员有一定的值。
2.构造方法的声明是很特殊的:没有返回值,方法名跟类名一致,所以——子类不能继承父类的构造方法,因为父类构造方法名与子类类名是不一样的。
3.子类可以使用super在构造方法中调用父类的构造方法。这么做的意义是,子类在创建对象的时候,要先查看下父类的构造方法对对象做过一些什么操作,如果子类不调用父类构造方法,那么子类在创建对象的时候有可能会漏掉父类构造方法对对象的初始化操作。
举个例子:----------
public class A {
    //无参构造方法
    public A(){
        System.out.println("aaaaaaaa");
    }
    //有参构造方法
    public A(int i){
        System.out.println(i);
    }
}

public class B extends A {
    //B的构造方法
    public B(){
        super(1);//调用父类有参的构造方法
        System.out.println("bbbbbbb");
    }
   
    public B(int i){
        System.out.println("cccccccccc"+i);
    }
    public static void main(String[] args) {
        new B();
        new B(5);//调用的是无参构造方法,注意的是,该构造中没有用super来调用父类构造,但系统会默认调用父类的无参构造方法
    }
}

好了,感觉上就这些,我把new B()  和new B(5)来回调用,对比出的结果
作者: Honelyboy    时间: 2014-12-22 21:39
无参的构造函数可以调用有参的构造方法,子类调用父类的构造函数是为了初始化父类对象。
作者: 红楼    时间: 2014-12-22 21:46
有一个默认的super()存在
作者: 头狼    时间: 2014-12-22 22:03
duluhua 发表于 2014-12-22 10:18
构造方法这里我研究了好长时间,比较凌乱,总结了下。
1.构造方法的作用是:在创建类的对象的时候,对对象 ...

前面能看懂,代码有点不明白
作者: 侯鹏成    时间: 2014-12-22 22:25
可以的了       super(参数1,参数2,.....);
作者: cz萑    时间: 2014-12-22 22:26
本帖最后由 cz萑 于 2014-12-22 22:39 编辑

class   B
{
     B()      
     {
         this(5);
      }
     B(int n)
     {
           System.out.println(n);
        }
第二个问题,子类的构造方法里都隐藏着super()用来指向父类的构造方法

作者: dandan520    时间: 2014-12-22 22:27
新手了解了解
作者: reyzarc    时间: 2014-12-22 22:48
板凳分析得很详细,受教了……
作者: 青衫禅客    时间: 2014-12-23 00:12
第一个问题代码示例验证可以:
class Demo
{
       
        public static void main(String[ ] args)
        {
                System.out.println("hahahaha");
                new Demo1();
        }
}
class Demo1
{
        Demo1()
        {
                this(2);
                System.out.println("*********");
        }
        Demo1(int a)
        {
                System.out.println(a);
        }
}

第二个问题关于子父类的初始化,老毕视频说的很仔细
作者: duluhua    时间: 2014-12-23 08:23
头狼 发表于 2014-12-22 22:03
前面能看懂,代码有点不明白

就像楼上说的,如果你再子类构造方法中没有用super()调用父类构造方法,那么系统会默认一个super()方法来调用父类的构造方法。  如果你显示的用super()的调用了那么就调用的是父类中super()对应的构造方法




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