java构造器(整合)

来源:互联网 发布:淘宝小二怎么联系 编辑:程序博客网 时间:2024/05/15 20:19

没有父类无法构造子类,构造子类之前是必须要先构造父类的,一般都是隐式调用父类的无参构造器的。

所以:1.如果定义了有参构造器,而又没有无参构造器的话,JVM是不会自己构造无参构造器的,因为虚拟机认为你自己可以定义构造器(java虚拟机说:自己能做为什么还要我帮你定义无参构造器呢)。

2.如果没有定义了有参构造器,就可以不用自己定义无参构造器(java虚拟机说:你不会定义构造器啊,那我帮你造个吧)。


转载。。。详解:


构造方法,就是对象出生时,必须去做这件事情。就象一个Person类出生之后,“取名字”这个方法是在构造方法中去完成的。如果一个Company对象出来之前,必须进行注册公司名,起动资金,办公地址。那么编译器怎么知道那个方法是构造方法呢。没有返回值,且方法名与类相同。 构造方法严格地说不是正统的方法,感觉生成皇城脚下,动不动就“扶天子以令诸候”,它有它的脾气,如果稍有不对的地方就令程序编译出错。每个类都必须至少有一个构造方法,可以是默认不在类中出现,编译器给定的。可以是private,但无论如何必然会有一个构造方法,即使它什么也不做。

1)它没有返回值。关于它有没有返回值,以前实验室争论过非常长的时间,“返回值帮”,认为最终它通过执行,给你了一个对象。这个对象就是它生产出来的。“无返帮”,认为对象是new的产生,不干构造方法什么事。构造方法只是new出一个空间,即一个空白对象以后,执行初始化的工作。我支持“无返帮”,觉得new就象买了一个毛坯房,然后构造方法是一个装修队。

2)看下边的示例:

public class A {
   public A(int i){}
}
class B extends A{
   public B(int i){}
   public static void main(String[] args) {
      new B(3);
   }
}

      表面上这是一个非常简单的程序,乍一看没有错啊。可以正常执行。或许你找出来的错是指两个带参的构造方法为什么是空体,事实上真正的错误在于,虽然每个类都带有默认无参的构造方法,但一旦显示定义有参构造方法,无参构造方法就消失了。这里B(int i)的构造方法调用的是A的无参构造方法,而不是想当然的A(int i),有两种改法:一、A中加入public A(){}无参构造方法。二、在public B(int i){ super(i);} 去强制调用A的有参构造方法。这里要注意的是,对于构造方法的匹配检查,是编译期进行的,出现的错误是编译期错误。而不是运行时异常。反正至少有一条路是通向Object,可以是super(a),如果不显示指定,一律无参的调用父类构造方法。类似的例子如:

class First{
   public First(String s){
      System.out.println(s);
   }
}

public class Second extends First {
   public static void main(String[] args) {
      new Second();
   }
}               //错误提示:Implicit super constructor First() is undefined for default constructor. Must define an explicit   constructor


原创粉丝点击