构造器是什么?(Java篇)

构造方法的定义:

构造方法也叫构造器或者构造函数

构造方法与类名相同,没有返回值,连void都不能写

构造方法可以重载(重载:方法名称相同,参数列表不同)

如果一个类中没有构造方法,那么编译器会为类加上一个默认的构造方法。

默认构造方法格式如下:

public 类名() {

}

如果手动添加了构造器,那么默认构造器就会消失。

建议代码中将无参构造器写出来。

public class Student {

    public String name;
    public int age;
    
    public void eat() {
        System.out.println("eat....");
    }
    
    //构造器
    /**
     * 名称与类名相同,没有返回值,不能写void
     * 构造器可以重载
     * 如果类中没有手动添加构造器,编译器会默认再添加一个无参构造器
     * 如果手动添加了构造器(无论什么形式),默认构造器就会消失
     */
    public Student() {
        System.out.println("无参构造器");
    }
    
    public Student(int a) {
        System.out.println("一个参数的构造器");
        age = 15;
    }
    
    public Student(int a, String s) {
        System.out.println("两个参数的构造器");
        age = a;
        name = s;
    }
}

构造方法的作用:

构造方法在创建对象时调用,具体调用哪一个由参数决定。

构造方法的作用是为正在创建的对象的成员变量赋初值。

public class Test {
    public static void main(String[] args) {
        
        //调用无参构造器
        Student s1 = new Student();
        //调用有参构造器
        Student s2 = new Student(15);
        System.out.println(s2.age);
        Student s3 = new Student(34, "小明");
        System.out.println(s3.name + ":" + s3.age);
    }

}

构造方法种this的使用:

构造方法种可以使用this,表示刚刚创建的对象

构造方法种this可用于

this访问对象属性

this访问实例方法

this在构造方法中调用重载的其他构造方法(要避免陷入死循环)

只能位于第一行

不会触发新对象的创建

public class Student {

    public String name;
    public int age;
    
    public void eat() {
        System.out.println("eat....");
    }
    //构造器
    //使用this()调用重载构造器不能同时相互调用,避免陷入死循环
    public Student() {
        //this()必须出现在构造器的第一行,不会创建新的对象
        this(15);//调用了具有int类型参数的构造器
        System.out.println("默认构造器");
    }
    public Student(int a) {
        this.eat();
        eat();//this.可以省略
    }
    //this在构造器中表示刚刚创建的对象
    public Student(int a, String s) {
        System.out.println("两个参数的构造器");
        this.age = a;
        this.name = s;
    }
}
public class Test {

    public static void main(String[] args) {
        Student s1 = new Student(15, "小明");
        System.out.println(s1.name + ":" + s1.age);
        Student s2 = new Student(12, "小红");
        System.out.println(s2.name + ":" + s2.age);
        
        Student s3 = new Student();
    }
}

归纳this在实例方法和构造方法种的作用

this是java多态的体现之一

this只可以在构造方法和实例方法种存在,不能出现在static修饰的方法或代码块中

this在构造方法中表示刚刚创建的对象

this在实例方法种表示调用改方法的对象

this可以在实例方法和构造方法中访问对象属性和实例方法

this有时可以省略

this可以在实例方法中作为返回值

this可以当作实参

this可调用重载的构造方法


一.构造方法的定义声明
构造方法的名字必须和所在类的名字一致,没有返回值,但不能声明void,访问权限可以为任意,但是一般情况下使用public方法权限,构造方法中的参数可以根据需要自行定义,参数的不同的构造方法构成重载;

例:

class Fu

   {

 

public Fu(){} //无参的公有构造方法

 public Fu(int i){} //参数类型为int的公有构造方法

 ......

   }



   public class Demo extends Fu

   {

     public Demo(){} //无参的公有构造方法

     public Demo(int i){} //参数类型为int的公有构造方法

     public Demo(int i,double d){} //参数类型为int和double的公有构造方法

     ...

   }

二.构造方法的使用
java中构造方法的使用有两个地方,一个是跟在关键字new后面,类名加上一个小括号(),小括号内根据实际加上实参,另外一个是跟在关键字super或this后加上一个小括号(),小括号内根据实际添加实参,下面进行举例。

例1:

Demo demo = new Demo(); //这里是调用的是一个无参的构造方法,必须声明在方法中,最好声明在主方法

上面构造方法的参数根据实际添加实参,jvm根据构造方法的参数不同加载不同的构造方法;

例2:

public Demo(){

   this(2); //这里调用参数为int类型的本类的构造方法

 }

例3:

 public Demo(){

   super(1); //调用参数为int类型的父类的构造方法

 }

