关于JAVA构造函数如何理解?

写在开头

  • 小编作为一名JAVA萌新,学到类和对象的时候感到有点吃力了。还好在网上找到了非常好的视频,通过一个个具体的需求编程实现,生动形象的讲解了类和对象的含义及使用。但是在理解构造函数的时候又开始范起迷糊来,为了加深自己的理解,亲自动起手来做几个构建函数的实验。

JAVA的构建函数是什么?

  • **百度百科上给的定义:**构造函数是一种特殊的函数。其主要功能是用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。构造函数与类名相同,可重载多个不同的构造函数。在JAVA语言中,构造函数与C++语言中的构造函数相同,JAVA语言中普遍称之为构造方法。
  • 构造函数的基本特点:
    • 1、构造函数的函数名和类名相同
      • 解读:如果函数名和类名不同,编译的时候这函数会被计算机理解为成员函数,编译器会按照成员函数的语法要求这个函数,比如需要给出返回值得数据类型。
    • 2、构造函数没有返回值,函数体中不能写return语句。
      • 解读:但不等同于返回值为空,如果你试图在构造函数前加void,编译就会出错。
    • 3、 构造函数使用来初始化类的,当使用new新建一个对象时,构造函数会自动执行,而且构造函数也仅在对象被创建的时候执行一次,不像其他成员函数可以被多次调用。
      • 解读:因为构造函数是用来初始化类的,所以任何一个类都会有构造函数。构造函数分为显是(explict)和隐式(implict)的,如果一个类未定义构造函数,系统会给该类中默认添加一个空参的构造函数,这个默认的构造函数在代码里是看不到的。
    • 4、构造函数不可以被继承
      • 解读:构造函数的名称必须和类名相同,而子类的名称和父类名不同,所以即使子类继承了构造函数也无意义。所以子类要写自己的构造函数或者由系统默认分配一个构造函数。
    • 5、子类对象初始化时,补单会执行子类的构造函数,父类的构造函数同时也会被执行。
    • 解读:父类的构造函数可能有如下几种情况:a)父类没有明确写出构造函数,由系统默认分配一个无参的构造函数;b)父类中显式的写出了一个或多个构造函数。无论是哪种情况,在编写子类的构造函数时,设计者要指明执行父类的哪一个构造函数。如何理解呢?看下面的代码。
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();
	}
}

子类中构造函数都没有写,由系统默认分配一个构造函数时,情况会怎么样呢?朋友们应该已经想到了,此时会默认执行父类中无参的构造函数,执行结果:
在这里插入图片描述
总结一下:子类被对象初始化时,会运行子类的构造函数,子类构造函数中指明了运行父类中哪个构造函数,父类中相应的构造函数就会被执行,如果子类中没有指明父类的狗函数,那么会执行父类中无参的构造函数,如果此时父类中没有无参的构造函数,运行则会出错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值