JAVA的构造方法
1.构造函数的概念
构造函数是函数的一种特殊形式,特殊在哪里?构造函数中不需要定义返回类型(void是无需返回值的意思,请注意区分两者),且构造函数的名称与所在的类名完全一致,其余的与函数的特性相同,可以带有参数列表,可以存在函数的重载现象。
2.构造函数的格式
如果在类中我们不声明构造函数,JVM会帮我们默认生成一个空参数的构造函数;
如果在类中我们声明了带参数列表的构造函数,JVM就不会帮我们默认生成一个空参数的构造函数,我们想要使用空参数的构造函数就必须自己去显式的声明一个空参的构造函数。
构造方法不能有返回值,即不能有return
public class Demo { private int num = 0; // 无参构造函数 Demo() { System.out.println("constractor_run"); } // 有参构造函数 Demo(int num) { System.out.println("constractor_args_run"); } // 普通成员函数 public void demoFunction() { System.out.println("function_run"); } }
注意:这个类里面好像有多个构造函数,其实不然,这是把构造函数重载了多次。
构造方法重载的好处:我扔进来是什么样的参数,程序就会自动找到相对应的构造方法去执行。这样构造函数就能实现很多功能了。否则一个功能写一个类,多麻烦啊。
3.构造函数的作用
(1) 创建对象。任何一个对象创建时,都需要初始化才能使用,所以任何类想要创建实例对象就必须具有构造函数。
(2)对象初始化。构造函数可以对对象进行初始化,并且是给与之格式(参数列表)相符合的对象初始化,是具有一定针对性的初始化函数。
总之:构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化,new对象就是在调用构造方法,跟之前的.调用方法不同
public class Demo1 { private String name; // 有参数的构造函数 public Demo1(String name) { this.name = name; } public static void main(String[] args) { // new一个对象,传参,调用构造函数 Demo1 demo1 = new Demo1("Vissss"); System.out.println(demo1.name); } }
运行结果:
这就说明在我们创建Demo1对象的时候,会自动调用构造函数完成初始化,这时程序中的name属性就成了Vissss。
上面说到构造函数是为了在new对象传入参数后完成属性的初始化,也许有些人不解,为什么我程序中不写构造函数依然可以完成初始化。
- 如果你不写构造函数,程序会自动给你加上一个无参数无操作的构造函数(当然你看不见)。
- 如果你写了构造函数,则自定义构造函数会覆盖无参数构造函数。
- 如果你写的构造函数中不存在无参数的构造函数,将不能以 new XXX("");这样传参的方式生成该类的对象(当然你也可以生成对象后通过他们的set、get方法进行赋值。)
public class Test { private String name; //不提供构造函数 public static void main(String[] args) { //new一个对象,传参,调用构造函数 Test test=new Test("VipMao"); System.out.println(test.name); }
这个例子在创建对象并赋值的时候,程序会报错:
The constructor Test(String) is undefined,构造函数是没有定义的。
也就是说如果程序员没有为JAVA类提供任何构造器,则系统会为这个类提供一个无参数的构造器,这个构造器的执行体为空,不做任何事情。
无论如何,JAVA类至少包含一个构造器,如果你提供了多个构造函数(参数不同),则程序会根据你传入参数的不同调用不同的构造函数。
4.构造函数与普通函数的区别
(1)格式不同:
构造函数不存在返回类型,函数名与所在类的类名一致;
普通函数有返回类型,函数名可以根据需求进行命名。
(2)调用时期不同
构造函数在类的对象创建时就运行;
普通函数在对象调用时才会执行。
(3)执行次数不同
一个对象创建后,其构造函数只执行一次,就是创建时执行;
一个对象创建后,其普通函数可以执行多次,取决于对象的调用次数。
5.构造函数的使用场景
分析了那么多构造函数的信息,那么什么时候使用构造函数呢?
既然构造函数是对新对象进行初始化,那么当开发中分析事物的时候,发现事物一出现就具备了某些特征时,就可以将其定义在构造函数中,这样方便快捷,也符合面向对象的编程思想。
6.构造方法与静态代码块谁先执行?
静态代码块的特点是,当第一次执行本类的时候,静态代码块执行唯一的一次
静态内容总是优先于非静态,所以静态代码块比构造方法先执行
静态代码块的作用:
用来一次性对静态成员变量进行赋值
public class MyClass1 { static { System.out.println("静态代码块执行"); } public MyClass1() { System.out.println("构造方法执行"); } }
public class Demo2Static { public static void main(String[] args) { MyClass1 c = new MyClass1(); MyClass1 c1 = new MyClass1(); } }
运行结果:
参考:
java 为什么有时一个类有多个构造函数 https://www.cnblogs.com/baxianhua/p/12167980.html
https://juejin.im/entry/6844903478234447886
https://blog.csdn.net/VipMao/article/details/51530954