注意:例2和例3中this或super调用构造方法只能出现在构造方法中,而且必须出现在第一行,所以一个构造方法中第一行只能为this或super调用构造方法,两者不能同时调用构造方法出现,而且注意this或super调用构造方法时,要留构造方法出口,意思就是最后调用的构造方法中没有再调用别的构造方法!

三.构造方法的作用
1.为了初始化成员属性,而不是初始化对象,初始化对象是通过new关键字实现的

2.通过new调用构造方法初始化对象,编译时根据参数签名来检查构造函数,称为静态联编和编译多态
(参数签名:参数的类型,参数个数和参数顺序)

3.创建子类对象会调用父类构造方法但不会创建父类对象,只是调用父类构造方法初始化父类成员属性;

我总是要把构造器和方法混淆,后来发现,

方法,实际上,是需要用于执行java代码的,而构造器,

构造器,,,是一个类的实例!!

为什么呢?

类的实例,我们需要用类来创建对象,进而访问其属性,因为实例是需要被用来调用的,但是调用的话,我们不得不去考虑一个问题,就是对象,最终是被存储在内存里面的,而存储的时候,我们的内存不得不需要给他再另外开辟新的内存空间,那么,java是如何给这种我们所需要的类来开辟内存空间的呢?这就涉及到了java的内存机制,就是说,我们必须要给这个类制作一个构造器,而且这个构造器的名称必须和这个类的名称是一致的,这样,我们的java编译器才能识别这个类,进而给这个类在内存中开辟内存空间,也就是我们所说的,我们手动,人为的给他进行“初始化”,事例如下:

class Rock {

    Rock() {

      System.out.print("Rock");

    }

  }

这样,当我们在对Rock类进行调用的时候,我们的java编译器就会事先对他进行“自动”地初始化,开辟内存空间

那么现在问题又来了,举个例子,我们的Rock()方法需要带有一个参数,形参,但是整个代码中,需要不仅仅是带有形参的Rock();还需要不带形参的Rock(),在我们的构造器对类进行构造的时候,需要将功能类似的,但形参不同的方法同时打包在该类下,以便在我们调用某个方法的时候,直接重载构造器中的该方法,可以说,这种构造形式,满足了我们对功能类似,形参不同的方法,调用的时候,进行重载,而满足了编译器自动初始化,人不需要手动初始化的需求。

而且有个,问题,本来两个方法,功能上是类似的,一棵树和一株树苗,你非得要给他们起不同的名字,多别扭,好在有了构造器,能够是功能相似的方法起相同的名字,不同的参数,而能够在被调用的时候得以重载,多么牛逼的构造器 啊

  • 11
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 构造器也称之为构造方法或构造函数,是用来构造一个类的实例并确保对象初始化的方法。它的格式是权限修饰符 类名(参数列表) {}。根据有无参数,构造器可以分为有参和无参构造函数。构造器的主要作用是初始化对象,创建一个对象时系统会自动根据对象实例进行默认初始化,如果想要改变默认初始化,可以通过自定义构造器来实现。一个类可以有多个构造器,但构造器的名称必须与类名一致。\[3\] 构造器与一般方法的区别在于,构造方法必须与类名一致,没有返回值,甚至连void都没有。Java编译器会自动创建无参构造函数,如果类中没有手动添加构造器,编译器会默认再添加一个无参构造器。但如果手动添加了构造器,无论是有参还是无参,编译器就不会再提供默认的无参构造器,实例化对象时需要赋值,否则会报错。构造器不可以被static、final、synchronized、abstract和native修饰,而且构造方法不会被子类继承。每一个类可以有多个构造方法。\[1\]\[2\] 举个例子,如果有一个学生类,可以定义无参构造器来创建一个学生对象,也可以定义有参构造器来在创建对象的同时初始化学生的姓名和年龄。无参构造器可以省略不写,因为编译器会自动添加一个无参构造器。\[3\] 示例一:学生类-无参构造 ```java public class Student { public String name; public int age; public Student() { System.out.println("括号内无参数,这就是无参构造"); } } ``` 示例二:学生类-有参构造 ```java public class Student { public String name; public int age; public Student(String n, int a) { name = n; age = a; } } ``` 在示例二中,我们定义了一个有参构造器,可以在创建学生对象时传入姓名和年龄来初始化学生对象的属性。\[3\] 总结来说,构造器是用来构造对象并初始化对象的方法,它的特点是方法名与类名一致,没有返回值,可以有多个构造器,但必须有不同的参数列表。\[3\] #### 引用[.reference_title] - *1* *2* [构造器是什么?(Java)](https://blog.csdn.net/qq_43511405/article/details/104903989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java构造器概述](https://blog.csdn.net/qq_42544728/article/details/125766702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值