Java中的构造函数——完整指南
构造函数是初始化新创建的对象的代码块。构造函数类似于java中的实例方法,但它不是方法,因为它没有返回类型。简而言之,构造函数和方法是不同的。在Java中,人们经常将构造函数称为一种特殊类型的方法。
构造函数和类的名称相同,在java代码中看起来像这样。
public class MyClass{
//This is the constructor
MyClass(){
}
..
}
请注意,构造函数名称与类名相同,并且没有返回类型。
1.构造函数是如何工作的?
为了理解构造函数的工作,让我们举一个例子。假设我们有一个类MyClass。
当我们像这样创建MyClass的对象时:
MyClass obj=new MyClass()
这里的new关键字创建类MyClass的对象,并调用构造函数来初始化这个新创建的对象。
您可能会有点迷失在这里,因为我没有向您展示任何初始化示例,让我们看看下面的代码:
2.一个简单的java构造函数程序。
在这里,我们已经创建了Hello类的对象obj,然后我们显示了该对象的实例变量名。
正如您所看到的,输出是BeginnersBook.com,这是我们在构造函数初始化期间传递给名称的内容。这表明,当我们创建对象obj时,构造函数被调用了。
在本例中,我们使用了这个关键字,它指的是当前对象,即本例中的对象obj。我们将在下一个教程中详细介绍这个关键字。
public class Hello {
String name;
//Constructor
Hello(){
this.name = "BeginnersBook.com";
}
public static void main(String[] args) {
Hello obj = new Hello();
System.out.println(obj.name);
}
}
3.结构类型
构造函数有三种类型:默认构造函数、无参数构造函数和参数化构造函数。
没有arg构造函数:
没有参数的构造函数称为无参数构造函数。签名与默认构造函数相同,但主体可以有任何代码,这与默认构造函数不同,默认构造函数的主体为空。
虽然你可能会看到一些人声称默认构造函数和无参数构造函数是相同的,但事实上它们不是,即使你在类Demo中编写了公共Demo(){},它也不能被称为默认构造函数,因为你已经编写了它的代码。
示例:没有arg构造函数
class Demo
{
public Demo()
{
System.out.println("This is a no argument constructor");
}
public static void main(String args[]) {
new Demo();
}
}
参数化构造函数
带参数的构造函数(也可以说是参数化构造函数)被称为参数化构造函数。
示例:参数化构造函数
在这个例子中,我们有一个参数化构造函数,它有两个参数id和name。在创建对象obj1和obj2时,我传递了两个参数,以便在创建obj1或obj2之后调用此构造函数。
public class Employee {
int empId;
String empName;
//parameterized constructor with two parameters
Employee(int id, String name){
this.empId = id;
this.empName = name;
}
void info(){
System.out.println("Id: "+empId+" Name: "+empName);
}
public static void main(String args[]){
Employee obj1 = new Employee(10245,"Chaitanya");
Employee obj2 = new Employee(92232,"Negan");
obj1.info();
obj2.info();
}
}
示例2:参数化构造函数
在这个例子中,我们有两个构造函数,一个默认构造函数和一个参数化构造函数。当我们在使用new关键字创建对象时不传递任何参数时,将调用默认构造函数,但当您传递参数时,会调用与传递的参数列表匹配的参数化构造函数。
class Example2
{
private int var;
//default constructor
public Example2()
{
this.var = 10;
}
//parameterized constructor
public Example2(int num)
{
this.var = num;
}
public int getValue()
{
return var;
}
public static void main(String args[])
{
Example2 obj = new Example2();
Example2 obj2 = new Example2(100);
System.out.println("var is: "+obj.getValue());
System.out.println("var is: "+obj2.getValue());
}
}
如果在类中只实现参数化构造函数会怎样
class Example3
{
private int var;
public Example3(int num)
{
var=num;
}
public int getValue()
{
return var;
}
public static void main(String args[])
{
Example3 myobj = new Example3();
System.out.println("value of var is: "+myobj.getValue());
}
}
输出:它将引发编译错误。原因是,语句Example3 myobj=new Example3()正在调用程序中没有的默认构造函数。
当你在类中没有实现任何构造函数时,在编译过程中会向类中添加一个默认构造函数,但当你实现任何构造函数(在上面的例子中,我用int参数实现了参数化构造函数)时,编译器不会将默认构造函数接收到代码中。
如果我们从上面的代码中删除参数化构造函数,那么程序将运行良好,因为编译器会将默认构造函数插入到代码中。
构造函数链接
当一个构造函数调用同一类的另一个构造函数时,这被称为构造函数链接。在上图中,您可以看到默认构造函数在内部调用具有字符串参数的构造函数,此构造函数再次调用具有两个参数的不同构造函数。这是构造函数链接的一个示例。