写在开头
- 小编作为一名JAVA萌新,学到类和对象的时候感到有点吃力了。还好在网上找到了非常好的视频,通过一个个具体的需求编程实现,生动形象的讲解了类和对象的含义及使用。但是在理解构造函数的时候又开始范起迷糊来,为了加深自己的理解,亲自动起手来做几个构建函数的实验。
JAVA的构建函数是什么?
- **百度百科上给的定义:**构造函数是一种特殊的函数。其主要功能是用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。构造函数与类名相同,可重载多个不同的构造函数。在JAVA语言中,构造函数与C++语言中的构造函数相同,JAVA语言中普遍称之为构造方法。
- 构造函数的基本特点:
- 1、构造函数的函数名和类名相同
- 解读:如果函数名和类名不同,编译的时候这函数会被计算机理解为成员函数,编译器会按照成员函数的语法要求这个函数,比如需要给出返回值得数据类型。
- 解读:如果函数名和类名不同,编译的时候这函数会被计算机理解为成员函数,编译器会按照成员函数的语法要求这个函数,比如需要给出返回值得数据类型。
- 2、构造函数没有返回值,函数体中不能写return语句。
- 解读:但不等同于返回值为空,如果你试图在构造函数前加void,编译就会出错。
- 3、 构造函数使用来初始化类的,当使用new新建一个对象时,构造函数会自动执行,而且构造函数也仅在对象被创建的时候执行一次,不像其他成员函数可以被多次调用。
- 解读:因为构造函数是用来初始化类的,所以任何一个类都会有构造函数。构造函数分为显是(explict)和隐式(implict)的,如果一个类未定义构造函数,系统会给该类中默认添加一个空参的构造函数,这个默认的构造函数在代码里是看不到的。
- 4、构造函数不可以被继承
- 解读:构造函数的名称必须和类名相同,而子类的名称和父类名不同,所以即使子类继承了构造函数也无意义。所以子类要写自己的构造函数或者由系统默认分配一个构造函数。
- 5、子类对象初始化时,补单会执行子类的构造函数,父类的构造函数同时也会被执行。
- 解读:父类的构造函数可能有如下几种情况:a)父类没有明确写出构造函数,由系统默认分配一个无参的构造函数;b)父类中显式的写出了一个或多个构造函数。无论是哪种情况,在编写子类的构造函数时,设计者要指明执行父类的哪一个构造函数。如何理解呢?看下面的代码。
- 1、构造函数的函数名和类名相同
Father.java
public class Father {
public Father() {
System.out.println("Father的无参构造函数被执行了");
}
public Father(int x) {
System.out.println("Father的带参构造函数被执行了----整数");
}
public Father(Double z) {
System.out.println("Father的带参构造函数被执行了----浮点数");
}
}
Son.java
测试代码1:
public class Son extends Father {
public Son(int x,Double y) {
super(); //父类初始化时使用无参构造函数
}
}
class Test{
public static void main(String[] args) {
Son test0=new Son(5,5.0);
}
}
子类的构造函数指明了初始化父类中无参的构造函数,执行结果:
测试代码2:
package myclass;
public class Son extends Father {
public Son(int x,Double y) {
super(x);//父类初始化时使用带整数形参的构造函数
}
}
class Test{
public static void main(String[] args) {
Son test0=new Son(5,5.0);
}
}
子类的构造函数指明了初始化父类中带整数参数的构造函数,执行结果:
测试代码3:
public class Son extends Father {
public Son(int x,Double y) {
super(y);//父类初始化时使用浮点数参数的构造函数
}
}
class Test{
public static void main(String[] args) {
Son test0=new Son(5,5.0);
}
}
子类的构造函数指明了初始化父类中带浮点数参数的构造函数,执行结果:
测试代码4:
public class Son extends Father {
public Son(int x,Double y) {
//子类构造函数未指明用父类哪个构造函数
}
}
class Test{
public static void main(String[] args) {
Son test0=new Son(5,5.0);
}
}
子类的构造函数未指明使用父类中哪个构造函数,这时候系统会如何处理呢?系统会执行父类无参的构造函数,这种情况的输出效果和测试代码一中的效果一样,相当于系统自动在子类的构造函数添加了一个super(); 执行结果:
package myclass;
public class Son extends Father {
///子类中无构造函数,由系统默认分配构造函数
}
class Test{
public static void main(String[] args) {
Son test0=new Son();
}
}
子类中构造函数都没有写,由系统默认分配一个构造函数时,情况会怎么样呢?朋友们应该已经想到了,此时会默认执行父类中无参的构造函数,执行结果:
总结一下:子类被对象初始化时,会运行子类的构造函数,子类构造函数中指明了运行父类中哪个构造函数,父类中相应的构造函数就会被执行,如果子类中没有指明父类的狗函数,那么会执行父类中无参的构造函数,如果此时父类中没有无参的构造函数,运行则会出错。